TCP/IP五層網絡結構模型
物理層:物理層建立在物理通信介質的基礎上,作為系統和通信介質的接口,用來實現數據鏈路實體間透明的比特 (bit) 流傳輸。只有該層為真實物理通信,其它各層為虛擬通信
數據鏈路層:在物理層提供比特流服務的基礎上,建立相鄰結點之間的數據鏈路,通過差錯控制提供數據幀(Frame)在信道上無差錯的傳輸,并進行各電路上的動作系列。數據的單位稱為幀(frame)
網絡層:選擇合適的路由,使數據分組(packet)可以交付到目的主機
傳輸層:負責主機中進程間的通信
應用層:直接為用戶的應用程序提供服務
UDP詳解
以下內容來自wiki - 最英俊的百科全書
用戶數據報協議(英語:User Datagram Protocol,縮寫為UDP),又稱使用者資料包協定,是一個簡單的面向數據報的傳輸層協議,正式規范為RFC 768。
在TCP/IP模型中,UDP為網絡層以上和應用層以下提供了一個簡單的接口。UDP只提供數據的不可靠傳遞
,它一旦把應用程序發給網絡層的數據發送出去,就不保留數據備份(所以UDP有時候也被認為是不可靠的數據報協議)。UDP在IP數據報的頭部僅僅加入了復用和數據校驗(字段)。
UDP的優點
- 無需建立連接(減少延遲)
- 實現簡單:無需維護連接狀態
- 頭部開銷小(最小值為8byte)
- 沒有擁塞控制:應用可以更好的控制發送時間和發送速率
UDP頭部:
UDP的頭部是由源端口號、目標端口號、包長和校驗4個部分組成,其中兩個是可選的。各16bit的來源端口和目的端口用來標記發送和接受的應用進程。因為UDP不需要應答
,所以來源端口是可選的,如果來源端口不用,那么置為零。在目的端口后面是長度固定的以字節為單位的長度域,用來指定UDP數據報包括數據部分的長度,長度最小值為8byte
。首部剩下地16bit是用來對首部和數據部分一起做校驗和(Checksum)的,checksum主要是用來檢測UDP段在傳輸中是否發生了錯誤。還有就是,校驗和計算中也需要計算UDP偽頭部,偽頭部包含IP頭部的一些字段。我們剛才介紹了識別一個通信需要5項信息,而UDP頭部只有端口號,余下的三項在IP頭部,所以引入了偽頭部的概念。(IPv6的IP頭部沒有校驗和字段)
基于UDP協議的有:
- 域名系統(DNS)
- 簡單網絡管理協議(SNMP)
- 動態主機配置協議(DHCP)
- 路由信息協議(RIP)
- 自舉協議(BOOTP)
- 簡單文件傳輸協議(TFTP)
TCP詳解
以下內容來自wiki - 最英俊的百科全書
傳輸控制協議(英語:Transmission Control Protocol)是一種面向連接的、可靠的、基于字節流的傳輸層通信協議,由IETF的RFC 793定義。
在因特網協議族(Internet protocol suite)中,TCP層是位于IP層之上,應用層之下的中間層。不同主機的應用層之間經常需要可靠的、像管道一樣的連接,但是IP層不提供這樣的流機制,而是提供不可靠的包交換。
應用層向TCP層發送用于網間傳輸的、用8位字節表示的數據流,然后TCP把數據流分區成適當長度的報文段(通常受該計算機連接的網絡的數據鏈路層的最大傳輸單元(MTU)的限制)。之后TCP把結果包傳給IP層,由它來通過網絡將包傳送給接收端實體的TCP層。TCP為了保證不發生丟包,就給每個包一個序號,同時序號也保證了傳送到接收端實體的包的按序接收。然后接收端實體對已成功收到的包發回一個相應的確認(ACK);如果發送端實體在合理的往返時延(RTT)內未收到確認,那么對應的數據包就被假設為已丟失將會被進行重傳。TCP用一個校驗和函數來檢驗數據是否有錯誤;在發送和接收時都要計算校驗和
三次握手
TCP用三路握手(three-way handshake)過程創建一個連接。在連接創建過程中,很多參數要被初始化,例如序號被初始化以保證按序傳輸和連接的強壯性。
- 客戶端通過向服務器端發送一個SYN來創建一個主動打開,作為三路握手的一部分。客戶端把這段連接的序號設定為隨機數A。
- 服務器端應當為一個合法的SYN回送一個SYN/ACK。ACK的確認碼應為A+1,SYN/ACK包本身又有一個隨機序號B。
- 最后,客戶端再發送一個ACK。當服務端受到這個ACK的時候,就完成了三路握手,并進入了連接創建狀態。此時包序號被設定為收到的確認號A+1,而響應則為B+1。
TCP狀態編碼
下表為TCP狀態碼列表,以S指代服務器,C指代客戶端,S&C表示兩者,S/C表示兩者之一:[1]
- LISTEN S
等待從任意遠程TCP端口的連接請求。偵聽狀態。 - SYN-SENT C
在發送連接請求后等待匹配的連接請求。通過connect()函數向服務器發出一個同步(SYNC)信號后進入此狀態。 - SYN-RECEIVED S
已經收到并發送同步(SYNC)信號之后等待確認(ACK)請求。 - ESTABLISHED S&C
連接已經打開,收到的數據可以發送給用戶。數據傳輸步驟的正常情況。此時連接兩端是平等的。 - FIN-WAIT-1 S&C
主動關閉端調用close()函數發出FIN請求包,表示本方的數據發送全部結束,等待TCP連接另一端的確認包或FIN請求包。 - FIN-WAIT-2 S&C
主動關閉端在FIN-WAIT-1狀態下收到確認包,進入等待遠程TCP的連接終止請求的半關閉狀態。這時可以接收數據,但不再發送數據。 - CLOSE-WAIT S&C
被動關閉端接到FIN后,就發出ACK以回應FIN請求,并進入等待本地用戶的連接終止請求的半關閉狀態。這時可以發送數據,但不再接收數據。 - CLOSING S&C
在發出FIN后,又收到對方發來的FIN后,進入等待對方對連接終止(FIN)的確認(ACK)的狀態。少見。 - LAST-ACK S&C
被動關閉端全部數據發送完成之后,向主動關閉端發送FIN,進入等待確認包的狀態。 - TIME-WAIT S/C
主動關閉端接收到FIN后,就發送ACK包,等待足夠時間以確保被動關閉端收到了終止請求的確認包。【按照RFC 793,一個連接可以在TIME-WAIT保證最大四分鐘,即最大分段壽命(maximum segment lifetime)的2倍】 - CLOSED S&C
完全沒有連接。
基于TCP實現的協議有
- HTTP/HTTPS,
- Telnet
- FTP
- SMTP
TCP(Transmission Control Protocol)和UDP(User DataGram Protocol)的區別
下面我們主要從連接性(Connectivity)、可靠性(Reliability)、有序性(Ordering)、有界性(Boundary)、擁塞控制(Congestion or Flow control)、傳輸速度(Speed)、量級(Heavy/Light weight)、頭部大小(Header size)等8個方面來對比它們:
- TCP是面向連接(Connection oriented)的協議,UDP是無連接(Connection less)協議;
TCP用三次握手建立連接:1) Client向server發送SYN;2) Server接收到SYN,回復Client一個SYN-ACK;3) Client接收到SYN_ACK,回復Server一個ACK。到此,連接建成。UDP發送數據前不需要建立連接。 - TCP可靠,UDP不可靠;TCP丟包會自動重傳,UDP不會。
- TCP有序,UDP無序;消息在傳輸過程中可能會亂序,后發送的消息可能會先到達,TCP會對其進行重排序,UDP不會。
- TCP無界,UDP有界;TCP通過字節流傳輸,UDP中每一個包都是單獨的。
- TCP有流量控制(擁塞控制),UDP沒有;主要靠三次握手實現。
- TCP傳輸慢,UDP傳輸快;因為TCP需要建立連接、保證可靠性和有序性,所以比較耗時。這就是為什么視頻流、廣播電視、在線多媒體游戲等選擇使用UDP。
- TCP是重量級的,UDP是輕量級的;TCP要建立連接、保證可靠性和有序性,就會傳輸更多的信息,如TCP的包頭比較大。
- TCP的頭部比UDP大;TCP頭部需要20字節,UDP頭部只要8個字節