1. TCP報文封裝
一個典型的使用TCP協(xié)議封裝的數(shù)據(jù)包,包括以太網(wǎng)MAC頭+網(wǎng)絡(luò)層IP數(shù)據(jù)頭+傳輸層TCP頭+要傳輸?shù)臄?shù)據(jù)。 詳見下圖所示:
2. TCP報文結(jié)構(gòu)
TCP(Transmission Control Protocol,傳輸控制協(xié)議)提供的是面向連接,可靠的字節(jié)流服務(wù)。 即客戶和服務(wù)器交換數(shù)據(jù)前,必須現(xiàn)在雙方之間建立一個TCP連接,之后才能傳輸數(shù)據(jù)。 并且提供超時重發(fā),丟棄重復數(shù)據(jù),檢驗數(shù)據(jù),流量控制等功能,保證數(shù)據(jù)能從一端傳到另一端。
TCP報文結(jié)構(gòu)如下圖示:
TCP報文結(jié)構(gòu)各字段功能如下示:
源端口號:表示發(fā)送端端口號,字段長16bit
目標端口:表示接收端端口號,字段長16bit
序號:字段長32bit,是指發(fā)送數(shù)據(jù)的位置。 每發(fā)送一次數(shù)據(jù),就累加一次該數(shù)據(jù)字節(jié)數(shù)的大小
確認序號:字段長32bit,是指下一次應(yīng)該收到的數(shù)據(jù)的序列號。 實際上,它是指已收到確認應(yīng)答號減一為止的數(shù)據(jù)。 發(fā)送端收到這個確認應(yīng)答以后可以認為在這個序號以前的數(shù)據(jù)都已經(jīng)被正常接收
首部長度:字段長4bit,它指出了 TCP 報文段首部長度,以字節(jié)為單位,最大能記錄15*4=60字節(jié)的首部長度
保留:字段長6bit,主要是為了以后擴展時使用。 一般設(shè)置為0
標志字段:字段長6bit,這些控制標志也叫做控制位
- URG:表示本報文段中發(fā)送的數(shù)據(jù)是否包含緊急數(shù)據(jù)。 URG=1,表示有緊急數(shù)據(jù)。 后面的緊急指針字段只有當URG=1時才有效
- ACK:表示是否前面的確認號字段是否有效。 ACK=1,表示有效。 只有當ACK=1時,前面的確認號字段才有效。 TCP規(guī)定,連接建立后,ACK必須為1
- PSH:告訴對方收到該報文段后是否應(yīng)該立即把數(shù)據(jù)推送給上層。 如果為1,則表示對方應(yīng)當立即把數(shù)據(jù)提交給上層,而不是緩存起來
- RST:只有當RST=1時才有用。 如果你收到一個RST=1的報文,說明你與主機的連接出現(xiàn)了嚴重錯誤(如主機崩潰),必須釋放連接,然后再重新建立連接。 或者說明你上次發(fā)送給主機的數(shù)據(jù)有問題,主機拒絕響應(yīng)
- SYN:在建立連接時使用,用來同步序號。當SYN=1,ACK=0時,表示這是一個請求建立連接的報文段;當SYN=1,ACK=1時,表示對方同意建立連接。SYN=1,說明這是一個請求建立連接或同意建立連接的報文。只有在前兩次握手中SYN才置為1
- FIN:標記數(shù)據(jù)是否發(fā)送完畢。如果FIN=1,就相當于告訴對方:“我的數(shù)據(jù)已經(jīng)發(fā)送完畢,你可以釋放連接了”
窗口大小:字段長16bit,TCP的流量控制由連接的每一端通過聲明的窗口大小來提供,窗口大小為字節(jié)數(shù),起始于確認序號字段指明的值,這個值是接收端正期望接收的數(shù)據(jù)序號,發(fā)送方根據(jù)窗口大小調(diào)整發(fā)送數(shù)據(jù),以實現(xiàn)流量控制。 窗口最大為 65535 字節(jié),當接收方告訴發(fā)送方一個大小為 0 的窗口時,將完全阻止發(fā)送方的數(shù)據(jù)發(fā)送
校驗和:檢驗和覆蓋了整個的 TCP 報文段(TCP 首部和 TCP 數(shù)據(jù)區(qū)域),由發(fā)送端計算和填寫,并由接收端進行驗證
緊急字段:只有當URG標志置1時緊急指針才有效,緊急指針是一個正的偏移量,和序號字段中的值相加表示緊急數(shù)據(jù)最后一個字節(jié)的序號。 簡單來說,本TCP報文段的緊急數(shù)據(jù)在報文段數(shù)據(jù)區(qū)域中,從序號字段開始,偏移緊急指針的值結(jié)束
選項字段:選項字段用于提高TCP的傳輸性能。 其最大長度可根據(jù)TCP首部長度進行推算。 TCP首部長度用4位表示,那么選項部分最長為:(2^4-1)*4-20=40字節(jié)
- kind=2,最大報文段長度(MSS)選項:MSS選項用于在建立連接時決定最大段長度的情況,該選項用于大部分操作系統(tǒng)。TCP連接初始化時,通信雙方使用該選項來協(xié)商最大報文段長度。TCP模塊通常將MSS設(shè)置為(MTU-40)字節(jié)(減掉的這40字節(jié)包括20字節(jié)的TCP頭部和20字節(jié)的IP頭部)。這樣攜帶TCP報文段的IP數(shù)據(jù)報的長度就不會超過MTU(假設(shè)TCP頭部和IP頭部都不包含選項字段,并且這也是一般情況),從而避免本機發(fā)生IP分片。對以太網(wǎng)而言,MSS值是1460(1500-40)字節(jié)
- kind=3,窗口擴大因子選項:是一個用來改善TCP吞吐量的選項。 TCP連接初始化時,通信雙方使用該選項來協(xié)商接收窗口的擴大因子。 在TCP的頭部中,接收窗口大小是用16位表示的,故最大為65535字節(jié),但實際上TCP模塊允許的接收窗口大小遠不止這個數(shù)(為了提高TCP通信的吞吐量)。 窗口擴大因子解決了這個問題。 假設(shè)TCP頭部中的接收通告窗口大小是N,窗口擴大因子(移位數(shù))是M,那么TCP報文段的實際接收通告窗口大小是N*2M,或者說N左移M位
3. Wireshark抓包分析
將Socket API編程模型一文中的TCP Server工程源碼下載到開發(fā)板中,用網(wǎng)線將PC和開發(fā)板相連接,開啟一個TCP客戶端,打開wireshark軟件,監(jiān)聽IP地址192.168.1.10
在TCP客戶端發(fā)送數(shù)據(jù)
wireshark抓取到相應(yīng)的TCP數(shù)據(jù)包,客戶機向主機發(fā)送數(shù)據(jù):ACK=1表示確認序號字段有效,PSH=1表示接收方應(yīng)該盡快將這個報文段交給應(yīng)用層
主機收到數(shù)據(jù)后立即返回相應(yīng)數(shù)據(jù)給客戶機,ACK=1表示確認序號字段有效,PSH=1表示接收方應(yīng)該盡快將這個報文段交給應(yīng)用層
客戶機再次給出響應(yīng)到主機,ACK=1表示確認序號字段有效,PSH=0表示沒有數(shù)據(jù)傳遞
-
封裝
+關(guān)注
關(guān)注
126文章
7650瀏覽量
142463 -
TCP
+關(guān)注
關(guān)注
8文章
1337瀏覽量
78865 -
網(wǎng)絡(luò)層
+關(guān)注
關(guān)注
0文章
40瀏覽量
10281 -
TCP協(xié)議
+關(guān)注
關(guān)注
1文章
91瀏覽量
12050 -
Wireshark
+關(guān)注
關(guān)注
0文章
49瀏覽量
6481
發(fā)布評論請先 登錄
相關(guān)推薦
評論