黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

使用wireshark分析TCP/IP協(xié)議中TCP包頭的格式

系統(tǒng) 3773 0

本文簡(jiǎn)單介紹了TCP面向連接理論知識(shí),詳細(xì)講述了TCP報(bào)文各個(gè)字段含義,并從Wireshark俘獲分組中選取TCP連接建立相關(guān)報(bào)文段進(jìn)行分析。

一、概述

TCP是面向連接的可靠傳輸協(xié)議,兩個(gè)進(jìn)程互發(fā)數(shù)據(jù)之前需要建立連接,這里的連接只不過是端系統(tǒng)中分配的一些緩存和狀態(tài)變量,中間的分組交換機(jī)不維護(hù)任何連接狀態(tài)信息。連接建立整個(gè)過程如下(即三次握手協(xié)議):

首先,客戶機(jī)發(fā)送一個(gè)特殊的TCP報(bào)文段;

其次,服務(wù)器用另一個(gè)特殊的TCP報(bào)文段來響應(yīng);

最后,客戶機(jī)再用第三個(gè)特殊報(bào)文段作為響應(yīng)。

圖1 三次握手協(xié)議示意圖[1]

二、TCP報(bào)文格式

2.1 概述

為了提供可靠的數(shù)據(jù)傳輸,TCP報(bào)文首部字段有較多的字段,TCP報(bào)文格式如下圖:

使用wireshark分析TCP/IP協(xié)議中TCP包頭的格式

圖2 TCP報(bào)文格式

源和目標(biāo)端口

用于多路復(fù)用/多路分解來自或送至上層應(yīng)用的數(shù)據(jù),可以這樣理解,端口用來標(biāo)識(shí)同一臺(tái)計(jì)算機(jī)的不同進(jìn)程。

序列號(hào)和確認(rèn)號(hào)

這兩個(gè)字段是TCP可靠傳輸服務(wù)的關(guān)鍵部分,序列號(hào)是該報(bào)文段首字節(jié)的字節(jié)流編號(hào)( TCP把數(shù)據(jù)看成是有序的字節(jié)流 ,TCP隱式地對(duì)數(shù)據(jù)流的每個(gè)字節(jié)進(jìn)行編號(hào))。這樣理解可能更直觀,當(dāng)報(bào)文被分解成多個(gè)報(bào)文段時(shí),序列號(hào)就是報(bào)文段首字節(jié)在整個(gè)報(bào)文的偏移量。 確定號(hào)指定下一個(gè)期待的字節(jié) 。TCP是全雙工的,假設(shè)從主機(jī)A接收到主機(jī)B的數(shù)據(jù),則主機(jī)A填充進(jìn)報(bào)文段的確認(rèn)號(hào)是主機(jī)A期望從主機(jī)B收到的下一個(gè)字節(jié)序號(hào)。還沒理清這兩者的關(guān)系?見下圖(三次握手):

使用wireshark分析TCP/IP協(xié)議中TCP包頭的格式

圖3 正常情況下TCP連接建立過程

首部長(zhǎng)度(4位)

因?yàn)檫x項(xiàng)是不定長(zhǎng)的,這就需要標(biāo)識(shí)整個(gè)首部字段的長(zhǎng)度(單位是32位字),即5+選項(xiàng)個(gè)數(shù)。4位,單位是32位字,所以首部最長(zhǎng)是15*4=60字節(jié),即選項(xiàng)最長(zhǎng)是40字節(jié)(10個(gè)選項(xiàng))。

標(biāo)志

URG

指示報(bào)文段里存在著被發(fā)送方的上層實(shí)體標(biāo)記為”緊急”數(shù)據(jù),當(dāng)URG=1時(shí),其后的緊急指針指示緊急數(shù)據(jù)在當(dāng)前數(shù)據(jù)段中的位置(相對(duì)于當(dāng)前序列號(hào)的字節(jié)偏移量),TCP接收方必須通知上層實(shí)體。

ACK

當(dāng)ACK=0時(shí),表示該數(shù)據(jù)段不包含確認(rèn)信息,當(dāng)ACK=1時(shí),表示該報(bào)文段包括一個(gè)對(duì)已被成功接收?qǐng)?bào)文段的確認(rèn)。

PSH

當(dāng)PSH=1時(shí),接收方在收到數(shù)據(jù)后立即將數(shù)據(jù)交給上層,而不是直到整個(gè)緩沖區(qū)滿。

RST

用于重置一個(gè)已經(jīng)混亂的連接(如主崩潰),也可用于拒絕一個(gè)無效的數(shù)據(jù)段或者拒絕一個(gè)連接請(qǐng)求。一般而言,如果你得到的數(shù)據(jù)段被設(shè)置了RST位,那說明你這一端有問題了。

SYN

用于建立連接過程,在連接請(qǐng)求中, SYN=1和ACK=0 表示該數(shù)據(jù)段沒有使用 捎帶 的確認(rèn)域,而連接應(yīng)答捎帶一個(gè)確認(rèn),即 SYN=1和ACK=1

注:捎帶是指對(duì)客戶機(jī)到服務(wù)器數(shù)據(jù)的 確認(rèn) 被裝載在一個(gè)承載服務(wù)器到客戶機(jī)的數(shù)據(jù)報(bào)文段中。

FIN

用于釋放一個(gè)連接,表示發(fā)送方已經(jīng)沒有數(shù)據(jù)要傳輸了。此時(shí),接收方可能繼續(xù)接收數(shù)據(jù),好在SYN和FIN數(shù)據(jù)段都有序列號(hào),從而保證了這兩種數(shù)據(jù)段以正確順序被處理。

窗口大小

用于流控制(確保連接的任何一方都不會(huì)過快地發(fā)送過量的分組而淹沒另一方),窗口大小指定了從 被確認(rèn)的字節(jié) 算起可以發(fā)送多少個(gè)字節(jié)。

校驗(yàn)和

提供了額外可靠性,在計(jì)算檢驗(yàn)和的時(shí)候,TCP的Checksum域設(shè)為0,如果數(shù)據(jù)域的字節(jié)數(shù)為奇數(shù),則數(shù)據(jù)域填補(bǔ)一個(gè)額外的0字節(jié)。校驗(yàn)和算法:將所有的16位字按1的補(bǔ)碼形式累加起來,取累加結(jié)果的補(bǔ)碼。因此,當(dāng)接收方執(zhí)行同樣計(jì)算時(shí)(包括Checksum域),結(jié)果應(yīng)該是0。

緊急指針

參考標(biāo)志字段的URG位。

選項(xiàng)

選項(xiàng)部分是為了適合復(fù)雜網(wǎng)絡(luò)環(huán)境和更好地服務(wù)于應(yīng)用層設(shè)計(jì)的。TCP選項(xiàng)最長(zhǎng)是40字節(jié)。詳情見2.2。

數(shù)據(jù)

無任何數(shù)據(jù)的TCP段也是合法的,通常用于確認(rèn)和控制信息。

2.2 選項(xiàng)字段[2]

TCP選項(xiàng)部分很好出現(xiàn)在已經(jīng)建立連接的會(huì)話中,只要出現(xiàn)在TCP連接建立階段,即三次握手。TCP選項(xiàng)部分實(shí)際運(yùn)用有以下幾種:

(1)最大報(bào)文傳輸段(MMS, Maximum Segment Size)

用于發(fā)送發(fā)與接收方協(xié)商 最大報(bào)文段長(zhǎng)度 (僅僅是凈荷數(shù)據(jù),不包括TCP首部字段)。TCP在三次握手中,每一方都會(huì)通告期望收到的MSS(MSS只出現(xiàn)在SYN數(shù)據(jù)包中),如果一方不接受另一方的MSS值,則使用默認(rèn)的 536 字節(jié)凈荷數(shù)據(jù),即主機(jī)能夠接受20+536字節(jié)的TCP報(bào)文段。

(2)窗口擴(kuò)大選項(xiàng)(Window scaling)

TCP報(bào)文的窗口大小字段占16位,即最大值是65535, 但隨著時(shí)延和帶寬比較大的通信產(chǎn)生(如衛(wèi)星通信),需要更大的窗口滿足性能和吞吐率 ,這就是窗口擴(kuò)大選項(xiàng)存在的意義。例子見參考資料[2]。

Windows scaling占3個(gè)字節(jié),最后一個(gè)字節(jié)是 移位值(Shift count) ,即首部的窗口位數(shù)16向左移動(dòng),如移位值為14,則新的窗口最大值增大到65535*(2^14)。

窗口擴(kuò)大選項(xiàng)是在TCP建立之初進(jìn)行協(xié)商,如果已實(shí)現(xiàn)了窗口擴(kuò)大,當(dāng)不再需要擴(kuò)大窗口時(shí),發(fā)送 移位值=0 就可以恢復(fù)到原窗口大小,即65535。

(3)選擇確認(rèn)選項(xiàng)(SACK, Selective Acknowledgements)

考慮這樣情況,主機(jī)A發(fā)送報(bào)文段12345,主機(jī)B收到135且報(bào)文無差錯(cuò), SACK用來確保只重傳缺少的報(bào)文段 ,而不是重傳所有報(bào)文段。

SACK選項(xiàng)需要2個(gè)功能字節(jié),一個(gè)用來指明使用SACK選項(xiàng)(SACK Permission),另一指明這個(gè)選項(xiàng)占多少字節(jié)。

那怎么形容丟失的報(bào)文段2,說明2的左右邊界分別是1、3。TCP的數(shù)據(jù)報(bào)文是有字塊邊界的,而這種邊界是由序列號(hào)表示的。

最多能指明多少個(gè)字節(jié)塊的邊界信息呢?答案是4個(gè)。這是因?yàn)檫x項(xiàng)字段最大是40字節(jié),去除2個(gè)功能字節(jié),序列號(hào)是32位即4字節(jié),并且需要左右邊界,所以(40-2)/8 = 4。

(4)時(shí)間戳選項(xiàng)(timestamps)

時(shí)間戳選項(xiàng)用來計(jì)算往返時(shí)間RTT,發(fā)送方在發(fā)送報(bào)文段時(shí)把當(dāng)前時(shí)鐘的時(shí)間值放入時(shí)間戳字段,接收方將該時(shí)間戳字段的值復(fù)制到確認(rèn)報(bào)文中,當(dāng)接收方收到確認(rèn)報(bào)文,對(duì)比確認(rèn)報(bào)文的時(shí)間戳(等于發(fā)送方發(fā)送報(bào)文段的時(shí)間戳)和現(xiàn)在的時(shí)鐘,即可算出RTT。

時(shí)間戳選項(xiàng)還可用于防止回繞序號(hào)PAWS。序列號(hào)只有32位,每2^32個(gè)序列號(hào)就會(huì)回繞(想想環(huán)形隊(duì)列),采用時(shí)間戳選項(xiàng)很容易區(qū)分相同序列號(hào)的報(bào)文段。

(5)NOP(NO-Operation)

TCP的頭部必須是4字節(jié)的倍數(shù),而大多數(shù)選項(xiàng)不是4字節(jié)倍數(shù),不足的用NOP填充。除此之外,NOP也用于分割不同的選項(xiàng)數(shù)據(jù),如窗口擴(kuò)大選項(xiàng)和SACK之間使用NOP隔離(下面的實(shí)例將看到這一點(diǎn))。

三、實(shí)例解析

3.1 概述

還是以訪問百度首頁(yè)為例,首先用DNS協(xié)議將URL解析成IP地址,接著在客戶機(jī)和服務(wù)器間建立TCP連接,用Wireshark俘獲的分組如下圖:

使用wireshark分析TCP/IP協(xié)議中TCP包頭的格式

圖4 Wireshark俘獲建立TCP連接分組

你一看會(huì)覺得有些奇怪,理論上應(yīng)該是3個(gè)分組的,怎么有6個(gè)分組?先不急,先把這6個(gè)報(bào)文收發(fā)示意圖作出來(結(jié)合時(shí)間和報(bào)文含義),如下:

圖5 TCP連接建立實(shí)例

從圖可知,連接建立伊始,客戶機(jī)發(fā)了兩個(gè)報(bào)文段,這也許是為了更快建立連接(假設(shè)有個(gè)請(qǐng)求報(bào)文段丟失,也不至于要等一段時(shí)間,重發(fā)報(bào)文)。接下來,以19、21、22(上圖紅色線條所示)分析TCP連接建立過程。

3.1 第一次握手19

Wireshark俘獲TCP連接第一次握手的報(bào)文段如下:

使用wireshark分析TCP/IP協(xié)議中TCP包頭的格式

圖6 TCP連接第一次握手實(shí)例

這里主要挑幾個(gè)字段分析:

標(biāo)志字段,SYN=1、ACK=0表示該數(shù)據(jù)段沒有使用 捎帶 的確認(rèn)域。

最大報(bào)文段長(zhǎng)度(MMS)1460是怎么來的,鏈路層的以太網(wǎng)物理特性決定數(shù)據(jù)幀長(zhǎng)度為1500(即MTU,最大傳輸單元),1460=1500-20(IP首部長(zhǎng)度)-20(TCP首部長(zhǎng)度)。不要被該報(bào)文首部長(zhǎng)度32字節(jié)所迷惑,這只是建立連接過程。MSS與MTU關(guān)系見下圖[2]:

使用wireshark分析TCP/IP協(xié)議中TCP包頭的格式

圖7 MSS與MTU關(guān)系

NOP字段,可以作為不足4倍數(shù)字節(jié)填充,也可作為選項(xiàng)間分隔,該報(bào)文段出現(xiàn)了3個(gè)NOP,具體功能見下圖:

使用wireshark分析TCP/IP協(xié)議中TCP包頭的格式

圖8 TCP報(bào)文NOP字段

3.3 第二次握手21

服務(wù)器響應(yīng)客戶端TCP報(bào)文段,此時(shí)確認(rèn)號(hào)為1了,SYN=1、ACK=1表明連接應(yīng)答捎帶一個(gè)確認(rèn),Wireshark俘獲分組如下:

使用wireshark分析TCP/IP協(xié)議中TCP包頭的格式

圖9 TCP連接第二次握手實(shí)例

為什么MSS是1452而不是1460?這是因?yàn)槭褂肞PPoE(Point-to-Point over Ethernet,可以使以太網(wǎng)的主機(jī)通過一個(gè)簡(jiǎn)單的橋接設(shè)備連到一個(gè)無端的接入集中器上[3])撥號(hào)上網(wǎng),PPoP首部是8個(gè)字節(jié),所以PPPoE的MTU是1492,MSS也就為1492-40=1452。

那么,TCP連接建立后數(shù)據(jù)傳輸?shù)腗SS是多少呢,1460 or 1452 or 536 ?我的理解是默認(rèn)值536,這樣理解對(duì)嗎?求指點(diǎn)!

3.4 第三次握手22

客戶機(jī)再次服務(wù)器的報(bào)文段,此時(shí)序列號(hào)和確認(rèn)號(hào)都為1,沒有選項(xiàng)字段,Wireshark俘獲的分組信息如下:

使用wireshark分析TCP/IP協(xié)議中TCP包頭的格式

圖10 TCP連接第三次握手實(shí)例

值得注意的,因?yàn)榇翱跀U(kuò)展大小協(xié)商未果,所以就不擴(kuò)大窗口了,即窗口大小最大為65535。

如此,TCP連接建立:-)

?

原文來自: 魚思故淵的專欄

使用wireshark分析TCP/IP協(xié)議中TCP包頭的格式


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論