tcp資料報由首部和資料組成,
每行4個位元組(32位)
其中首部最少20個位元組(5行),最多60個位元組(15行),選項部分是可選的;
tcp首部並沒有字段表明整個資料報的長度,是因為tcp資料報是包含在ip資料報中的,而ip資料報已有長度字段,除去ip首部和tcp首部,剩餘部分就是tcp包的淨荷資料。
1、 第一行:源埠2位元組,目的埠2位元組
表示傳送方和接收方的埠號
2、 第
二、三行:序列號4位元組,確認號4位元組
序列號是指該報文段在傳送方資料字節流中的位置,在tcp位元組流中,每個資料位元組都被編號;
確認號是指本機希望收到的下乙個位元組的序號;
序列號和確認號分別對應報文傳送方向和相反方向的資料流;
報文被分解成多個報文段時,序列號就是首位元組在整個報文中的偏移量,確認號指定下乙個期待的位元組;
序列號和確認號的最大表示範圍均為2^32-1=4294967295≈42.9億;
3、 第四行:首部長度4位,保留6位,標誌位6位,視窗大小16位
首部長度:
指明首部共有多少行(每行4個位元組),則tcp首部的最大長度為(2^4-1)*4=60位元組;
標誌位6位,含義分別如下:
urg:緊急指標有效
ack:確認序號有效
psh:接收方盡快將這個報文段交給應用層
rst:重建連線
syn:同步序號用來發起乙個連線
fin:發端完成傳送任務
視窗大小:
即傳送資料的視窗大小,告訴對方在不等待確認的情況下,可以發來多大的資料;這裡表示的最大長度是2^16-1=65535,如需要使用更大的視窗大小,需要使用選項中的視窗擴大因子選項;
4、 第五行:tcp校驗和16位,緊急指標16位
tcp校驗和:【待補充】
緊急指標:
當urg標誌為1時緊急指標才有效,緊急指標是乙個正的偏移量,和序號欄位中的值相加表示緊急資料最後乙個位元組的序號(即序列號到緊急指標之間的資料為緊急資料,後面的資料才是正常資料)。
第六行開始是選項部分:
每個選項的開始是1位元組的kind欄位,說明選項的型別。(這裡描述的長度,包含kind和長度位元組本身)。
1、kind=0:選項表結束(共1位元組)
2、kind=1:無操作(共1位元組)nop:no operation
用於填充選項字段,使tcp首部長度為4位元組的倍數;
3、kind=2:最大報文段長度(共4位元組=1+1+2)mss(maxinum segment size)
第乙個位元組:kind的值,即0x02;
第二個位元組:該段選項的長度,即0x04;
第三四位元組:mss的值,最大報文段長度(僅僅是淨荷資料,不包括tcp首部字段);
tcp包最大淨荷資料量為65495(=ip資料報最大長度65535-tcp包頭20位元組 - ip包頭20位元組);
用於傳送方與接收方協商最大報文段長度。tcp在三次握手中,每一方都會通告期望收到的mss(mss只出現在syn資料報中),如果一方不接受另一方的mss值,則使用預設的536位元組淨荷資料,即主機能夠接受20+536位元組的tcp報文段。
4、kind=3:視窗擴大因子(共3位元組=1+1+1)window scaling
第乙個位元組:kind的值,即0x03;
第二個位元組:該段選項的長度,即0x03;
第三個位元組:移位值(shift count)s,表示把視窗值向左移動s位,得到實際視窗大小,移位值的取值範圍是0~14,則視窗最大值為1gb,即65535*(2^14)=1073725440=10億位元組=1gb,在tcp建立連線時協商的。如果視窗已經擴大,當不再需要擴大時,傳送s=0選項就可以恢復視窗大小到16位;(最大值14,即最大tcp序號限定為2^16 * 2^ 14 = 2^30 < 2^31。該限制用於防止位元組序列號溢位。)
視窗擴**項是在tcp建立之初進行協商,如果已實現了視窗擴大,當不再需要擴大視窗時,傳送移位值=0就可以恢復到原視窗大小,即65535。
5、kind=8:時間戳選項(共10位元組=1+1+4+4)timestamps
第乙個位元組:kind的值,即0x08;
第二個位元組:該段選項的長度,即0x0a;
第三到第六位元組:時間戳,系統啟動時開始記數(可能是每500毫秒加1),用於計算rtt和防止迴繞序號(paws);
時間戳選項用來計算往返時間rtt,傳送方在傳送報文段時把當前時鐘的時間值放入時間戳字段,接收方將該時間戳字段的值複製到確認報文中,當接收方收到確認報文,對比確認報文的時間戳(等於傳送方傳送報文段的時間戳)和現在的時鐘,即可算出rtt。
時間戳選項還可用於防止迴繞序號paws。序列號只有32位,每2^32個序列號就會迴繞(想想環形佇列),採用時間戳選項很容易區分相同序列號的報文段。
6、kind=4:選擇確認選項sack selective acknowledgements
第乙個位元組:kind的值,即0x04;
第二個位元組:該段選項的長度;
考慮這樣情況,主機a傳送報文段12345,主機b收到135且報文無差錯,sack用來確保只重傳缺少的報文段,而不是重傳所有報文段。
sack選項需要2個功能位元組,乙個用來指明使用sack選項(sack permission),另一指明這個選項佔多少位元組。
那怎麼形容丟失的報文段2,說明2的左右邊界分別是1、3。tcp的資料報文是有字塊邊界的,而這種邊界是由序列號表示的。
最多能指明多少個位元組塊的邊界資訊呢?答案是4個。這是因為選項字段最大是40位元組,去除2個功能位元組,序列號是32位即4位元組,並且需要左右邊界,所以(40-2)/8 = 4。
tcp首部結束之後的部分
------------------------------------
小方的專欄
TCP資料報格式
tcp 提供一種面向連線的 全雙工的 可靠的位元組流服務。在乙個tcp 連線中,僅有兩方進行彼此通訊。廣播和多播不能用於tcp。tcp 的接收端必須丟棄重複的資料。tcp 對位元組流的內容不作任何解釋。對位元組流的解釋由tcp 連線雙方的應用層解釋。tcp 通過下列方式來提供可靠性 應用資料被分割成...
TCP資料報首部
源埠 source port 目標埠 destination port 各2位元組 源埠號,標識主機上發起傳送的應用程式 目的埠標識主機上傳送要到達的應用程式。源端和目的端的埠號,用於尋找發端和收端應用程序。這兩個值加上i p首部中的源端i p位址和目的端i p位址唯一確定乙個tcp連線。乙個i p...
IP資料報 TCP資料報結構詳解
一般來說,網路程式設計我們僅僅須要呼叫一些封裝好的函式或者元件就能完畢大部分的工作,可是一些特殊的情況下,就須要深入的理解 網路資料報的結構,以及協議分析。如 網路監控,故障排查等 ip包是不安全的,可是它是網際網路的基礎,在各方面都有廣泛的應用。由ip協議衍生的協議族有10數種 據我所知 以後還會...