TCP、UDP、IP 協議分析

http://rabbit.xttc.edu.cn/rabbit/htm/artical/201091145609.shtml 

http://bhsc881114.github.io/2015/06/23/HTTP%E8%AF%B7%E6%B1%82%E7%9A%84TCP%E7%93%B6%E9%A2%88%E5%88%86%E6%9E%90/ html

TCP選項詳解:http://blog.csdn.net/sunshine_okey/article/details/7613286 

互連網早期的時候,主機間的互連使用的是NCP協議。這種協議自己有不少缺陷,如:不能互連不一樣的主機,不能互連不一樣的操做系統,沒有糾錯功能。爲了改善這種缺點,大牛弄出了TCP/IP協議。如今幾乎全部的操做系統都實現了TCP/IP協議棧。git


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

所謂的協議就是雙方進行數據傳輸的一種格式。整個網絡中使用的協議有不少,所幸的是每一種協議都有RFC文檔。在這裏只對IP、TCP、UDP協議頭作一個分析。

首先來看看在網絡中,一幀以太網數據包的格式:


在Linux 操做系統中,當咱們想發送數據的時候,咱們只須要在上層準備好數據,而後提交給內核協議棧 , 內核協議棧自動添加相應的協議頭。
下面咱們來看看,每一層添加的協議頭具體內容。


一. TCP協議

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

1.TCP頭分析

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


(1)端口號[16bit]

咱們知道,網絡實現的是不一樣主機的進程間通訊。在一個操做系統中,有不少進程,當數據到來時要提交給哪一個進程進行處理呢?這就須要用到端口號。在TCP頭中,有源端口號(Source Port)和目標端口號(Destination Port)。源端口號標識了發送主機的進程,目標端口號標識接受方主機的進程。

(2)序號[32bit]

序號分爲發送序號(Sequence Number)和確認序號(Acknowledgment Number)。

發送序號:用來標識從 TCP源端向 TCP目的端發送的數據字節流,它表示在這個報文段中的第一個數據字節的順序號。若是將字節流看做在兩個應用程序間的單向流動,則 TCP用順序號對每一個字節進行計數。序號是 32bit的無符號數,序號到達 2  32- 1後又從 0開始。當創建一個新的鏈接時, SYN標誌變 1,順序號字段包含由這個主機選擇的該鏈接的初始順序號 ISN( Initial Sequence Number)。

確認序號:包含發送確認的一端所指望收到的下一個順序號。所以,確認序號應當是上次已成功收到數據字節順序號加 1。只有 ACK標誌爲 1時確認序號字段纔有效。 TCP爲應用層提供全雙工服務,這意味數據能在兩個方向上獨立地進行傳輸。所以,鏈接的每一端必須保持每一個方向上的傳輸數據順序號。

(3)偏移[4bit]

這裏的偏移實際指的是TCP首部的長度,它用來代表TCP首部中32 bit字的數目,經過它能夠知道一個TCP包它的用戶數據是從哪裏開始的。這個字段佔4bit,如4bit的值是0101,則說明TCP首部長度是5 * 4 = 20字節。 因此TCP的首部長度最大爲15 * 4 = 60字節。然而沒有可選字段,正常長度爲20字節。

(4)Reserved [6bit]

目前沒有使用,它的值都爲0

(5)標誌[6bit]

在TCP首部中有6個標誌比特。他們中的多個可同時被置爲1 。

URG         緊急指針(urgent pointer)有效
ACK          確認序號有效
PSH          指示接收方應該儘快將這個報文段交給應用層而不用等待緩衝區裝滿

RST           通常表示斷開一個鏈接
例如:一個TCP的客戶端向一個沒有監聽的端口的服務器端發起鏈接,wirshark抓包以下



能夠看到host:192.168.63.134向host:192.168.63.132發起鏈接請求,可是host:192.168.63.132並無處於監聽對應端口的服務器端,這時
host : 192.168.63.132發一個RST置位的TCP包斷開鏈接。

SYN          同步序號用來發起一個鏈接
FIN            發送端完成發送任務(即斷開鏈接)

(6)窗口大小(window)[16bit]

窗口的大小,表示源方法最多能接受的字節數。。

(7)校驗和[16bit]

校驗和覆蓋了整個的TCP報文段:TCP首部和TCP數據。這是一個強制性的字段,必定是由發端計算和存儲,並由收端進行驗證。

(8)緊急指針[16bit]

只有當URG標誌置爲1時緊急指針纔有效。緊急指針是一個正的偏移量,和序號字段中的值相加表示緊急數據最後一個字節的序號。TCP的緊急方式是發送端向另外一端發送緊急數據的一種方式。

(9)TCP選項

是可選的,在後面抓包的時候,咱們在看看它

2.重點詳解

(1)三次握手創建鏈接

a.請求端(一般稱爲客戶)發送一個SYN段指明客戶打算鏈接的服務器的端口,以及初始序號(ISN,在這個例子中爲1415531521)。這個SYN段爲報文段1。

b.服務器發回包含服務器的初始序號的SYN報文段(報文段2)做爲應答。同時,將確認序號設置爲客戶的ISN加1以對客戶的SYN報文段進行確認。一個SYN將佔用一個序號

c.客戶必須將確認序號設置爲服務器的ISN加1以對服務器的SYN報文段進行確認(報文段3)

這三個報文段完成鏈接的創建。這個過程也稱爲三次握手(three-way handshake)


用wirshark抓包以下:


能夠看到三次握手肯定了雙方間包的序號、最大接受數據的大小(window)以及MSS(Maximum Segment Size)。

MSS = MTU - IP頭 - TCP頭,MTU表示最大傳輸單元,咱們在IP頭分析的時候會講到,它通常爲1500個字節。IP頭和TCP 頭部帶可選選項的時候都是20個字節。這樣的話MSS=1500 - 20 -20 = 1460。

MSS限制了TCP包攜帶數據的大小,它的意思就是當應用層向傳輸層提交數據經過TCP協議進行傳輸時,若是應用層的數據>MSS就必須分段,分紅多個段,逐個的發過去。

例如:應用層一次性向傳輸層提交4096個字節數據,這個時候經過wirshark抓包效果以下:

前三次是三次握手的過程,後面三次是傳送數據的過程,因爲數據大小是4096個字節,因此用了三次進行傳遞(1448 + 1448 + 1200)。
細心的人會問爲何每次傳送的最大數據大小不是1460個字節呢?由於這裏的TCP攜帶可選項,TCP頭長度 = 20 + 12(可選選項大小) = 32字節。 這樣能傳輸的最大數據爲:1500 - 20 - 32 = 1448個字節。

(2)四次揮手斷開鏈接

a.如今的網絡通訊都是基於socket實現的,當客戶端將本身的socket進行關閉時,內核協議棧會向服務器自動發送一個FIN置位的包,請求斷開鏈接。咱們稱首先發起斷開請求的一方稱爲主動斷開方。

b.服務器端收到請客端的FIN斷開請求後,內核協議棧會當即發送一個ACK包做爲應答,表示已經收到客戶端的請求

c.服務器運行一段時間後,關閉了本身的socket。這個時候內核協議棧會向客戶端發送一個FIN置位的包,請求斷開鏈接

d.客戶端收到服務端發來的FIN斷開請求後,會發送一個ACK作出應答,表示已經收到服務端的請求

用wirshar抓包分析以下:

(3)TCP可靠性的保證

TCP採用一種名爲帶重傳功能的確定確認(positive acknowledge with retransmission的技術做爲提供可靠數據傳輸服務的基礎。這項技術要求接收方收到數據以後向源站回送確認信息ACK。發送方對發出的每一個分組都保存一份記錄,在發送下一個分組以前等待確認信息。發送方還在送出分組的同時啓動一個定時器,並在定時器的定時期滿而確認信息尚未到達的狀況下,重發剛纔發出的分組。圖3-5表示帶重傳功能的確定確認協議傳輸數據的狀況,圖3-6表示分組丟失引發超時和重傳。爲了不因爲網絡延遲引發遲到的確認和重複的確認,協議規定在確認信息中稍帶一個分組的序號,使接收方能正確將分組與確認關聯起來。github

從圖 3-5能夠看出,雖然網絡具備同時進行雙向通訊的能力,但因爲在接到前一個分組的確認信息以前必須推遲下一個分組的發送,簡單的確定確認協議浪費了大量寶貴的網絡帶寬。爲此, TCP使用滑動窗口的機制來提升網絡吞吐量,同時解決端到端的流量控制。web



(4)滑動窗口技術

滑動窗口技術是簡單的帶重傳的確定確認機制的一個更復雜的變形,它容許發送方在等待一個確認信息以前能夠發送多個分組。如圖 3-7所示,發送方要發送一個分組序列,滑動窗口協議在分組序列中放置一個固定長度的窗口,而後將窗口內的全部分組都發送出去;當發送方收到對窗口內第一個分組的確認信息時,它能夠向後滑動併發送下一個分組;隨着確認的不斷到達,窗口也在不斷的向後滑動。算法



2、UDP協議

UDP協議也是傳輸層協議,它是無鏈接,不保證可靠的傳輸層協議。它的協議頭比較簡單,以下:


這裏的端口號就不解釋了,和TCP的端口號是同樣的含義。

Length佔用2個字節,標識UDP頭的長度。
Checksum : 校驗和,包含UDP頭和數據部分。

3、IP協議

I P是T C P / I P協議族中最爲核心的協議。全部的T C P、U D P、I C M P及I G M P數據都以I P數據
報格式傳輸。它的特色以下:
不可靠(u n r e l i a b l e)的意思是它不能保證 I P數據報能成功地到達目的地。 I P僅提供最好
的傳輸服務。若是發生某種錯誤時,如某個路由器暫時用完了緩衝區, I P有一個簡單的錯誤
處理算法:丟棄該數據報,而後發送 I C M P消息報給信源端。任何要求的可靠性必須由上層來
提供(如T C P) 。
無鏈接(c o n n e c t i o n l e s s)這個術語的意思是I P並不維護任何關於後續數據報的狀態信息。
每一個數據報的處理是相互獨立的。這也說明, I P數據報能夠不按發送順序接收。若是一信源
向相同的信宿發送兩個連續的數據報(先是 A,而後是B) ,每一個數據報都是獨立地進行路由
選擇,可能選擇不一樣的路線,所以B可能在A到達以前先到達。

1.IP 頭格式

(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字節。 socket

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


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


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

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

 標誌字段中間的一位記爲DF(Don’t 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位。


2.分片解釋

分片指的是須要傳送的數據大於最大傳輸單元(MTU)的時候,就須要分紅多個包,而後一個個發送給對方。咱們在說TCP的時候,說到MSS不少人不能區分它們。經過下面的圖,我想就能夠徹底區分它們了。


我的覺的若是經過TCP協議傳輸數據,到IP層的時候,可定不須要分片了。只有在經過UDP協議傳送大數據的時候,須要分片。

例如:用UDP協議傳送10240個字節數據


能夠看到,但數據提交到網絡層的時候,因爲數據超過了最大傳輸單元,就分片了。分紅多個包經過IP協議發送個對方。每一個數據包最大的字節爲MTU - IP頭 = 1500 - 20 = 1480。

四 、以太網頭


三部分組成 :源MAC Address | 目的 MAC Address | 所使用的協議.

因此在以太網中,數據包的格式有一下幾種:

ARP協議是經過IP地址得到對應的MAC地址,稱爲地址解析協議
RARP協議是經過MAC地址來得到對應的IP地址,稱爲逆向地址解析協議
相關文章
相關標籤/搜索