TCP/IP 協(xié)議及數(shù)據(jù)格式

讀懂了TCP/IP協(xié)議拐纱,也就基本了解的網(wǎng)絡通信原理沸移。本文是參照研究生教材《網(wǎng)絡安全原理與應用》里面的內(nèi)容加上自己實際抓包數(shù)據(jù)分析結(jié)合而來证九,去年第一次看這本書妥泉,上面讀起來枯燥難懂,讀一天也看不到一頁隐绵,感覺說的又大又空之众,經(jīng)過一年的網(wǎng)絡編程實戰(zhàn)之后再回過頭來看這本書里面關于TCP/IP部分的講解,解開了我很多的疑問氢橙。但是書中也只是講個大概理論酝枢,有的地方描述不當或者不準確,網(wǎng)絡上也充斥很雜的一些文章悍手,有好的也有壞的帘睦,讓人看起來眼花。下面來結(jié)合書上的講解和我自己的理解來聊聊常見的TCP/IP協(xié)議坦康。

目錄

1竣付、TCP/IP 協(xié)議體系
2、IP協(xié)議
2.1 概念
2.2 功能
2.3 IP協(xié)議數(shù)據(jù)報的頭

2.3.1 IP協(xié)議頭部格式
2.3.2 IP協(xié)議頭部數(shù)據(jù)

2.4 IP地址分類

2.4.1 IP地址分類
2.4.2 子網(wǎng)掩碼滞欠、超網(wǎng)

3古胆、TCP協(xié)議
3.1 概念
3.2 TCP協(xié)議數(shù)據(jù)報的頭

3.2.1 TCP協(xié)議頭部格式
3.2.2 TCP報頭可選項字段
3.2 .3 TCP協(xié)議頭部數(shù)據(jù)

3.3 TCP通信數(shù)據(jù)交互細節(jié)和實踐

3.3.1 TCP建立連接的三次握手抓包數(shù)據(jù)部分
3.3.2 TCP數(shù)據(jù)交互抓包數(shù)據(jù)部分
3.3.3 TCP斷開連接的四次握手抓包數(shù)據(jù)部分

4、UDP協(xié)議
4.1 UDP協(xié)議數(shù)據(jù)報頭

4.1.1 UDP協(xié)議頭部格式
4.1.2 UDP協(xié)議頭部數(shù)據(jù)

5、結(jié)語

1逸绎、TCP/IP 協(xié)議體系

為了減少網(wǎng)絡設計的復雜性惹恃,大多數(shù)網(wǎng)絡都采用了分層結(jié)構(gòu)。不同的網(wǎng)絡棺牧,層的數(shù)量巫糙、名字、內(nèi)容和功能都不盡相同颊乘。相同網(wǎng)絡中参淹,一臺機器上的第N層與另一臺機器上的第N層利用第N層協(xié)議進行通信,協(xié)議基本上是雙方關于如何進行通信所達成的一致乏悄。
TCP/IP參考模型就是一個符合上面描述的網(wǎng)絡體系結(jié)構(gòu)浙值。他是依據(jù)他的兩個主要協(xié)議-TCP和IP而命名的。這一網(wǎng)絡細分一般是七層:應用層檩小、表示層开呐、會話層、傳輸層规求、網(wǎng)絡層负蚊、數(shù)據(jù)鏈路層、物理層颓哮,有關于這七層協(xié)議想要了解的可以看下百度百科講解的網(wǎng)絡七層協(xié)議,這里就不做過多的廢話鸵荠,重點在下面冕茅。

2、IP協(xié)議

2.1 概念

IP協(xié)議用于連接多個分組交換網(wǎng)蛹找,他提供在具有固定地址長度的主機之間傳送數(shù)據(jù)報姨伤,以及根據(jù)各個數(shù)據(jù)包大小的不同,在需要時進行分段和重組大數(shù)據(jù)報的功能庸疾。IP協(xié)議僅限于將數(shù)據(jù)從源端傳送到目的端乍楚,而不提供可靠的傳輸服務。在傳送出錯時届慈,IP協(xié)議通過互聯(lián)網(wǎng)控制消息協(xié)議(ICMP, Internet Control Message Protocol)報告徒溪。

2.2 功能

IP協(xié)議最基本的兩個功能:尋址和分段

尋址:IP協(xié)議根據(jù)數(shù)據(jù)報頭中所包含的目的地址將數(shù)據(jù)報傳輸?shù)侥康亩耍瑐魉瓦^程中對道路的選擇稱為路由
分段:當一些網(wǎng)絡只能傳送小數(shù)據(jù)報時金顿,IP協(xié)議將數(shù)據(jù)報分段并在報頭里面注明臊泌。數(shù)據(jù)包也可以被標記為“不可分段”,如果一個數(shù)據(jù)報被如此標記揍拆,那么在任何情況下都不準對他進行分段渠概,如果因此到不了目的地,那么數(shù)據(jù)包就會在中途被丟棄嫂拴。

2.3 IP協(xié)議數(shù)據(jù)報的頭:

2.3.1 IP協(xié)議頭部格式
IP協(xié)議數(shù)據(jù)報的頭格式.jpg
  • 版本:記錄數(shù)據(jù)報屬于哪個版本的協(xié)議播揪,例如可以用此區(qū)分出IPv4和IPv6贮喧,這個字段可以使得在不同版本間傳遞數(shù)據(jù)變得可行。

  • 頭部長:標明IP協(xié)議報頭有多長猪狈,其單位是32bit即4個字節(jié)箱沦,其最小值為5(5 x 4 = 20 byte,這個長度是除去可選項的長度)罪裹,從上圖中看出饱普,其規(guī)定頭部長為 4 bit,所以最大值為 15状共, 15 x 4 = 60 byte 可以算出可選項長度最大為40個字節(jié)(即 60 byte - 20 byte = 40 byte)

  • 服務類型:用來指示當數(shù)據(jù)報在一個特定網(wǎng)絡中傳輸時對實際服務質(zhì)量的要求是什么套耕,服務類型字段從左到右由一個3位的優(yōu)先順序字段、三個標志位(D峡继、T冯袍、R)和兩個保留位組成。優(yōu)先順序字段用于標志該數(shù)據(jù)報的優(yōu)先級碾牌,D康愤、T、R三個標志位分別代表是否對低延遲(Delay)舶吗、高吞吐量(Throughput)征冷、高可靠性(Reliability)有要求,不過實際上誓琼,現(xiàn)在的路由器都忽略服務類型這個字段检激。

  • 總長:是指整個數(shù)據(jù)報的長度,包括頭部和數(shù)據(jù)部分腹侣,單位是 1 個字節(jié)叔收,從圖上可以看出,規(guī)定總長位數(shù)為16bit傲隶,能存儲最大數(shù)據(jù)為65535個字節(jié)的數(shù)據(jù)報饺律。如長的數(shù)據(jù)報對大部分主機和網(wǎng)絡來說是不現(xiàn)實的。所有主機必須能夠接收長達576個字節(jié)的數(shù)據(jù)報(不管他們是以整個數(shù)據(jù)報到達還是以分片到達)跺株,源端主機在確認目的地址能夠接收大數(shù)據(jù)報的情況下才發(fā)送大于576字節(jié)的數(shù)據(jù)報复濒。

  • 標識:該標識由發(fā)送者設定值,主要為了目的主機組裝分段時判斷新到的報文分段屬于哪個分組乒省,所有屬于同一分組的報文分段都包含相同的標識芝薇。

  • 標記:長度為3bit,從前到后分別是保留位作儿、不可分段位(DF, Don't Fragment)和分段位(MF,More Fragment)洛二。
    保留為始終為 0
    DF位為 1 時表示該分組不能被分段
    MF位為 1 時表示后面還有該分組的分段,在有分段的情況下,除了最后一個分段該位為 0 外晾嘶,其他分段該位都為 1

  • 分段偏移:標記該分段在數(shù)據(jù)報的位置妓雾,單位是8個字節(jié),第一個分段的偏移是 0

  • 生命期:用來限制分組生命周期的計數(shù)器垒迂,單位是秒械姻,該字段長度為 8bit ,說明存儲的最大數(shù)值是 255 机断,在實際的應用過程中是以經(jīng)過的節(jié)點計數(shù)的楷拳,每經(jīng)過一個節(jié)點計數(shù)減 1 ,計數(shù)減到 0 時吏奸,分組要被丟棄欢揖。

  • 協(xié)議:指明IP層所封裝的上層協(xié)議類型,如ICMP -> 1奋蔚、IGMP -> 2 她混、TCP -> 6、UDP -> 17泊碑、EIGRP -> 88 坤按、OSPF -> 89等

  • 頭部效驗和:只對頭部進行效驗,由于頭部的一些字段始終在變化(例如:生命期字段)馒过,頭部效驗和在每個節(jié)點都得重新進行計算臭脓。

  • 源地址:發(fā)送報文段的IP地址

  • 目的地址:接收報文段的IP地址

  • 可選項:可選項對于主機和網(wǎng)關的IP模塊來說都是必須實現(xiàn)的树枫,可選是指它們在特定數(shù)據(jù)報中是否出現(xiàn)是可選的偎行,而不是指他們的實現(xiàn),每個可選項都以 1 個字節(jié)表明它的類型拓萌。其長度從1~40個字節(jié)之間不固定留凭,主要取決于設置的可選項數(shù)目,最終數(shù)據(jù)長度不夠32位的倍數(shù)要填充 0 補齊偎巢,主要是為了讓報頭長度是32位的整數(shù)倍蔼夜,一般正常的IP報文頭部都是沒有可選項的。
    目前已定義的可選項有 5 個压昼,分別是安全性(指明數(shù)據(jù)報的機密程度)求冷、嚴格路由選擇(后面給出所規(guī)定的完全路由)、寬松路由選擇(后面給出必須要經(jīng)過的路由)窍霞、記錄路由(記錄下所經(jīng)路由器附上其IP地址)匠题、時間戳(要求所經(jīng)路由器都附上其IP地址和時間標記)。

2.3.2 IP協(xié)議頭部數(shù)據(jù)

下面是我用抓包工具抓到的一個TCP斷開的四次握手但金,其他的咱不管韭山,先看第一次發(fā)送FIN類型數(shù)據(jù)包的IP報頭部分

IP數(shù)據(jù)報.png

最下面的是數(shù)據(jù),去掉以前面太網(wǎng)首部的14個字節(jié)開始是IP數(shù)據(jù)報頭部分,下面我們對著上面的格式來解析下

先單獨把IP報頭數(shù)據(jù)粘貼下來

//字節(jié)為單位 Hex+ASCII方式顯示
45 00 00 28 a2 ad 40 00 39 06 0f 71 b7 83 87 91 0a 16 46 87

//二進制 bit流顯示為
01000101 00000000 00000000 00101000 
10100010 10101101 01000000 00000000 
00111001 00000110 00001111 01110001 
10110111 10000011 10000111 10010001 
00001010 00010110 01000110 10000111
字段 位置 含義
版本 0-3 0100 屬于IPv4版本
頭部長 4-7 0101 表示頭部長度為20個字節(jié)(5 x 4 byte = 20 byte)
服務類型 8-31 00000000 ....
總長 32-47 00000000 00101000 IP數(shù)據(jù)報總長(不包括以太網(wǎng)首部) 為 40 個字節(jié)(40 x 1 byte = 40 byte)
標識 48 - 50 010 保留位為 0 钱磅, 不可分段數(shù)據(jù)報
分段偏移 51 - 63 00000 00000000 數(shù)據(jù)偏移為0梦裂,數(shù)據(jù)報屬于分組的第一個分段(其實這個數(shù)據(jù)包是不允許分段的,這里只是一個理論解釋)
生命期 64 - 71 00111001 生命期值是57盖淡,理論解釋是還可以經(jīng)過57個節(jié)點
協(xié)議 72 - 79 00000110 值為6年柠,表示上層為TCP協(xié)議
頭部效驗和 80 - 95 00001111 01110001 ....
源地址 96 - 127 10110111 10000011 10000111 10010001 因為IP地址在網(wǎng)絡中傳播是用網(wǎng)絡排序(大端)表示,所以直接按順序解析褪迟,16進制表示:b7.83.87.91冗恨,轉(zhuǎn)換成十進制表示為:183.131.135.145
目的地址 128 - 159 00001010 00010110 01000110 10000111 十進制點形式表示為:10.22.70.135
可選項 ~ ~ 沒有可選項

2.4 IP地址分類

2.4.1 IP地址分類

IP地址包含網(wǎng)絡號和主機號兩部分,網(wǎng)絡號代表一個子網(wǎng)絡味赃,主機號則表示該子網(wǎng)絡下某一臺具體的主機標號掀抹,IP地址根據(jù)功能和用途的不同可以劃分為五類。
A 類地址:1 . 0 . 0 . 0 ~ 126 . 255 . 255 . 255洁桌,前 8 位為網(wǎng)絡號渴丸,后 24 位為主機號
B 類地址:128 . 0 . 0 .0 ~ 191 . 255 . 255 . 255,前16位為主機號另凌,后16位為主機號
C 類地址:192 . 0 . 0 . 0 ~ 223 . 255 . 255 . 255谱轨,前24位為網(wǎng)絡號,后8位為主機號
D 類地址:224 . 0 . 0 .0 ~ 239 . 255 . 255 . 255
E 類地址:240 . 0 . 0 . 0 ~ 254 . 255 . 255 . 255

A吠谢、B土童、C三類地址是根據(jù)網(wǎng)絡規(guī)模大小來分配給用戶的,例如A類地址有24位的主機號工坊,同一個網(wǎng)絡下献汗,一個 A 類地址可以容納 2^24 - 2 = 16777213 臺主機,但是A類地址一共只能分配 126 個網(wǎng)絡(這里只是做一個理論上的運算王污,并不代表實際分配情況)罢吃,所以這類地址一般分配給那些為數(shù)不多的大網(wǎng)絡。D類地址用來多播昭齐,E類地址做保留地址尿招。
另外還有一些特殊地址:
①. 例如主機號全為 1 是該網(wǎng)絡的廣播地址(例如在一個C類地址的網(wǎng)絡中,192. 192 . 192 . 255 , 網(wǎng)絡號是前面三個字節(jié)阱驾, 主機號是后面的一個字節(jié)就谜,8位全為1,那么這個地址則是 網(wǎng)絡號位 192.192.192.0這個網(wǎng)絡的廣播地址)里覆。其中 255 . 255 . 255 . 255也是主機所在網(wǎng)絡的廣播地址丧荐;
②. 主機號全為 0 則是該網(wǎng)絡的網(wǎng)絡地址;
③. 127 . 0 . 0 . 0 ~ 127 . 255 . 255 . 255是主機會送地址喧枷,通常用來做網(wǎng)絡測試虹统,調(diào)試主機與路由是否連接暢通;
④. 其中 10 . 0 . 0 . 0 ~ 10 . 255 . 255 . 255弓坞、172 . 16 . 0 . 0 ~ 172 . 31 . 255 . 255、192 . 168 . 0 . 0 ~ 192 . 168 . 255 . 255保留給內(nèi)部網(wǎng)絡使用窟却。

2.4.2 子網(wǎng)掩碼昼丑、超網(wǎng)

傳統(tǒng)的IP地址分類確定是不能在網(wǎng)絡內(nèi)部使用路由,這樣對于較大的網(wǎng)絡夸赫,例如一個A類網(wǎng)絡菩帝,由于主機數(shù)太多而變得難以管理,為此引入了子網(wǎng)掩碼以從一個大網(wǎng)絡上劃分成一些小網(wǎng)絡茬腿。子網(wǎng)掩碼由一系列 0 和 1 構(gòu)成呼奢,通過與IP地址做與運算來得到一個IP地址的網(wǎng)絡號,例如A類地址的子網(wǎng)掩碼是 255 . 0 . 0 . 0切平,B類地址的子網(wǎng)掩碼是 255 . 255 . 0 . 0握础,C類地址的子網(wǎng)掩碼是 255 . 255 . 255 . 0。要是想將一個B類地址(例:129 . 145 . 0 . 0)劃分為多個小的C類網(wǎng)絡悴品,只需要將其子網(wǎng)掩碼設為 255 . 255 . 255 . 0就可以了禀综,這樣 129 . 145 . 1 . 0和 129 . 145 . 2 . 0就屬于不同網(wǎng)絡了,因為雖然是B類地址苔严,但是與給定的子網(wǎng)掩碼做與運算出來的網(wǎng)絡號不一樣了定枷,就屬于不同網(wǎng)絡。像這樣通過子網(wǎng)掩碼將一個大網(wǎng)絡劃分成若干個小網(wǎng)絡叫做劃分子網(wǎng)届氢。
超網(wǎng):與子網(wǎng)功能相反欠窒,將若干個小網(wǎng)絡劃分成一個大網(wǎng)絡。例如一個單位分配到了8個C類(前三個字節(jié)為網(wǎng)絡號)地址:202 . 120 . 224 . 0 ~ 202 . 120 . 231 . 0退子,只要將其子網(wǎng)掩碼設置為 255 . 255 . 248 . 0 就能使這些C類網(wǎng)絡相通岖妄。(PS:這個結(jié)果是怎么得來的我現(xiàn)在還不明白,等日后明白了再補上)

3寂祥、TCP協(xié)議

3.1 概念

TCP協(xié)議是用于主機到主機的通信協(xié)議荐虐。他是面向連接的端到端的可靠協(xié)議,提供可靠字節(jié)流傳輸和對上層應用提供連接服務丸凭。TCP協(xié)議建立在IP協(xié)議的基礎之上福扬,可以根據(jù)IP協(xié)議提供的服務傳輸大小不定的數(shù)據(jù)段。IP協(xié)議負責數(shù)據(jù)的分段贮乳、重組及在多種網(wǎng)絡和互聯(lián)的網(wǎng)關間傳輸數(shù)據(jù)報。
為了在不可靠的IP數(shù)據(jù)傳輸服務上實現(xiàn)面向連接的可靠數(shù)據(jù)傳輸恬惯,TCP協(xié)議使用序列號和應答號來保證其傳輸?shù)目煽啃韵虿穑琓CP協(xié)議是面向字節(jié)流的,每個字節(jié)都有一個序列號酪耳,一個數(shù)據(jù)段的第一個字節(jié)的序列號將隨同數(shù)據(jù)段被發(fā)送浓恳,并且作為這個數(shù)據(jù)段的序列號刹缝。數(shù)據(jù)段同時還帶有一個應答序號,表明它期望對方下次發(fā)送的字節(jié)的順序號颈将。當TCP協(xié)議傳輸一個數(shù)據(jù)段的時候梢夯,會同時將其放入重傳隊列,并啟動一個定時器晴圾。如果這個數(shù)據(jù)段的應答能在定時器超時前收到颂砸,那么就將它從重傳隊列中移除,否則重發(fā)此數(shù)據(jù)段死姚。應答未能收到人乓,既可能是接收方未收到所發(fā)數(shù)據(jù)段,也可能是應答本身丟失都毒。
TCP協(xié)議提供了端口來區(qū)分他所處理的不同數(shù)據(jù)流色罚。由于端口號是由操作系統(tǒng)、TCP協(xié)議進程或用戶自行確定账劲,所以有可能不唯一戳护。為此將網(wǎng)絡地址同端口號組合起來形成套接字保證其在整個互聯(lián)網(wǎng)絡上的唯一性。

3.2 TCP協(xié)議數(shù)據(jù)報的頭

3.2.1 TCP協(xié)議頭部格式
TCP協(xié)議數(shù)據(jù)段的頭格式.jpg
  • 源端口:發(fā)送數(shù)據(jù)端套接字的端口號

  • 目的端口:目的套接字端口號

  • 順序號:該數(shù)據(jù)報第一個數(shù)據(jù)字節(jié)的序列號瀑焦,用作標識該報文段序列號

  • 應答號:存放的是發(fā)送方期望收到的數(shù)據(jù)段序號腌且,算作是對收到報文的一個確認。ACK標志為 0 時蝠猬,應答號部分無效(例如首個連接的[SYN]數(shù)據(jù)包)切蟋,ACK標志為1時應答號才有效

  • TCP首部長度:標明TCP協(xié)議報頭長度,單位是32bit即4個字節(jié)榆芦,其最小值為5(5 x 4 = 20 byte柄粹,這個長度是除去可選項的長度),從上圖中看出匆绣,其規(guī)定頭部長為 4 bit驻右,所以最大值為 15, 15 x 4 = 60 byte可以算出可選項長度大為40個字節(jié)(60 byte - 20 byte = 40 byte)

  • 保留位:保留字段長度為3位崎淳,必須全置為0

  • 標記

標志位簡寫 全寫 含義
NS Nonce 有效排除潛在的ECN濫用
CWR Congestion Window Reduced 擁塞窗口減少標志
ECE ECN-Echo ECN標志
URG Urgent 緊急指針有效性標志
ACK Acknowledgment 確認序號有效性標志堪夭,一旦一個連接建立起來,該標志總被置為1
PSH Push Push標志(接收方應盡快將報文段提交至應用層)
RST Reset 重置連接標志
SYN Synchronization 同步序號標志(建立連接時候使用)
FIN Fin 傳輸數(shù)據(jù)結(jié)束標志(斷開連接時使用)
  • 窗口:表示發(fā)送方還可以接受數(shù)據(jù)大小拣凹,防止對方發(fā)送數(shù)據(jù)大于自己的緩沖數(shù)據(jù)區(qū)森爽,從應答字段的順序號開始計。

  • 效驗和:效驗和覆蓋整個TCP報文段嚣镜,強制字段爬迟,由發(fā)送端計算存儲,接收端進行驗證

  • 緊急指針:當Urgent標志置1時菊匿,緊急指針才有效

  • 可選項:可選項可以有 0 到多個付呕,可選項字段以第一個字節(jié)表明其類型计福,第二個字節(jié)表示該可選項的總長度,后面緊跟可選項的值(長度為可選項的總長度-2)徽职∠笥保可選項字段可以從任何字節(jié)邊界開始,但若最后選項長度不足的話姆钉,要填充以補足定義的數(shù)據(jù)段長度说订。具體解釋請看下面 3.2.2

3.2.2 TCP報頭可選項字段

TCP報頭可選項字段的數(shù)據(jù)一般拼接格式(不是全部可選項都是這個格式)
類型kind(1byte) + 長度length(1byte) + 值value(length-2byte)

TCP報頭可選項和含義:

kind 字段 長度(單位byte)
0 End of Option List (EOL) 0 (沒有長度,只有類型)
1 No-Operation (NOP) 0 (沒有長度育韩,只有類型)
2 Maximum segment size (MSS) 1 (用一個字節(jié)來表示該可選項的總長)
3 Window scale 1 (用一個字節(jié)來表示該可選項的總長)
4 SACK Permitted 1 (用一個字節(jié)來表示該可選項的總長)
5 SACK 1 (用一個字節(jié)來表示該可選項的總長)
8 Timestamps 1 (用一個字節(jié)來表示該可選項的總長)
  • ①. End of Option List (EOL):kind = 0克蚂,當可選項總長度不夠32位的倍數(shù),用該可選項來填補筋讨,實際就是用 0 填補

  • ②. No-Operation (NOP):kind = 1埃叭,no operation,設計該字段主要是用來明確不同可選項之間的分割點悉罕,假設有多個可選項的情況下赤屋,一般用該可選項來分割下,因此在一個數(shù)據(jù)包中出現(xiàn)多個nop 也不奇怪的壁袄。注意 No-Operation 可選項沒有長度和值类早,只有一個類型占一個字節(jié),也就是有涉及到該可選項解析只需解析一個字節(jié)嗜逻,后面可能是另一個可選項的類型

  • ③. Maximum segment size (MSS):kind = 2涩僻,最大報文傳輸段,每一個TCP報文段中數(shù)據(jù)字段的最大長度栈顷,注意:只是數(shù)據(jù)部分的字段逆日,不包括TCP的頭部。TCP在三次握手中萄凤,每一方都會通告其期望收到的MSS(MSS只出現(xiàn)在SYN數(shù)據(jù)包中)如果一方不接受另一方的MSS值則定位默認值536byte室抽。
    MSS值太小或太大都是不合適,太小靡努,例如MSS值只有1byte坪圾,那么為了傳輸這1byte數(shù)據(jù),至少要消耗20字節(jié)IP頭部+20字節(jié)TCP頭部=40byte惑朦,這還不包括其二層頭部所需要的開銷兽泄,顯然這種數(shù)據(jù)傳輸效率是很低的。MSS過大漾月,導致數(shù)據(jù)包可以封裝很大病梢,那么在IP傳輸中分片的可能性就會增大,接收方在處理分片包所消耗的資源和處理時間都會增大栅屏,如果分片在傳輸中還發(fā)生了重傳飘千,那么其網(wǎng)絡開銷也會增大。因此合理的MSS是至關重要的栈雳。MSS的合理值應為保證數(shù)據(jù)包不分片的最大值护奈。對于以太網(wǎng)MSS可以達到1460byte (MTU(1500byte) - IP首部(20byte) - TCP首部(20byte) = 1460byte)。

  • ④. Window scale:kind = 3哥纫,窗口擴大選項霉旗,我們知道TCP最大的窗口大小為65535byte,在早期網(wǎng)絡這是夠用的蛀骇,但隨著各種復雜網(wǎng)絡的產(chǎn)生厌秒,特別是類似衛(wèi)星通信這種時延和帶寬都比較大的通信產(chǎn)生,需要更大窗口來滿足性能和高吞吐率擅憔,于是窗口擴大選項便產(chǎn)生了鸵闪。
    我們假設 主機A — 主機B 是一條高速的WAN鏈路,A向B發(fā)送大量數(shù)據(jù)暑诸,由于有足夠帶寬蚌讼,那么A在很短時間內(nèi)就可以發(fā)送完 65535byte 的數(shù)據(jù),而由于窗口過小个榕,A只能停止發(fā)送篡石,直到B對A發(fā)送的數(shù)據(jù)進行ACK確認。假設通信距離較遠西采,延時也由于距離的原因變大凰萨,這么一發(fā)一確認可能需要等上很長時間,在這個等待的時間里面 A-B 是沒有實際數(shù)據(jù)發(fā)送的械馆,因此大量的時間被浪費在了等待對方回應上胖眷。
    這個時候我們可以通過增大窗口的大小來使一次可以傳輸更多的數(shù)據(jù),從而減少等待確認的時間狱杰。
    窗口擴大選項占值占一個字節(jié)瘦材,表示移位值S。新的窗口值等于TCP首部的窗口位數(shù)從16增大到(16+S)仿畸。這相當于把窗口值向左移動S位后獲得實際的窗口大小食棕。移位值準許使用的最大值是14,相當于窗口最大值增大到 2^(16+14) = 1073741824 byte = 1048576 kb = 1024 M = 1GB错沽,方便理解和記憶一般用TCP頭中的窗口值 x 2^S來表示實際窗口的大小簿晓。窗口擴大選項在TCP建立之初進行協(xié)商,如果已經(jīng)實現(xiàn)了窗口擴大千埃,當不再需要其擴大窗口時憔儿,發(fā)送S=0選項就可以恢復到窗口大小為16位。

  • ⑤. SACK Permitted: kind = 4放可,選擇確認選項可以使用谒臼,SACK Permitted 選項在TCP建立連接時由SYN數(shù)據(jù)包中加上(只有類型和長度朝刊,沒有值),表示該鏈接允許接下來SACK的實現(xiàn)蜈缤。

  • ⑥. SACK: kind = 5拾氓,選擇確認選項(Selective Acknowledgements ),我們假設TCP傳輸中有這種情況出現(xiàn)底哥,收到的報文無差錯咙鞍,只是未按序列號,中間還缺少一些序列號趾徽,那么能否只傳輸缺少的數(shù)據(jù)续滋,而不重傳已經(jīng)正確到達的數(shù)據(jù)?這就是選擇確認的技術孵奶。
    舉例:主機A向主機B傳輸3個數(shù)據(jù)包疲酌,五個包的序號分別是1 2 3,主機B只收到了序號為 1 和 3 的數(shù)據(jù)包了袁,而中間的2沒有收到徐勃,那么如果設置可選項SACK的值,這樣就可以讓A主機知道只傳輸丟失的序列號為2的塊號早像。
    原理:拿上面的例子來說僻肖,丟了2號塊,收到1和3塊號的數(shù)據(jù)包卢鹦,那么回給主機A的確認包對于設置SACK值來說就要有一個上下的邊界(表明從序列號為多少的字節(jié)傳輸?shù)叫蛄刑枮槎嗌俚淖止?jié)中間這段數(shù)據(jù))臀脏,序列號在TCP報頭中占4個字節(jié),表示上下邊界就需要消耗8個字節(jié)(4byte x 2)冀自,由上面講的可知IP可選項的最大長度為 40 個字節(jié)揉稚,加上表示SACK字段需要占用1個字節(jié),表示長度也需要占一個字節(jié)熬粗,因此最多可以指明4個字塊的邊界信息( (40 - 2) / 8 ≈ 4)搀玖。

  • ⑦. Timestamps:kind = 8時間戳選項驻呐,時間戳選項占10個字節(jié)灌诅,其中最主要的字段時間戳字段(4字節(jié))和時間戳回送回答字段(4字節(jié))。
    時間戳選項主要的功能有兩個:

    • 用來計算往返時間RTT含末,發(fā)送方在發(fā)送報文段時把當前時鐘的時間值放入時間戳字段猜拾,接收方在確認該報文段時把當前時間賦值到時間戳回送回答字段。因此佣盒,發(fā)送方在收到確認報文后挎袜,可以準確計算出RTT。
    • PAWS:防止回繞的序號,我們知道序列號只有32位盯仪,而每增加2^32 = 4294967295 個序列號后就會重復使用原來用過的序列號紊搪。假設我們有一條高速網(wǎng)絡,通信的主機雙方有足夠大的帶寬用來快速的傳輸數(shù)據(jù)全景。例如1Gb/s的速率發(fā)送報文段嗦明,則不到35秒鐘數(shù)據(jù)字節(jié)的序列號就會重復。這樣對TCP傳輸帶來混亂的情況蚪燕。而采用時間戳選項,可以很容易的分辨出相同序列號的數(shù)據(jù)報奔浅,哪個是最近發(fā)送馆纳,哪個是以前發(fā)送的。
3.2 .3 TCP協(xié)議頭部數(shù)據(jù)

下面是我用抓包工具抓到的一個TCP斷開的四次握手汹桦,其他的咱不管鲁驶,先看第一次發(fā)送FIN類型數(shù)據(jù)包的TCP數(shù)據(jù)的頭部

IP數(shù)據(jù)報.png

最下面的是數(shù)據(jù),去掉以前面太網(wǎng)首部 14 個字節(jié)和IP報頭 20 個字節(jié)開始是TCP數(shù)據(jù)報頭部分舞骆,下面我們對著上面的格式來解析下

先單獨把TCP頭部數(shù)據(jù)粘貼下來

//字節(jié)為單位 Hex+ASCII方式顯示
00 50 d2 21 de ce 92 2b ba da c8 db 50 11 01 9b 57 64 00 00  

//二進制 bit流顯示
00000000 01010000 11010010 00100001 
11011110 11001110 10010010 00101011 
10111010 11011010 11001000 11011011 
01010000 00010001 00000001 10011011 
01010111 01100100 00000000 00000000   
字段 位置 含義
源端口 0 - 15 00000000 01010000 網(wǎng)絡字節(jié)排序解析钥弯,源端口為 80
目的端口 16 - 31 11010010 00100001 目的端口 53793
順序號 32 - 63 11011110 11001110 10010010 00101011 順序號為~
應答號 64 - 95 10111010 11011010 11001000 11011011 確認號為~
TCP首部長度 96 - 99 0101 長度為20字節(jié) 5 x 4 byte = 29 byte
保留位 100 - 102 000 ~
標記 103 - 111 0 00010001 ACK位為 1 標記應答號有效,F(xiàn)IN位為 1 表示該數(shù)據(jù)包為結(jié)束標識數(shù)據(jù)包
窗口 112 - 127 00000001 10011011 窗口值為411督禽,標識發(fā)送套接字緩存區(qū)最大容納411字節(jié)數(shù)據(jù)
效驗和 128 - 143 01010111 01100100 ~
緊急指針 144 - 159 00000000 00000000 緊急指針標記位(URG)為1時這里的數(shù)據(jù)才有效
可選項 ~ ~ ~

3.3 TCP通信數(shù)據(jù)交互細節(jié)和實踐

關于TCP連接的三次握手脆霎、中間數(shù)據(jù)交互以及斷開連接的四次握手理論部分請參考我前面的一片文章套接字(Socket)編程(二) 內(nèi)部通信原理,這里就不做重復的解釋了

3.3.1 TCP建立連接的三次握手抓包數(shù)據(jù)部分

首先來看下抓包過程截圖

TCP建立連接的三次握手.png

① 客戶端發(fā)送[SYN]同步消息

//以太網(wǎng)頭部+IP報頭+TCP報頭+TCP數(shù)據(jù)(字節(jié)為單位位 Hex+ASCII方式顯示)
88 25 93 02 b7 8c 78 4f 43 5b 56 75 08 00 45 00
00 40 00 00 40 00 40 06 f6 72 0a 16 46 87 cb d0
27 d8 d2 23 01 bb 2e f0 89 c5 00 00 00 00 b0 02
ff ff b3 39 00 00 02 04 05 b4 01 03 03 05 01 01
08 0a 32 a6 80 43 00 00 00 00 04 02 00 00

//提取TCP報頭+TCP數(shù)據(jù)(去掉以太網(wǎng)頭部14byte和IP報頭20byte)
d2 23 01 bb 
2e f0 89 c5 
00 00 00 00 
b0 02 ff ff 
b3 39 00 00 
02 04 05 b4 01 03 03 05 01 01 08 0a 32 a6 80 43 00 00 00 00 04 02 00 00

解析:從上面可以解析出源端口號為:0xd23 = 353795狈惫;目的端口號:0x01bb = 443睛蛛;序列號:SEQ = 0x2ef089c5;ACK = 0x00000000胧谈;TCP報頭長為:0xb = 11(32 bit)忆肾,11 x 4 byte = 44 byte,即TCP報頭長為 44 個字節(jié)菱肖;窗口大小為 0xffff = 65535 byte客冈;
保留位和標志位:0x002 = 0b000000000010;按位解析標志位為 0b000000010稳强,NS: 0场仲,CWR: 0,ECE: 0退疫,URG: 0燎窘,ACK: 0,PSH: 0蹄咖,RST: 0褐健,SYN: 1,F(xiàn)IN: 0,從解析里面可以看出該報文ACK字段無效蚜迅,只有SYN字段有效舵匾,是第一個請求連接[SYN]同步數(shù)據(jù)報
可選項部分:可以看出該TCP報頭最后的24個字節(jié)表示可選項谁不,解析如下

02 04 05 b4            kind = 2, len = 4坐梯,MMS Value = 0x05b4 表示MSS = 1460byte
01                     kind = 1  No-Operation
03 03 05               kind = 3,len = 3刹帕,value = 0x05  窗口選項偏移5位吵血,即實際窗口大小為 0xffff x 2^5
01                     kind = 1  No-Operation
01                     kind = 1  No-Operation
08 0a 32 a6 80 43 00 00 00 00   kind = 8,len = 10  時間戳選項偷溺,Timestamp Value(TSval): 0x32a68043 = 849772611蹋辅,Timestamp echo reply(TSecr): 0
04 02                  kind = 4,len  =2  SACK Permitted挫掏,選擇確認選項有效
00 00                  kind = 0  補充夠32bit侦另,即4byte的倍數(shù)

② 服務器回復[SYN+ACK]消息

//以太網(wǎng)頭部+IP報頭+TCP報頭+TCP數(shù)據(jù)(字節(jié)為單位位 Hex+ASCII方式顯示)
78 4f 43 5b 56 75 88 25 93 02 b7 8c 08 00 45 00
00 3c 66 f2 00 00 38 06 d7 84 cb d0 27 d8 0a 16
46 87 01 bb d2 23 f4 36 9f 4a 2e f0 89 c6 a0 12
71 20 a5 e3 00 00 02 04 05 a0 04 02 08 0a d6 c8
42 f0 32 a6 80 43 01 03 03 08

//提取TCP報頭+TCP數(shù)據(jù)(去掉以太網(wǎng)頭部14byte和IP報頭20byte)
01 bb d2 23 
f4 36 9f 4a 
2e f0 89 c6 
a0 12 71 20 
a5 e3 00 00 
02 04 05 a0 04 02 08 0a d6 c8 42 f0 32 a6 80 43 01 03 03 08

解析:從上面可以解析出源端口號為:0x01bb = 443;目的端口號:0xd23 = 353795尉共;序列號:SEQ = 0xf4369f4a褒傅;ACK = 0x2ef089c6(即第一個包的SEQ+1,對第一個同步包的確認)袄友;TCP報頭長為:0xa = 10(32 bit)殿托,10 x 4 byte = 40 byte,即TCP報頭長為 40 個字節(jié)剧蚣;窗口大小為 0x7120 =28960 byte碌尔;
保留位和標志位:0x012 = 0b000000010010;按位解析標志位為 0b000010010券敌,NS: 0唾戚,CWR: 0,ECE: 0待诅,URG: 0叹坦,ACK: 1,PSH: 0卑雁,RST: 0募书,SYN: 1,F(xiàn)IN: 0测蹲,從解析里面可以看出該報文ACK字段和SYN字段有效莹捡,是對第一個連接請求包的確認[SYN+ACK]數(shù)據(jù)報
可選項部分:可以看出該TCP報頭最后的20個字節(jié)表示可選項篮赢,解析如下

02 04 05 a0       kind = 2, len = 4齿椅,value = 0x05a0 表示MSS = 1440 byte
04 02             kind = 4  SACK Permitted,選擇確認選項有效
08 0a d6 c8 42 f0 32 a6 80 43  kind = 8, len = 10 時間戳選項启泣,Timestamp Value(TSval): 0xd6c842f0 = 36033448560涣脚,Timestamp echo reply(TSecr): 0x32a68043 = 849772611
01   kind = 1     NOP
03 03 08  kind = 3, len = 3,value = 8 窗口選項偏移8位寥茫,即實際窗口大小為 0x7120 x 2^8

③ 客戶端回復[ACK]消息遣蚀,表示連接成功

//以太網(wǎng)頭部+IP報頭+TCP報頭+TCP數(shù)據(jù)(字節(jié)為單位位 Hex+ASCII方式顯示)
88 25 93 02 b7 8c 78 4f 43 5b 56 75 08 00 45 00
00 34 00 00 40 00 40 06 f6 7e 0a 16 46 87 cb d0
27 d8 d2 23 01 bb 2e f0 89 c6 f4 36 9f 4b 80 10
10 09 35 75 00 00 01 01 08 0a 32 a6 80 82 d6 c8
42 f0

//提取TCP報頭+TCP數(shù)據(jù)(去掉以太網(wǎng)頭部14byte和IP報頭20byte)
d2 23 01 bb 
2e f0 89 c6 
f4 36 9f 4b 
80 10 10 09 
35 75 00 00 
01 01 08 0a 32 a6 80 82 d6 c8 42 f0

解析:從上面可以解析出源端口號為:0xd23 = 353795;目的端口號:0x01bb = 443纱耻;序列號:SEQ = 0x2ef089c6芭梯;ACK = 0xf4369f4b (即上一個包的SEQ +1,對上一個同步包的確認)弄喘;TCP報頭長為:0x8 = 8(32 bit)玖喘,8 x 4 byte = 32 byte,即TCP報頭長為 32 個字節(jié)限次;窗口大小為 0x1009 =4105 byte;
保留位和標志位:0x010 = 0b000000010000柴灯;按位解析標志位為 0b000010000卖漫,NS: 0,CWR: 0赠群,ECE: 0羊始,URG: 0,ACK: 1查描,PSH: 0突委,RST: 0,SYN: 0冬三,F(xiàn)IN: 0匀油,從解析里面可以看出該報文ACK字段有效,是對上一個服務器確認請求連接包的確認[ACK]數(shù)據(jù)報勾笆;
可選項部分:可以看出該TCP報頭最后的12個字節(jié)表示可選項敌蚜,解析如下

01     kind = 1     NOP
01     kind = 1     NOP
08 0a 32 a6 80 82 d6 c8 42 f0  時間戳選項,Timestamp Value(TSval): 0x32a68082 = 849772674窝爪,Timestamp echo reply(TSecr): 0xd6c842f0 = 36033448560
3.3.2 TCP數(shù)據(jù)交互抓包數(shù)據(jù)部分

下面來一組TCP連接中間交換數(shù)據(jù)部分

① 客戶端發(fā)送數(shù)據(jù)

//以太網(wǎng)頭部+IP報頭+TCP報頭+TCP數(shù)據(jù)(字節(jié)為單位位 Hex+ASCII方式顯示)
88 25 93 02 b7 8c 78 4f 43 5b 56 75 08 00 45 00
00 f5 00 00 40 00 40 06 f5 bd 0a 16 46 87 cb d0
27 d8 d2 23 01 bb 2e f0 89 c6 f4 36 9f 4b 80 18
10 09 43 d2 00 00 01 01 08 0a 32 a6 80 82 d6 c8
42 f0  + 193byte TCP數(shù)據(jù)

//提取TCP報頭+TCP數(shù)據(jù)(去掉以太網(wǎng)頭部14byte和IP報頭20byte)
d2 23 01 bb 
2e f0 89 c6 
f4 36 9f 4b 
80 18 10 09 
43 d2 00 00 
01 01 08 0a 32 a6 80 82 d6 c8 42 f0  
+ 193byte TCP數(shù)據(jù)

解析:從上面可以解析出源端口號為:0xd23 = 353795弛车;目的端口號:0x01bb = 443;序列號:SEQ = 0x2ef089c6蒲每;ACK = 0xf4369f4b纷跛;TCP報頭長為:0x8 = 8(32 bit),8 x 4 byte = 32 byte邀杏,即TCP報頭長為 32 個字節(jié)贫奠;窗口大小為 0x1009 =4105 byte;
保留位和標志位:0x018 = 0b000000011000;按位解析標志位為 0b000011000叮阅,NS: 0刁品,CWR: 0,ECE: 0浩姥,URG: 0挑随,ACK: 1,PSH: 1勒叠,RST: 0兜挨,SYN: 0,F(xiàn)IN: 0眯分,從解析里面可以看出該報文ACK字段和PUSH有效拌汇,希望傳輸層盡快將數(shù)據(jù)交到應用層
可選項部分:可以看出該TCP報頭最后的12個字節(jié)表示可選項

② 服務器端回復ACK確認

//以太網(wǎng)頭部+IP報頭+TCP報頭+TCP數(shù)據(jù)(字節(jié)為單位位 Hex+ASCII方式顯示)
78 4f 43 5b 56 75 88 25 93 02 b7 8c 08 00 45 00
00 34 66 fa 00 00 38 06 d7 84 cb d0 27 d8 0a 16
46 87 01 bb d2 23 f4 36 9f 4b 2e f0 8a 87 80 10
00 76 44 09 00 00 01 01 08 0a d6 c8 43 2e 32 a6
80 82

//提取TCP報頭+TCP數(shù)據(jù)(去掉以太網(wǎng)頭部14byte和IP報頭20byte)
01 bb d2 23 
f4 36 9f 4b 
2e f0 8a 87 
80 10 00 76 
44 09 00 00 
01 01 08 0a d6 c8 43 2e 32 a6 80 82

解析:從上面可以解析出源端口號為:0x01bb = 443弊决;目的端口號:0xd23 = 353795噪舀;序列號:SEQ = 0xf4369f4b;
ACK = 0x2ef08a87(前面數(shù)據(jù)包的SEQ(0x2ef089c6) + 193 = 0x2ef08a87 PS:這里需要注意下飘诗,很多網(wǎng)絡和書上都說這個ACK的值應該是上個包的SEQ + TCP數(shù)據(jù)大小 + 1与倡,這種說法是不準確的,拿上個數(shù)據(jù)來講昆稿,數(shù)據(jù)的第一個字節(jié)序號也就是上個數(shù)據(jù)包的序號是0x2ef089c6纺座,那么第二個字節(jié)序號就是0x2ef089c7,現(xiàn)在TCP數(shù)據(jù)一共是193個字節(jié)溉潭,那么接下來的第194個字節(jié)序號應該是0x2ef089c6 + 193 = 0x2ef08a87净响,所以服務器期望收到下個包的序號應該是0x2ef08a87)
TCP報頭長為:0x8 = 8(32 bit)喳瓣,8 x 4 byte = 32 byte馋贤,即TCP報頭長為 32 個字節(jié)困肩;窗口大小為 0x0076 = 118 byte叮喳;
保留位和標志位:0x010 = 0b000000010000顿颅;按位解析標志位為 0b000010000飞主,NS: 0庙楚,CWR: 0分唾,ECE: 0校套,URG: 0纯续,ACK: 1仁讨,PSH: 0羽莺,RST: 0,SYN: 0洞豁,F(xiàn)IN: 0盐固,從解析里面可以看出該報文ACK字段有效荒给,對上個數(shù)據(jù)包的一個確認,表示可以接著傳送后面的數(shù)據(jù)了(從字節(jié)編號為0x2ef08a87開始)刁卜,是一個[ACK]確認數(shù)據(jù)報志电;
可選項部分:可以看出該TCP報頭最后的12個字節(jié)表示可選項

3.3.3 TCP斷開連接的四次握手抓包數(shù)據(jù)部分

首先來看下抓包過程截圖

TCP斷開四次握手.png

① 主動斷開方發(fā)送[FIN]數(shù)據(jù)報

//以太網(wǎng)頭部+IP報頭+TCP報頭+TCP數(shù)據(jù)(字節(jié)為單位位 Hex+ASCII方式顯示)
78 4f 43 5b 56 75 88 25 93 02 b7 8c 08 00 45 00
00 34 89 5e 40 00 39 06 a4 3f 7a e4 48 a5 0a 16
46 87 00 50 d2 1e a9 ba 9e eb 65 ee 19 b0 80 11
03 cc 9e 50 00 00 01 01 08 0a 41 fa 79 05 32 a6
38 20

//提取TCP報頭+TCP數(shù)據(jù)(去掉以太網(wǎng)頭部14byte和IP報頭20byte)
00 50 d2 1e 
a9 ba 9e eb 
65 ee 19 b0 
80 11 03 cc 
9e 50 00 00 
01 01 08 0a 41 fa 79 05 32 a6 38 20

解析:從上面可以解析出源端口號為:0x0050 =80;目的端口號:0xd21e =53790蛔趴;序列號:SEQ = 0xa9ba9eeb挑辆;ACK = 0x65ee19b0;TCP報頭長為:0x8 = 8(32 bit)孝情,8 x 4 byte = 32 byte鱼蝉,即TCP報頭長為 32 個字節(jié);窗口大小為 0x03cc =972 byte箫荡;
保留位和標志位:0x011 = 0b000000010001魁亦;按位解析標志位為 0b000010001,NS: 0羔挡,CWR: 0洁奈,ECE: 0,URG: 0绞灼,ACK: 1利术,PSH: 0,RST: 0镀赌,SYN: 0氯哮,F(xiàn)IN: 1际跪,從解析里面可以看出該報文ACK字段和FIN字段有效商佛,是請求斷開連接的[FIN+ACK]數(shù)據(jù)報
可選項部分:可以看出該TCP報頭最后的12個字節(jié)表示可選項姆打,解析如下

01     kind = 1     NOP
01     kind = 1     NOP
08 0a 41 fa 79 05 32 a6 38 20 時間戳選項良姆,Timestamp Value(TSval): 1106934021,Timestamp echo reply(TSecr): 849754144

② 被斷開方發(fā)送[ACK]數(shù)據(jù)包幔戏,對主動對方數(shù)據(jù)報進行確認

//以太網(wǎng)頭部+IP報頭+TCP報頭+TCP數(shù)據(jù)(字節(jié)為單位位 Hex+ASCII方式顯示)
88 25 93 02 b7 8c 78 4f 43 5b 56 75 08 00 45 00
00 34 00 00 40 00 40 06 26 9e 0a 16 46 87 7a e4
48 a5 d2 1e 00 50 65 ee 19 b0 a9 ba 9e ec 80 10
10 00 1d d9 00 00 01 01 08 0a 32 a6 ac 63 41 fa
79 05

//提取TCP報頭+TCP數(shù)據(jù)(去掉以太網(wǎng)頭部14byte和IP報頭20byte)
d2 1e 00 50 
65 ee 19 b0 
a9 ba 9e ec 
80 10 10 00 
1d d9 00 00 
01 01 08 0a 32 a6 ac 63 41 fa 79 05

解析:從上面可以解析出源端口號為:0xd21e =53790玛追;目的端口號:0x0050 =80;序列號:SEQ = 0x65ee19b0闲延;ACK = 0xa9ba9eec 痊剖;TCP報頭長為:0x8 = 8(32 bit),8 x 4 byte = 32 byte垒玲,即TCP報頭長為 32 個字節(jié)陆馁;窗口大小為 0x1000 = 4096 byte;
保留位和標志位:0x010 = 0b000000010000合愈;按位解析標志位為 0b000010000叮贩,NS: 0击狮,CWR: 0,ECE: 0益老,URG: 0彪蓬,ACK: 1,PSH: 0捺萌,RST: 0档冬,SYN: 0,F(xiàn)IN: 0互婿,從解析里面可以看出該報文ACK字段有效捣郊,是對斷開連接請求的確認[ACK]數(shù)據(jù)報
可選項部分:可以看出該TCP報頭最后的12個字節(jié)表示可選項慈参,解析如下

01     kind = 1     NOP
01     kind = 1     NOP
08 0a 32 a6 ac 63 41 fa 79 05 時間戳選項呛牲,Timestamp Value(TSval): 849783907 ,Timestamp echo reply(TSecr): 1106934021

③ 被斷開方處理完自己的邏輯驮配,發(fā)送[FIN]數(shù)據(jù)報到斷開方

//以太網(wǎng)頭部+IP報頭+TCP報頭+TCP數(shù)據(jù)(字節(jié)為單位位 Hex+ASCII方式顯示)
88 25 93 02 b7 8c 78 4f 43 5b 56 75 08 00 45 00
00 34 00 00 40 00 40 06 26 9e 0a 16 46 87 7a e4
48 a5 d2 1e 00 50 65 ee 19 b0 a9 ba 9e ec 80 11
10 00 1d d8 00 00 01 01 08 0a 32 a6 ac 63 41 fa
79 05

//提取TCP報頭+TCP數(shù)據(jù)(去掉以太網(wǎng)頭部14byte和IP報頭20byte)
d2 1e 00 50
65 ee 19 b0 
a9 ba 9e ec 
80 11 10 00 
1d d8 00 00 
01 01 08 0a 32 a6 ac 63 41 fa 79 05

解析:從上面可以解析出源端口號為:0xd21e =53790娘扩;目的端口號:0x0050 =80;序列號:SEQ = 0x65ee19b0 壮锻;ACK = 0xa9ba9eec 琐旁;TCP報頭長為:0x8 = 8(32 bit),8 x 4 byte = 32 byte猜绣,即TCP報頭長為 32 個字節(jié)灰殴;窗口大小為 0x1000 = 4096 byte;
保留位和標志位:0x011 = 0b000000010001掰邢;按位解析標志位為 0b000010000牺陶,NS: 0,CWR: 0辣之,ECE: 0掰伸,URG: 0,ACK: 1怀估,PSH: 0狮鸭,RST: 0,SYN: 0多搀,F(xiàn)IN: 1歧蕉,從解析里面可以看出該報文ACK字段和FIN字段有效,是被斷開方發(fā)送的斷開連接[FIN+ACK]數(shù)據(jù)報康铭;
可選項部分:可以看出該TCP報頭最后的12個字節(jié)表示可選項惯退,解析如下

01     kind = 1     NOP
01     kind = 1     NOP
08 0a 32 a6 ac 63 41 fa 79 05 時間戳選項,Timestamp Value(TSval): 849783907 麻削,Timestamp echo reply(TSecr): 1106934021

④ 斷開方對被對開放發(fā)送的斷開數(shù)據(jù)報發(fā)送[ACK]數(shù)據(jù)報進行確認

//以太網(wǎng)頭部+IP報頭+TCP報頭+TCP數(shù)據(jù)(字節(jié)為單位位 Hex+ASCII方式顯示)
78 4f 43 5b 56 75 88 25 93 02 b7 8c 08 00 45 00
00 34 42 6b 40 00 39 06 eb 32 7a e4 48 a5 0a 16
46 87 00 50 d2 1e a9 ba 9e ec 65 ee 19 b1 80 10
03 cc 29 f7 00 00 01 01 08 0a 41 fa 79 1a 32 a6
ac 63

//提取TCP報頭+TCP數(shù)據(jù)(去掉以太網(wǎng)頭部14byte和IP報頭20byte)
00 50 d2 1e 
a9 ba 9e ec 
65 ee 19 b1 
80 10 03 cc 
29 f7 00 00 
01 01 08 0a 41 fa 79 1a 32 a6 ac 63

解析:從上面可以解析出源端口號為:0x0050 =80蒸痹;目的端口號:0xd21e =53790春弥;序列號:SEQ = 0xa9ba9eec;ACK = 0x65ee19b1叠荠;TCP報頭長為:0x8 = 8(32 bit)匿沛,8 x 4 byte = 32 byte,即TCP報頭長為 32 個字節(jié)榛鼎;窗口大小為 0x03cc =972 byte逃呼;
保留位和標志位:0x010 = 0b000000010000;按位解析標志位為 0b000010000者娱,NS: 0抡笼,CWR: 0,ECE: 0黄鳍,URG: 0推姻,ACK: 1,PSH: 0框沟,RST: 0藏古,SYN: 0,F(xiàn)IN: 0忍燥,從解析里面可以看出該報文ACK字段有效拧晕,是對斷開連接請求的確認[ACK]數(shù)據(jù)報
可選項部分:可以看出該TCP報頭最后的12個字節(jié)表示可選項梅垄,解析如下

01     kind = 1     NOP
01     kind = 1     NOP
08 0a 41 fa 79 1a 32 a6 ac 63 時間戳選項厂捞,Timestamp Value(TSval): 1106934042,Timestamp echo reply(TSecr): 849783907

4队丝、UDP協(xié)議

UDP協(xié)議是IP協(xié)議上層的另一個重要協(xié)議靡馁,他是面向無連接的、不可靠的數(shù)據(jù)報傳輸協(xié)議炭玫,他僅僅將要發(fā)送的數(shù)據(jù)報傳送至網(wǎng)絡奈嘿,并接受從網(wǎng)絡上傳來的數(shù)據(jù)報貌虾,而不與遠端的UDP協(xié)議模塊建立連接吞加。UDP協(xié)議為用戶的網(wǎng)絡應用程序提供服務。

4.1 UDP協(xié)議數(shù)據(jù)報頭

4.1.1 UDP協(xié)議頭部格式
UDP報頭.jpg
  • 源端口:套接字發(fā)送端端口號
  • 目的端口:目的套接字端口號
  • 數(shù)據(jù)包長:UDP報頭+UDP數(shù)據(jù)報的長度尽狠,單位1byte
4.1.2 UDP協(xié)議頭部數(shù)據(jù)
//以太網(wǎng)頭部+IP報頭+UDP報頭+UDP數(shù)據(jù)(字節(jié)為單位位 Hex+ASCII方式顯示)
01 00 5e 4b 00 fe f8 32 e4 8a ef e5 08 00 45 00
00 74 49 b6 00 00 01 11 2f 50 0a 16 46 14 ef 4b
00 fe c1 5f 26 e5 00 60 19 b1 00 00 00 58 4f 47
45 4d 52 41 59 2d 4e 42 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 41 4a
52 40 31 32 33 34 35 36 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00

//UDP報頭+UDP數(shù)據(jù)(去掉以太網(wǎng)頭部14byte和IP報頭20byte)
c1 5f 26 e5 00 60 19 b1 
00 00 00 58 4f 47 45 4d 52 41 59 2d 4e 42 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 41 4a 52 40 31 32 33 34 35 36 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00

從上面數(shù)據(jù)抓包可以看出:
源端口:0xc15f = 49503
目的端口:0x26e5 = 9957
數(shù)據(jù)包長(UDP報頭加+UDP數(shù)據(jù)):0x0060 = 96 byte
效驗值:0x18b1

5衔憨、結(jié)語

對于TCP/IP通信的基本原理和過程就總結(jié)到這,順帶說下上面的抓包軟件叫Wireshark袄膏。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末践图,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子沉馆,更是在濱河造成了極大的恐慌码党,老刑警劉巖德崭,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異揖盘,居然都是意外死亡眉厨,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門兽狭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來憾股,“玉大人,你說我怎么就攤上這事箕慧》颍” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵颠焦,是天一觀的道長斩熊。 經(jīng)常有香客問我,道長伐庭,這世上最難降的妖魔是什么座享? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮似忧,結(jié)果婚禮上渣叛,老公的妹妹穿的比我還像新娘。我一直安慰自己盯捌,他們只是感情好淳衙,可當我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著饺著,像睡著了一般箫攀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上幼衰,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天靴跛,我揣著相機與錄音,去河邊找鬼渡嚣。 笑死梢睛,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的识椰。 我是一名探鬼主播绝葡,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼腹鹉!你這毒婦竟也來了藏畅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤功咒,失蹤者是張志新(化名)和其女友劉穎愉阎,沒想到半個月后绞蹦,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡榜旦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年坦辟,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片章办。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡锉走,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出藕届,到底是詐尸還是另有隱情挪蹭,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布休偶,位于F島的核電站梁厉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏踏兜。R本人自食惡果不足惜词顾,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望碱妆。 院中可真熱鬧肉盹,春花似錦、人聲如沸疹尾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽纳本。三九已至窍蓝,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間繁成,已是汗流浹背吓笙。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留巾腕,地道東北人面睛。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像祠墅,于是被迫代替她去往敵國和親侮穿。 傳聞我的和親對象是個殘疾皇子歌径,可洞房花燭夜當晚...
    茶點故事閱讀 45,512評論 2 359