1. 程式人生 > >TCP/IP報文頭部結構

TCP/IP報文頭部結構

TCP/IP報文頭部結構

IP協議

IP協議是TCP/IP協議族的動力,它為上層協議提供無狀態、無連接、不可靠的服務。
優點:簡單,高效。

IPv4首部一般是20字節長。在以太網幀中,IPv4包首部緊跟著以太網幀首部,同時以太網幀首部中的協議類型值設置為0800
無狀態:IP通信雙方不同步傳輸數據的狀態信息,所有的IP數據報的傳輸都是獨立的。所以容易發生重復和亂序的情況並且IP層不予處理。 然後將這些亂序的交給上層傳輸層(TCP/UDP等)來處理,將其處理成有序的,正確的。再交給應用層。
不可靠:IP協議不能保證IP數據報準確到達。所以它提供ICMP報文來輔助,一旦檢測到IP數據報發送失敗,通知上層協議。

技術分享圖片

版本號(Version): IP協議的版本號。有IPv4和IPv6,現在主流是IPv4。

IP包頭長度(Header Length):IP包頭的長度IP包頭最小長度為20字節,最大60字節。
服務類型(Type of Service)包含一個4位優先權字段:最小延時,最大吞吐量,最高可靠性和最小費用。
IP包總長(Total Length):以字節為單位計算的IP包的長度 (包括頭部和數據),所以IP包最大長度65535字節,但由於MTU限制,一般無法到達這個值。
標識符(Identifier):唯一的標識數據報。該字段和Flag和Fragment Offest字段聯合使用,對大的上層數據包進行分段(fragment)操作。
標記(Flag):當一個包過大被分片時,用來標識屬於同一個包的片段。該字段第一位不使用。第二位是DF位,DF位設為1時表明路由器不能對該上層數據包分段。如果一個上層數據包無法在不分段的情況下進行轉發,則路由器會丟棄該上層數據包並返回一個錯誤信息。第三位是MF位,當路由器對一個上層數據包分段,則路由器會在最後一個分段的IP包的包頭中將MF位設為0,其余IP包的包頭中將MF設為1。
Bit 0: reserved, must be zero
Bit 1: (DF) 0 = May Fragment, 1 = Don‘t Fragment.
Bit 2: (MF) 0 = Last Fragment, 1 = More Fragments.
分段序號(Fragment Offset):分片相對原始IP數據報開始處的偏移。由於IP包在網絡上傳送的時候不一定能按順序到達,這個字段保證了目標路由器在接受到IP包之後能夠還原分段的上層數據包。到某個包含分段的上層數據包的IP包在傳送是丟失,則整個一系列包含分段的上層數據包的IP包都會被要求重傳。
生存時間(Time to Live):當IP包進行傳送時,先會對該字段賦予某個特定的值。當IP包經過每一個沿途的路由器的時候,每個沿途的路由器會將IP包的TTL值減少1。如果TTL減少為0,則該IP包會被丟棄。這個字段可以防止由於故障而導致IP包在網絡中不停被轉發。
協議(Protocol):長度8比特。標識了上層所使用的協議。用來區分上層協議(ICMP為1,TCP為6,UDP為17)。
頭部校驗(Header Checksum):由於IP包頭是變長的,僅以CRC算法檢驗數據報頭部在傳輸過程中是否損壞。
源IP地址(Source IP Addresses):標識了這個IP包的源IP地址。
目的IP地址(Destination IP Address):標識了這個IP包的目的IP地址。
可選項(Options):記錄路由,告訴途徑得所有路由把IP填進來。可用的IP選項包括
記錄路由(record route),告訴數據報途經的所有路由器都將自己的IP地址填入IP頭部的選項部分,這樣我們就可以跟蹤數據報的傳遞路徑。
時間戳(timestamp),告訴每個路由器都將數據報被轉發的時間(或時間與IP地址對)填入IP頭部的選項部分,這樣就可以測量途經路由之間數據報傳輸的時間。
松散源路由選擇(loose source routing),指定一個路由器IP地址列表,數據報發送過程中必須經過其中所有的路由器。
嚴格源路由選擇(strict source routing),和松散源路由選擇類似,不過數據報只能經過被指定的路由器。
填充(Padding):因為IP包頭長度(Header Length)部分的單位為32bit,所以IP包頭的長度必須為32bit的整數倍。因此,在可選項後面,IP協議會填充若幹個0,以達到32bit的整數倍

TCP協議

TCP(TransmissionControl Protocol)傳輸控制協議是一種面向連接的、可靠的、基於字節流的傳輸層通信協議。在簡化的計算機網絡OSI模型中,它完成第四層傳輸層所指定的功能,用戶數據報協議(UDP)是同一層內另一個重要的傳輸協議。
TCP連接包括三個狀態:連接創建、數據傳送和連接終止。
技術分享圖片

源目端口號:計算機上的進程要和其他進程通信是要通過計算機端口的,而一個計算機端口某個時刻只能被一個進程占用,所以通過指定源端口和目標端口,就可以知道是哪兩個進程需要通信。TCP報頭中的源端口號和目的端口號同IP數據報中的源IP與目的IP唯一確定一條TCP連接。
序列號:表示本報文段所發送數據的第一個字節的編號。在TCP連接中所傳送的字節流的每一個字節都會按順序編號。
確認號:表示接收方期望收到發送方下一個報文段的第一個字節數據的編號。也就是告訴發送發:我希望你(指發送方)下次發送的數據的第一個字節數據的編號是這個確認號。也就是告訴發送方:我希望你(指發送方)下次發送給我的TCP報文段的序列號字段的值是這個確認號。
TCP首部長度:由於TCP首部包含一個長度可變的選項部分,所以需要這麽一個值來指定這個TCP報文段到底有多長。或者可以這麽理解:就是表示TCP報文段中數據部分在整個TCP報文段中的位置。該字段的單位是32位字,即:4個字節。
URG:表示本報文段中發送的數據是否包含緊急數據。URG=1,表示有緊急數據。後面的緊急指針字段只有當URG=1時才有效。
ACK:表示是否前面的確認號字段是否有效。ACK=1,表示有效。只有當ACK=1時,前面的確認號字段才有效。TCP規定,連接建立後,ACK必須為1。
PSH:告訴對方收到該報文段後是否應該立即把數據推送給上層。如果為1,則表示對方應當立即把數據提交給上層,而不是緩存起來。
RST:只有當RST=1時才有用。如果你收到一個RST=1的報文,說明你與主機的連接出現了嚴重錯誤(如主機崩潰),必須釋放連接,然後再重新建立連接。或者說明你上次發送給主機的數據有問題,主機拒絕響應。
SYN:在建立連接時使用,用來同步序號。當SYN=1,ACK=0時,表示這是一個請求建立連接的報文段;當SYN=1,ACK=1時,表示對方同意建立連接。SYN=1,說明這是一個請求建立連接或同意建立連接的報文。只有在前兩次握手中SYN才置為1。
FIN:標記數據是否發送完畢。如果FIN=1,就相當於告訴對方:“我的數據已經發送完畢,你可以釋放連接了”
窗口大小:表示現在運行對方發送的數據量。也就是告訴對方,從本報文段的確認號開始允許對方發送的數據量。
校驗和:提供額外的可靠性。具體如何校驗,參考其他資料。
緊急指針:標記緊急數據在數據字段中的位置。
選項部分:其最大長度可根據TCP首部長度進行推算。TCP首部長度用4位表示,那麽選項部分最長為:(2^4-1)*4-20=40字節。
選項部分的應用
1. MSS最大報文段長度(Maxium Segment Size):指明數據字段的最大長度,數據字段的長度加上TCP首部的長度才等於整個TCP報文段的長度。MSS值指示自己期望對方發送TCP報文段時那個數據字段的長度。通信雙方可以有不同的MSS值。如果未填寫,默認采用536字節。MSS只出現在SYN報文中。即:MSS出現在SYN=1的報文段中。
2. 窗口擴大選項(Windows Scaling):由於TCP首部的窗口大小字段長度是16位,所以其表示的最大數是65535。但是隨著時延和帶寬比較大的通信產生(如衛星通信),需要更大的窗口來滿足性能和吞吐率,所以產生了這個窗口擴大選項。
3. SACK選擇確認項(Selective Acknowledgements):用來確保只重傳缺少的報文段,而不是重傳所有報文段。比如主機A發送報文段1、2、3,而主機B僅收到報文段1、3。那麽此時就需要使用SACK選項來告訴發送方只發送丟失的數據。那麽又如何指明丟失了哪些報文段呢?使用SACK需要兩個功能字節。一個表示要使用SACK選項,另一個指明這個選項占用多少字節。描述丟失的報文段2,是通過描述它的左右邊界報文段1、3來完成的。而這個1、3實際上是表示序列號,所以描述一個丟失的報文段需要64位即8個字節的空間。那麽可以推算整個選項字段最多描述(40-2)/8=4個丟失的報文段。
4. 時間戳選項(Timestamps):可以用來計算RTT(往返時間),發送方發送TCP報文時,把當前的時間值放入時間戳字段,接收方收到後發送確認報文時,把這個時間戳字段的值復制到確認報文中,當發送方收到確認報文後即可計算出RTT。也可以用來防止回繞序號PAWS,也可以說可以用來區分相同序列號的不同報文。因為序列號用32為表示,每2^32個序列號就會產生回繞,那麽使用時間戳字段就很容易區分相同序列號的不同報文。
5. NOP(NO-Operation):它要求選項部分中的每種選項長度必須是4字節的倍數,不足的則用NOP填充。同時也可以用來分割不同的選項字段。如窗口擴大選項和SACK之間用NOP隔開。

TCP/IP報文頭部結構