TCP、UDP、IP 協議分析

所謂協議就是雙方進行數據傳輸的一種格式。早期互聯網使用的是NCP協議,這種協議本身有很多缺陷,爲了改進缺陷,大牛們弄出了TCP/IP協議。現在幾乎所有的操作系統都實現了TCP/IP協議棧。

TCP/IP 協議棧主要分爲四層:應用層、傳輸層、網絡層、數據鏈路層,每一層都有對應的協議

wKiom1mqHdWzyM5mAAIphosHtdc227.png-wh_50

Linux操作系統中,當我們想發送數據的時候,我們只需要在上層準備好數據,在發送數據的過程中,經過各層的時候會加上各層協議的頭部信息。下面讓我們來看一看每一層添加的協議頭的具體內容。

一、TCP協議

TCP協議是面向連接、保證高可靠性(數據無丟失、數據無失序、數據無錯誤、數據無重複到達)傳輸層協議。

1.TCP頭分析

先來分析一下TCP頭的格式以及每一個字段的含義:

wKiom1mqHm7CIxmJAAEMc45J1zI208.png-wh_50

1)端口號

我們知道,網絡實現的是不同主機的進程間通信。在一個操作系統中,有很多進程,當數據到來時要提交給哪個進程進行處理呢?這就需要用到端口號。在TCP頭中,有源端口號(Source Port)和目標端口號(Destination Port)。源端口號標識了發送主機的進程,目標端口號標識接受方主機的進程。源端口和目標端口是用16位表示的,可以推算計算機的端口號有2^16

2)序列號:表示本報文段所發送數據的第一個字節的編號。在TCP連接中所傳送的字節流的每一個字節都會按順序編號。由於序列號由32位表示,所以每2^32個字節,就會出現序列號迴繞,再次從0 開始

3確認號:表示接收方期望收到發送方下一個報文段的第一個字節數據的編號。也就是告訴發送發:我希望你(指發送方)下次發送的數據的第一個字節數據的編號是這個確認號

4數據偏移:表示TCP報文段的首部長度,共4位,由於TCP首部包含一個長度可變的選項部分,需要指定這個TCP報文段到底有多長。它指出TCP 報文段的數據起始處距離TCP 報文段的起始處有多遠。該字段的單位是32(4個字節爲計算單位),4位二進制最大表示15,所以數據偏移也就是TCP首部最大60字節

5)保留位:暫時未使用

6)標誌:在TCP首部中有6個比特位。它們中的多個可同時設爲1

URG     緊急指針(urgent pointer)有效

ACK      確認序號有效

PSH    指示接收方應該儘快將這個報文段交給應用層而不用等待緩衝區裝滿

RST     一般表示斷開一個連接

SYN       同步序號用來發起一個連接

FIN         發送端完成發送任務(即斷開連接)

7)窗口大小;表示源方法最多能接受的字節數

8)校驗和:提供額外的可靠性

9)緊急指針:只有當URG標誌位值爲1時纔有效

10)選項部分:常見選項:最大報文長度,窗口擴大,時間戳等

二、重點詳解

1TCP建立連接時的三次握手

所謂三次握手就是說在建立一個TCP連接時,需要客戶端和服務器端總共發送三個包以確認連接的建立。

wKioL1mqHrmh1DAYAATV713SQcQ909.png-wh_50

1)第一次握手:客戶端將發送一個將SYN標誌位設爲1,在客戶端序列號爲x的數據包給服務器端,並進入SYN-SENT 狀態,等待服務器端的確認

2)第二次握手:服務器端在收到數據包後,有數據包上SYN=1知道客戶端請求連接,服務器端將會發送一個      SYNACK 標誌位值均爲1且在服務器端序號爲y的數據包,ack=1表示希望客戶端下次發送第x+1個包,間接說明服務器收到了第x個數據包。客戶端進入SYN-REVD狀態。

3)第三次握手:客戶端在收到服務器發送的確認包後,檢查ACK是否爲1 ack是否爲x+1,如果正確,將發送一個ACK標誌位值爲1ack=y+1的數據包給服務器端,服務器檢查ack是否爲y+1ACK是否爲1,如果正確將完成三次握手,客戶端和服務器端進入ESTABLISHED狀態,隨後就可以傳輸數據了。

注:

(A)不要將確認序號ack與標誌位中的ACK搞混

(B)確認方ack=發起方的序列號+1 ,兩端配對

 2.四次揮手斷開連接

所謂四次揮手即終止TCP連接,就是斷開一個TCP連接時,需要客戶端和服務器端總共發送四個包來確認斷開。

wKiom1mqIADDsmG-AAXXfBUWYEw197.png-wh_50

1)第一次揮手:客戶端一個標誌位爲1的數據包,用來關閉客戶端到服務器端的數據傳送,客戶端進入FIN_WAIT_1狀態。

2)第二次揮手:服務器端在收到一個標誌FIN=1的數據包後,會發送一個標誌ACK=1的數據包給客戶端,,服務器進入CLOSE_WAIT狀態,客戶端在收到數據包之後進入。FIN_WAIT_2 狀態

3)第三次揮手:在第二次揮手之後,服務器端會接着給客戶端傳輸沒有傳完的數據,在數據傳輸結束之後,服務器端會給客戶端發送一個標誌位FIN=1的數據包,用來關閉服務器端到客戶端的數據傳送,隨後服務器進入LAST_ACK狀態。

4第四次揮手:客戶端在收到FIN之後,進入TIME_WAIT狀態,接着會發送一個ACK給服務器,服務器會進去CLOSED狀態,完成第四次揮手。

  注:服務器不能長時間處於CLOSED狀態,在一次連接結束之後,服務器會快速進入LIATEN狀態,等待下一個服務連接。

3TCP在建立連接和斷開連接過程中涉及到的幾種狀態:

CLOSED 沒有任何連接狀態。

             LISTEN偵聽狀態,等待來自遠方TCP端口的連接請求。

             SYN-SENT在發送連接請求後,等待對方確認。

             SYN-RECEIVED在收到和發送一個連接請求後,等待對方確認。

             ESTABLISHED代表傳輸連接建立,雙方進入數據傳送狀態。

             FIN-WAIT-1主動關閉,主機已發送關閉連接請求,等待對方確認。

             FIN-WAIT-2主動關閉,主機已收到對方關閉傳輸連接確認,等待對方發送關閉傳輸連接請求。

             TIME-WAIT完成雙向傳輸連接關閉,等待所有分組消失。

             CLOSE-WAIT被動關閉,收到對方發來的關閉連接請求,並已確認

             LAST-ACK被動關閉,等待最後一個關閉傳輸連接確認,並等待所有分組消失。

             CLOSING雙方同時嘗試關閉傳輸連接,等待對方確認。

4、有限狀態機

客戶端先發送一個FIN給服務端,自己進入了FIN_WAIT_1狀態,這時等待接收服務端的報文,該報文會有三種可能:

             只有服務端的ACK

             只有服務端的FIN

             基於服務端的ACK,又有FIN

             1)、只收到服務器的ACK,客戶端會進入FIN_WAIT_2狀態,後續當收到服務端的FIN時,迴應發送一個ACK,會進入到TIME_WAIT狀態,這個狀態會持續2MSL(TCP報文段在網絡中的最大生存時間, RFC 1122標準的建議值是2min).客戶端等待2MSL,是爲了當最後一個ACK丟失時,可以再發送一次。因爲服務端在等待超時後會再發送一個FIN給客戶端,進而客戶端知道ACK已丟失。

           2)、只有服務端的FIN時,迴應一個ACK給服務端,進入CLOSING狀態,然後接收到服務端的ACK時,進入TIME_WAIT狀態。

             3)、同時收到服務端的ACKFIN,直接進入TIME_WAIT狀態。

三、UDP協議

UDP也是傳輸層的協議,它是無連接,不保證可靠的傳輸層協議。它的協議頭部比較簡單,如下:wKiom1mqIJWgfdVmAAELX4Ox9QY716.png-wh_50

這裏的端口號跟TCP的端口號是一樣的意義,就不解釋了

Length佔了兩個字節,用來表示UDP的長度。

Checksum:校驗和。

四、IP協議

IP協議是工作在網絡層的協議,所有的TCPUDPICMPIGMP數據以數據包個格式傳輸。它的特點如下:

不可靠:它不能保證IP數據包能成功到達目的地,IP僅提供最好的傳輸服務,無數據恢復功能。

無連接:獨立處理數據包,也就是說IP數據包可以不按發送順序接收。如果一信源向相同的信宿發送兩個連續的數據報(先是 A,然後是B,每個數據報都是獨立地進行路由選擇,可能選擇不同的路線,因此B可能在A到達之前先到達。

wKiom1mqINDSaZOQAAHJfMTwuI4909.png-wh_50


(1)版本 佔4位,指IP協議的版本。通信雙方使用的IP協議版本必須一致。目前廣泛使用的IP協議版本號爲4(即IPv4)。關於IPv6,目前還處於草案階段。 

(2)首部長度 佔4位,可表示的最大十進制數值是15。請注意,這個字段所表示數的單位是32位字長(132位字長是4字節),因此,當IP的首部長度爲1111時(即十進制的15),首部長度就達到60字節。當IP分組的首部長度不是4字節的整數倍時,必須利用最後的填充字段加以填充。因此數據部分永遠在4字節的整數倍開始,這樣在實現IP協議時較爲方便。首部長度限制爲60字節的缺點是有時可能不夠用。但這樣做是希望用戶儘量減少開銷。最常用的首部長度就是20字節(即首部長度爲0101),這時不使用任何選項。 

(3)區分服務 佔8位,用來獲得更好的服務。這個字段在舊標準中叫做服務類型,但實際上一直沒有被使用過。1998IETF把這個字段改名爲區分服務DS(Differentiated Services)。只有在使用區分服務時,這個字段才起作用。 

(4)總長度 總長度指首部和數據之和的長度,單位爲字節。總長度字段爲16位,因此數據報的最大長度爲216-1=65535字節。 

IP層下面的每一種數據鏈路層都有自己的幀格式,其中包括幀格式中的數據字段的最大長度,這稱爲最大傳送單元MTU(Maximum Transfer Unit)。當一個數據報封裝成鏈路層的幀時,此數據報的總長度(即首部加上數據部分)一定不能超過下面的數據鏈路層的MTU值。 

(5)標識(identification) 佔16位。IP軟件在存儲器中維持一個計數器,每產生一個數據報,計數器就加1,並將此值賦給標識字段。但這個“標識”並不是序號,因爲IP是無連接服務,數據報不存在按序接收的問題。當數據報由於長度超過網絡的MTU而必須分片時,這個標識字段的值就被複制到所有的數據報的標識字段中。相同的標識字段的值使分片後的各數據報片最後能正確地重裝成爲原來的數據報。 

(6)標誌(flag) 佔3位,但目前只有2位有意義。 

A、標誌字段中的最低位記爲MF(More Fragment)MF=1即表示後面“還有分片”的數據報。MF=0表示這已是若干數據報片中的最後一個 

B、標誌字段中間的一位記爲DF(Dont Fragment),意思是“不能分片”。只有當DF=0時才允許分片。 

(7)片偏移 佔13位。片偏移指出:較長的分組在分片後,某片在原分組中的相對位置。也就是說,相對用戶數據字段的起點,該片從何處開始。片偏移以8個字節爲偏移單位。這就是說,每個分片的長度一定是8字節(64位)的整數倍。 

(8)生存時間 佔8位,生存時間字段常用的的英文縮寫是TTL(Time To Live),表明是數據報在網絡中的壽命。由發出數據報的源點設置這個字段。其目的是防止無法交付的數據報無限制地在因特網中兜圈子,因而白白消耗網絡資源。最初的設計是以秒作爲TTL的單位。每經過一個路由器時,就把TTL減去數據報在路由器消耗掉的一段時間。若數據報在路由器消耗的時間小於1秒,就把TTL值減1。當TTL值爲0時,就丟棄這個數據報。 

(9)協議 佔8位,協議字段指出此數據報攜帶的數據是使用何種協議,以便使目的主機的IP層知道應將數據部分上交給哪個處理過程。 

(10)首部檢驗和 佔16位。這個字段只檢驗數據報的首部,但不包括數據部分。這是因爲數據報每經過一個路由器,路由器都要重新計算一下首部檢驗和(一些字段,如生存時間、標誌、片偏移等都可能發生變化)。不檢驗數據部分可減少計算的工作量。 

(11)IP地址 佔32位。 

(12)目的IP地址 佔32

五、附註

  關於三次握手與四次揮手通常都會有典型的面試題,

  1)三次握手是什麼或者流程?四次握手呢?答案前面分析就是。

  2)爲什麼建立連接是三次握手,而關閉連接卻是四次揮手呢?

  這是因爲服務端在LISTEN狀態下,收到建立連接請求的SYN報文後,把ACKSYN放在一個報文裏發送給客戶端。而關閉連接時,當收到對方的FIN報文時,僅僅表示對方不再發送數據了但是還能接收數據,己方也未必全部數據都發送給對方了,所以己方可以立即close,也可以發送一些數據給對方後,再發送FIN報文給對方來表示同意現在關閉連接,因此,己方ACK和FIN一般都會分開發送

 




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章