TCP協議資料報頭結構

2021-05-22 23:41:30 字數 4760 閱讀 4848

tcp頭結構 

tcp序列號(序列碼,sequence number):32位的序列號由接收端計算機使用,重新分段的報文成最初形式。當syn出現,序列碼實際上是初始序列碼(isn),而第乙個資料位元組是isn+1。這個序列號(序列碼)是可以補償傳輸中的不一致。 

tcp應答號(acknowledgment   number):32位的序列號由接收端計算機使用,重組分段的報文成最初形式。,如果設定了ack控制位,這個值表示乙個準備接收的包的序列碼。 

資料偏移量(hlen):4位包括tcp頭大小,指示何處資料開始。 

保留(reserved):6位值域,這些位必須是0。為了將來定義新的用途所保留。 

標誌(code bits):6位標誌域。表示為:緊急標誌、有意義的應答標誌、推、重置連線標誌、同步序列號標誌、完成傳送資料標誌。按照順序排列是:urg、ack、psh、rst、syn、fin。 

視窗(window):16位,用來表示想收到的每個tcp資料段的大小。 

校驗位(checksum):16位tcp頭。源機器基於資料內容計算乙個數值,收資訊機要與源機器數值 結果完全一樣,從而證明資料的有效性。 

優先指標(緊急,urgent  pointer):16位,指向後面是優先資料的位元組,在urg標誌設定了時才有效。如果urg標誌沒有被設定,緊急域作為填充。加快處理標示為緊急的資料段。 

選項(option):長度不定,但長度必須以位元組。如果 沒有 選項就表示這個一位元組的域等於0。 

填充:不定長,填充的內容必須為0,它是為了數學目的而存在。目的是確保空間的可**性。保證包頭的結合和資料的開始處偏移量能夠被32整除,一般額外的零以保證tcp頭是32位的整數倍。

<附圖是用sniffer抓的乙個包頭結構> 

00 50 07 45 9b d6 43        3c 47 fd 37 50 50 18 

ff 1f 05 a5 00 00 48         54 54 50 2f 31 2e 31 

20 32 30 30 20 4f 4b         0d 0a 53 65 72 76 65

72 3a 20 4d 69 63 72         6f 73 6f 66 74 2d 49 

49 53 2f 35 2e 30 0d         0a 44 61 74 65 3a 20 

57 65 64 2c 20 31 32         20 4e 6f 76 20 32 30 

30 33 20 30 33 3a 33         37 3a 35 35 20 47 4d 

54 0d 0a 43 6f 6e 6e         65 63 74 69 6f 6e 3a 

20 63 6c 6f 73 65 0d         0a 48 54 54 50 2f 31 

2e 31 20 32 30 30 20         4f 4b 0d 0a 53 65 72 

76 65 72 3a 20 4d 69         63 72 6f 73 6f 66 74 

2d 49 49 53 2f 35 2e         30 0d 0a 50 72 61 67 

6d 61 3a 20 6e 6f 2d         63 61 63 68 65 0d 0a 

43 6f 6e 74 65 6e 74         2d 74 79 70 65 3a 20 

74 65 78 74 2f 70 6c         61 69 6e 3b 63 68 61 

72 73 65 74 3d 67 62         32 33 31 32 0d 0a 0d 

0a解析:

源埠:00 50    目的埠:07 45  序列號:9b d6 43 3c 

應答號:47 fd 37 50   資料偏移量:50   保留:

標誌位:18       視窗:ff 1f             校驗位:05 a5

優先指標:00 00    選項:       填充:(餘下的205位元組為tcp資料)

標誌控制功能 urg:緊急標誌 

緊急(the urgent pointer) 標誌有效。緊急標誌置位, 

ack:確認標誌 確認編號(acknowledgement  number)欄有效。大多數情況下該標誌位是置位的。tcp報頭內的確認編號欄內包含的確認編號(w+1,figure:1)為下乙個預期的序列編號,同時提示遠端系統已經成功接收所有資料。 

psh:推標誌 

該標誌置位時,接收端不將該資料進行佇列處理,而是盡可能快將資料轉由應用處理。在處理 telnet 或 rlogin 等互動模式的連線時,該標誌總是置位的。 

rst:復位標誌 復位標誌有效。用於復位相應的tcp連線。 

syn:同步標誌 同步序列編號(synchronize sequence numbers)欄有效。該標誌僅在三次握手建立tcp連線時有效。它提示tcp連線的服務端檢查序列編號,該序列編號為tcp連線初始端(一般是客戶端)的初始序列編號。在這裡,可以把tcp序列編號看作是乙個範圍從0到4,294,967,295的32位計數器。通過tcp連線交換的資料中每乙個位元組都經過序列編號。在tcp報頭中的序列編號欄包括了tcp分段中第乙個位元組的序列編號。 

fin:結束標誌 

帶有該標誌置位的資料報用來結束乙個tcp回話,但對應埠仍處於開放狀態,準備接收後續資料。服務端處於監聽狀態,客戶端用於建立連線請求的資料報(ip packet)按照tcp/ip協議堆疊組合成為tcp處理的分段(segment)。 

分析報頭資訊: tcp層接收到相應的tcp和ip報頭,將這些資訊儲存到記憶體中。 

檢查tcp校驗和(checksum):標準的校驗和位於分段之中(figure:2)。如果檢驗失敗,不返回確認,該分段丟棄,並等待客戶端進行重傳。 

如果該協議控制塊存在,但狀態為關閉,服務端不呼叫connect()或listen()。該分段丟棄,但不返回rst。客戶端會嘗試重新建立連線請求。 

建立新的socket:當處於監聽狀態的socket收到該分段時,會建立乙個子socket,同時還有socket{},tcpcb{}和pub{}建立。這時如果有錯誤發生,會通過標誌位來拆除相應的socket和釋放記憶體,tcp連線失敗。如果快取佇列處於填滿狀態,tcp認為有錯誤發生,所有的後續連線請求會被拒絕。這裡可以看出syn flood攻擊是如何起作用的。 

丟棄:如果該分段中的標誌為rst或ack,或者沒有syn標誌,則該分段丟棄。並釋放相應的記憶體。 

傳送序列變數 

snd.una : 傳送未確認 

snd.wnd : 傳送視窗 

snd.up : 傳送優先指標 

snd.wl1 : 用於最後視窗更新的段序列號 

snd.wl2 : 用於最後視窗更新的段確認號 

iss : 初始傳送序列號 

接收序列號 

rcv.up : 接收優先指標 

irs : 初始接收序列號 

當前段變數 

seg.seq : 段序列號 

seg.ack : 段確認標記 

seg.len : 段長 

seg.wnd : 段視窗 

seg.up : 段緊急指標 

seg.prc : 段優先順序 

closed表示沒有連線,各個狀態的意義如下: 

listen : 監聽來自遠方tcp埠的連線請求。 

syn-sent : 在傳送連線請求後等待匹配的連線請求。 

syn-received : 在收到和傳送乙個連線請求後等待對連線請求的確認。 

established : 代表乙個開啟的連線,資料可以傳送給使用者。 

fin-wait-1 : 等待遠端tcp的連線中斷請求,或先前的連線中斷請求的確認。 

fin-wait-2 : 從遠端tcp等待連線中斷請求。 

close-wait : 等待從本地使用者發來的連線中斷請求。 

closing : 等待遠端tcp對連線中斷的確認。 

last-ack : 等待原來發向遠端tcp的連線中斷請求的確認。 

time-wait : 等待足夠的時間以確保遠端tcp接收到連線中斷請求的確認。 

closed : 沒有任何連線狀態。 

tcp連線過程是狀態的轉換,促使發生狀態轉換的是使用者呼叫:open,send,receive,close,abort和status。傳送過來的資料段,特別那些包括以下標記的資料段syn,ack,rst和fin。還有超時,上面所說的都會時tcp狀態發生變化。 

序列號:請注意,我們在tcp連線中傳送的位元組都有乙個序列號。因為編了號,所以可以確認它們的收到。對序列號的確認是累積性的。tcp必須進行的序列號比較操作種類包括以下幾種: 

①決定一些傳送了的但未確認的序列號。 

②決定所有的序列號都已經收到了。 

③決定下乙個段中應該包括的序列號。 

對於傳送的資料tcp要接收確認,確認時必須進行的: 

snd.una = 最老的確認了的序列號。 

snd.nxt = 下乙個要傳送的序列號。 

seg.ack = 接收tcp的確認,接收tcp期待的下乙個序列號。 

seg.seq = 乙個資料段的第乙個序列號。 

seg.len = 資料段中包括的位元組數。 

seg.seq+seg.len-1 = 資料段的最後乙個序列號。 

如果乙個資料段的序列號小於等於確認號的值,那麼整個資料段就被確認了。而在接收資料時下面的比較操作是必須的: 

rcv.nxt = 期待的序列號和接收視窗的最低沿。 

rcv.nxt+rcv.wnd:1 = 最後乙個序列號和接收視窗的最高沿。 

seg.seq = 接收到的第乙個序列號。 

seg.seq+seg.len:1 = 接收到的最後乙個序列號 

IP資料報頭部,TCP頭部,偽TCP頭部結構定義

我自己整理出來的彙編版本 ip資料報頭部結構定義 ip head struct h lenver db 4位ip版本號 4位首部長度 tos db 8位服務型別 tcp len dw 16位tcp資料報總長度 ident dw 16位標識 frag and flags dw 3位分片標誌 13位分片...

TCP資料報頭和TCP連線建立過程

乙個tcp資料報包含乙個固定的20位元組的頭 乙個可選部分以及0或多位元組的資料。對資料報的大小有兩個限制條件 首先,每個資料報 包括tcp頭在內 必須適合ip的載荷能力,不能超過65535位元組 其次,每個網路都存在最大傳輸單元mtu maximum transfer unit 要求每個資料報必須...

IP資料報 TCP資料報結構詳解

一般來說,網路程式設計我們僅僅須要呼叫一些封裝好的函式或者元件就能完畢大部分的工作,可是一些特殊的情況下,就須要深入的理解 網路資料報的結構,以及協議分析。如 網路監控,故障排查等 ip包是不安全的,可是它是網際網路的基礎,在各方面都有廣泛的應用。由ip協議衍生的協議族有10數種 據我所知 以後還會...