TCP層分析
傳輸控制協(xié)議,為數(shù)據(jù)提供可靠的端到端傳輸钉稍,處理數(shù)據(jù)的順序和錯誤恢復(fù)焙畔,保證數(shù)據(jù)能夠到達(dá)其應(yīng)到達(dá)的地方
1. Transmission Control Protocol, Src Port: 52745 (52745), Dst Port: 80 (80), Seq: 1, Ack: 1, Len: 202
總信息捎琐,源端口52745, 目的端口80 ( HTTP ) , 序號1, ACK 設(shè)置1,長度為202
2. Source Port: 52745 (52745) —— 用來傳輸數(shù)據(jù)包的端口
3. Destination Port: http (80) —— 數(shù)據(jù)包將要被發(fā)送到的端口
1~1023:標(biāo)準(zhǔn)端口組叉庐,特定服務(wù)會用到標(biāo)準(zhǔn)端口
1024~65535:臨時端口組舒帮,操作系統(tǒng)會隨機(jī)地選擇一個源端口讓某個通信單獨(dú)使用
傳輸層的復(fù)用和分用功能都要通過端口才能實現(xiàn)
4. Stream index: 0
流端口號為0根據(jù)src.ip src.port dst.ip dst.port生成的一個索引號 Sequence number: 0
5. TCP Segment Len: 202 ( Next sequence – Sequence ) number
顯示(0x50)TCP 攜帶數(shù)據(jù)的長度
6. Sequence number: 2186017225 顯示為該包序列號的空際值
Sequence number: 1 (relative sequence number),顯示為該包序列號的相對值,這個數(shù)字用來表示一個TCP片段玩郊。這個域用來保證數(shù)據(jù)流中的部分沒有流失(隨機(jī)生成)
7. Next sequence number: 2186017427
Next sequence number: 203 (relative sequence number)
分析同上肢执,下一個序列號(在實際傳輸中并未有此數(shù)據(jù),是Wireshark 提供的译红,= Sequence number + TCP Segment Len)
8. Acknowledgment number: 1090536281
Acknowledgment number: 1 (relative ack number)
確認(rèn)號為1: 這個數(shù)字式通信中希望從另外一個設(shè)備得到的下一個數(shù)據(jù)包的序號
9. Header Length: 20 bytes
數(shù)據(jù)偏移(即首部長度)顯示(0x50)但實際為 (0x50 && 0XF0) / 4 = 20 预茄,剩下的0x50中的0 用于下面的
Reserverd 和Nonce. 它指出 TCP 報文段的數(shù)據(jù)起始處距離 TCP 報文段的起始處有多遠(yuǎn)
10. …. 0000 0001 1000 = Flags: 0x018 (PSH, ACK)
很重要,根據(jù)括號里的標(biāo)志值(URG, ACK, PSH. RST, SYN, FIN)判斷不同的TCP數(shù)據(jù)包的類型
Reserved: Not set —— 保留字段——占 6 位侦厚,保留為今后使用
Nonce: Not set 設(shè)置為0
隨機(jī)數(shù)(Nonce)是任意的或非重復(fù)的值耻陕,它包括在經(jīng)過一個協(xié)議的數(shù)據(jù)交換中,通常為保證活躍度以及避免受重復(fù)攻擊
Congestion Window Reduced (CWR): Not set —— 沒啥用
ECN-Echo: Not set
Urgent: Not set —— (基本此處無設(shè)置)
當(dāng) URG=1 時刨沦,表明緊急指針字段有效诗宣。它告訴系統(tǒng)此報文段中有緊急數(shù)據(jù),應(yīng)盡快傳送(相當(dāng)于高優(yōu)先級的數(shù)據(jù))
Acknowledgment: Set 1
(確認(rèn)序號有效位)只有當(dāng) ACK=1 時確認(rèn)號字段才有效想诅。當(dāng)ACK=0 時梧田,確認(rèn)號無效
Push: Set 1 ——(通知接收端立即將數(shù)據(jù)提交上層,釋放內(nèi)存)
接收 TCP 收到 PSH=1 的報文段侧蘸,就盡快地交付接收應(yīng)用進(jìn)程,而不再等到整個緩存都填滿了后再向上交付
Reset: Not set
請求重新建立TCP連接鹉梨,當(dāng) RST=1 時讳癌,表明 TCP 連接中出現(xiàn)嚴(yán)重差錯(如由于主機(jī)崩潰或其他原因),必須釋放連接存皂,然后再重新建立運(yùn)輸連接
Syn: Not set
同步 SYN = 1 表示這是一個連接請求或連接接受報文
Fin: Not set
請求斷開連接晌坤,用來釋放一個連接。FIN 1 表明此報文段的發(fā)送端的數(shù)據(jù)已發(fā)送完畢旦袋,并要求釋放運(yùn)輸連接骤菠。
11. Window size value: 64800
窗口大小,TCP接收者緩沖的字節(jié)大小
12. Calculated window size: 64800
計算窗口大小為64800
13. Window size scaling factor: -1 (unknown) 窗口大小換算系數(shù)
這里為 -1(unknown)是因為Wireshark所捕獲的pacp中并未含有TCP三次握手信息疤孕,所以Wireshark
不知道正在使用的窗大小是否正在使用商乎,就算使用,Wireshark 也不知道換算系數(shù)是多少
故Wireshark就簡單地報道窗大小的值(可能包含真正窗大屑婪А)并標(biāo)識上述-1 (unknown) 的信息
14. Checksum: 0xb4ca [validation disabled] //驗證禁止
Good Checksum: False Bad Checksum: False
校驗和:用來保證TCP頭和數(shù)據(jù)的內(nèi)容在抵達(dá)目的時的完整性
Urgent pointer: 0
如果設(shè)置了URG位鹉戚,這個域?qū)⒈粰z查作為額外的指令,告訴CPU從數(shù)據(jù)包的哪里開始讀取數(shù)據(jù)
15. 選項(Options):各種可選的域专控,可以再TCP數(shù)據(jù)包中進(jìn)行指定抹凳。但是幾乎每一個SYN報文段中都含有TCP選項字段
16. SEQ/ACK analysis
Wireshark對序列/ACK的分析(不在實際數(shù)據(jù)流中)當(dāng)且僅當(dāng)數(shù)據(jù)中含有ACK時,才有此項伦腐!
Bytes in flight: 202 —— 網(wǎng)絡(luò)中傳輸?shù)淖止?jié)為202
TCP 原理
Note: TCP的選項是可選的赢底。下面將詳細(xì)講解:
實際抓包中 SYN和SYN ACK包的TCP頭部是32字節(jié),有的時候是28字節(jié),多了12或8字節(jié)的選項和填充字段幸冻。而ACK和FIN ACK包的TCP頭部都是20字節(jié)粹庞。SYN中多出的12字節(jié)有什么作用?從wireshark里可以看到嘁扼,options里面是諸如maximum segment信粮,windows scale燥滑,NOP芭碍,SACK permitted等的字段油讯,28字節(jié)的頭部比32字節(jié)的少了3字節(jié)的windows scale選項及其之前的一個NOP
TCP有兩種類型的選項:單字節(jié)和多字節(jié)蚯瞧。每一個選項有同樣的結(jié)構(gòu):Kind + Length + Data熄驼,其中Lenght表示Kind宝冕、Lenght搁骑、Data三者的總長度什荣,單字節(jié)的選項只有Kind
關(guān)于這些選項访娶,就+有如下規(guī)則:
KIND(8bit)+LENGTH(8bit商虐,NOP沒有LENGTH部分)+內(nèi)容(如果有的話)
Kind=0表示選項結(jié)束——1字節(jié)
Kind=1表示無操作,主要是用來占位從而達(dá)到字節(jié)對齊的目的——-1字節(jié)
Kind=2表示MSS選項——4字節(jié)
Kind=3表示窗口大醒掳獭(窗口擴(kuò)大因子)——3字節(jié)
Kind=4表示SACK-Permitted——-2字節(jié)
Kind=5表示一個SACK包—–可變長度
Kind=8表示時間戳—–10字節(jié)
類型2秘车,表示MSS選項,長度length = 4 Bytes, Data(MSS Value = 1440)
類型1劫哼,表示無操作
類型3叮趴,表示窗口大小(窗口擴(kuò)大因子)為2权烧,長度為3
類型4眯亦,表示SACK-Permitted,長度為2般码,可以提高效率妻率,詳細(xì)見附錄中——可選項參數(shù)分析
TCP的標(biāo)志與三次握手
TCP 標(biāo)志
TCP的三次握手
在 Wireshark 中設(shè)置TCP數(shù)據(jù)包序列號顯示方式:
Edit -> Preference -> Protocols -> TCP 勾上后TCP數(shù)據(jù)包的序列號替換為相對值,如之前TCP端口截圖中的序號0板祝、1
1. 第一次握手:
2. 第二次握手:
3. 第三次握手:
TCP四次斷開
1. 第一次斷開:
2. 第二次斷開:
3. 第三次斷開:
4. 第四次斷開:
TCP 重置異常終止(reset報文)
當(dāng)TCP連接中途突然斷掉宫静,使用RST標(biāo)志位指出連接被異常中止或拒絕連接請求
TCP的異常終止是相對于正常釋放TCP連接的過程而言的,我們都知道扔字,TCP連接的建立是通過三次握手完成的囊嘉,而TCP正常釋放連接是通過四次揮手來完成,但是有些情況下革为,TCP在交互的過程中會出現(xiàn)一些意想不到的情況扭粱,導(dǎo)致TCP無法按照正常的四次揮手來釋放連接,如果此時不通過其他的方式來釋放TCP連接的話震檩,這個TCP連接將會一直存在琢蛤,占用系統(tǒng)的部分資源蜓堕。在這種情況下,我們就需要有一種能夠釋放TCP連接的機(jī)制博其,這種機(jī)制就是TCP的reset報文套才。reset報文是指TCP報頭的標(biāo)志字段中的reset位置一的報文,如下圖所示:
server端不會考慮client的reset慕淡。例如HTTP server是不會考慮client的reset背伴,它收到第一個reset就認(rèn)為是client放棄鏈接了。server端只是被動端峰髓,盡量減少狀態(tài)交互傻寂,不應(yīng)該對reset發(fā)起主動的動作。
一般只有client要考慮server的reset携兵,這種問題就是看你要是不是要“我死都要連”或者是“我收到reset就玻璃心不連了”
也就是說疾掰,client要根據(jù)reset的上下文或者應(yīng)用本身的工作狀態(tài)來判斷接下來怎么辦
TCP異常終止的常見情形
我們在實際的工作環(huán)境中,導(dǎo)致某一方發(fā)送reset報文的情形主要有以下幾種:
1.客戶端嘗試與服務(wù)器未對外提供服務(wù)的端口建立TCP連接徐紧,服務(wù)器將會直接向客戶端發(fā)送reset報文
2. 客戶端和服務(wù)器的某一方在交互的過程中發(fā)生異常(如程序崩潰等)静檬,該方系統(tǒng)將向?qū)Χ税l(fā)送TCP reset報文,告之對方釋放相關(guān)的TCP連接并级,如下圖所示:
3. 接收端收到TCP報文拂檩,但是發(fā)現(xiàn)該TCP的報文,并不在其已建立的TCP連接列表內(nèi)嘲碧,則其直接向?qū)Χ税l(fā)送reset報文广恢,如下圖所示:
4. 在交互的雙方中的某一方長期未收到來自對方的確認(rèn)報文,則其在超出一定的重傳次數(shù)或時間后呀潭,會主動向?qū)Χ税l(fā)送reset報文釋放該TCP連接,如下圖所示:
5至非,有些應(yīng)用開發(fā)者在設(shè)計應(yīng)用系統(tǒng)時钠署,會利用reset報文快速釋放已經(jīng)完成數(shù)據(jù)交互的TCP連接,以提高業(yè)務(wù)交互的效率荒椭,如下圖所示:
TCP 參數(shù)描述
在TCP層谐鼎,有個FLAGS字段,這個字段有以下幾個標(biāo)識:SYN, FIN, ACK, PSH, RST, URG
SYN(synchronous建立聯(lián)機(jī)) 表示建立連接
ACK(acknowledgement 確認(rèn)) 表示響應(yīng)
PSH(push傳送) 表示有 DATA數(shù)據(jù)傳輸
FIN(finish結(jié)束) 表示關(guān)閉連接
RST(reset重置) 表示連接重置
URG(urgent緊急)
Sequence number(順序號碼) Acknowledge number(確認(rèn)號碼)
其中趣惠,ACK是可能與SYN狸棍,F(xiàn)IN等同時使用的,比如SYN和ACK可能同時為1味悄,它表示的就是建立連接之后的響應(yīng)草戈,如果只是單個的一個SYN,它表示的只是建立連接
TCP的幾次握手就是通過這樣的ACK表現(xiàn)出來的侍瑟, 但SYN與FIN是不會同時為1的唐片,因為前者表示的是建立連接丙猬,而后者表示的是斷開連接
RST一般是在FIN之后才會出現(xiàn)為1的情況,表示的是連接重置
一般地费韭,當(dāng)出現(xiàn)FIN包或RST包時茧球,我們便認(rèn)為客戶端與服務(wù)器端斷開了連接;而當(dāng)出現(xiàn)SYN和SYN+ACK包時星持,我們認(rèn)為客戶端與服務(wù)器建立了一個連接
PSH為1的情況抢埋,一般只出現(xiàn)在 DATA內(nèi)容不為0的包中,也就是說PSH為1表示的是有真正的TCP數(shù)據(jù)包內(nèi)容被傳遞
TCP的連接建立和連接關(guān)閉督暂,都是通過請求-響應(yīng)的模式完成的
Sequence Number是針對自身的揪垄,所在數(shù)據(jù)段(數(shù)據(jù)包)的。表示所在數(shù)據(jù)段的第一個數(shù)據(jù)字節(jié)的序列號, syn(這一步是初始化發(fā)送端的ISN( Initial Sequence Number )损痰。理論上福侈,它的數(shù)據(jù)字段沒有任何值,消耗的是一個虛字節(jié))
TCP初始化序列號ISN
TCP初始化序列號不能設(shè)置為一個固定值卢未,因為這樣容易被攻擊者猜出后續(xù)序列號肪凛,從而遭到攻擊
RFC1948中提出了一個較好的初始化序列號ISN隨機(jī)生成算法
ISN = M + F(localhost, localport, remotehost, remoteport)
M是一個計時器,這個計時器每隔4毫秒加1
F是一個Hash算法辽社,根據(jù)源IP伟墙、目的IP、源端口滴铅、目的端口生成一個隨機(jī)數(shù)值戳葵。要保證hash算法不能被外部輕易推算得出,用MD5算法是一個比較好的選擇汉匙。
Seq和Ack的關(guān)系(重點(diǎn))
1. Seq即Sequence Number拱烁,為源端(source)的發(fā)送序列號;Ack即Acknowledgment Number噩翠,為目的端(destination)的接收確認(rèn)序列號
2. 在Wireshark Display Filter中戏自,可使用tcp.seq或tcp.ack過濾
3. 在Packet1中,C:5672向S:80發(fā)送SYN握手包伤锚,Seq=0(relative sequence number)擅笔;在Packet2中,S:80向C:5672發(fā)送ACK握手回應(yīng)包屯援,Ack=1(relative sequence number)猛们,同時發(fā)送SYN握手包,Seq=0(relative sequence number)狞洋;在Packet3中弯淘,C:5672向S:80發(fā)送ACK握手回應(yīng)包,Seq=1吉懊,Ack=1耳胎。(C:Client S : Server)
4. 至此惯吕,Seq=1為C的ISN(Initial Sequence Number),后期某一時刻的Seq=ISN+累計發(fā)送量(cumulative sent)怕午;Ack=1為C的IAN(Initial Acknowledge Number)废登,后期某一時刻的Ack=IAN+累計接收量(cumulative received)。對于S而言郁惜,Seq和Ack情同此理
例:Next sequence number: 733 (relative sequence number) 堡距,
假如我現(xiàn)在的sequence number =1 , 那么這個 733 = 1 + 732 , 732 正好是我應(yīng)用的報文大小兆蕉。 后面的發(fā)送報文羽戒,假如我的sequence number不是733 ,wireshark就會提示 out of order .
A–>B Sequenace number =1, Next Sequence Number = 733, Acknowledgement number=1
B–>A …..
A–>B Sequence number =733 這里虎韵,sequence number必須為733 易稠,否則wireshark 報out of order, Next Sequence number= 926 Acknowledge number = 23
附錄
可選項參數(shù)分析
1. 窗口擴(kuò)大因子TCP Window Scale Option (WSopt)
TCP窗口縮放選項是用來增加TCP接收窗口的大小而超過65536字節(jié)
① 啟用窗口擴(kuò)大選項,通訊雙方必須在各自的SYN報文中發(fā)送這個選項包蓝。主動建立連接的一方在SYN報文中發(fā)送這個選項驶社;而被動建立連接的一方只有在收到帶窗口擴(kuò)大選項的SYN報文之后才能發(fā)送這個選項
② 這個選項只在一個SYN報文中有意義 SYN 或 SYN, ACK ,包含窗口擴(kuò)大選項的報文如果沒有SYN位测萎,則會被忽略掉亡电。當(dāng)連接建立起來后,在每個方向的擴(kuò)大因子是固定的硅瞧。注意:在SYN報文本身的窗口字段始終不做任何的擴(kuò)大份乒。
③ 在啟用窗口擴(kuò)大選項的情況下,若發(fā)送一個窗口通告腕唧,要將實際窗口大小右移shift.cnt位或辖,然后賦給TCP首部中的16bit窗口值;而當(dāng)接收到一個窗口通告時枣接,則將TCP首部中的16bit窗口值左移shift.cnt位孝凌,以獲得實際的通告窗口大小
④ shift.cnt取值范圍為0~14,即最大TCP序號限定為2^16 * 2^ 14 = 2^30 < 2^31月腋。該限制用于防止字節(jié)序列號溢出
2. window size value: 8192 與window scale: 2 (multiply by 4) 的關(guān)系是:
window size value指的是滑動窗口緩沖大小,在TCP頭中已經(jīng)定義過瓣赂。但是實際中榆骚,該窗的大小卻更大,所以實際的窗口大小為:8192 * 4 = 32768
3. SACK選擇確認(rèn)選項
TCP通信時煌集,如果發(fā)送序列中間某個數(shù)據(jù)包丟失妓肢,TCP會通過重傳最后確認(rèn)的包開始的后續(xù)包,這樣原先已經(jīng)正確傳輸?shù)陌部赡苤貜?fù)發(fā)送苫纤,急劇降低了
TCP 性能
為改善這種情況碉钠,發(fā)展出SACK(Selective Acknowledgment, 選擇性確認(rèn))技術(shù)纲缓,使TCP只重新發(fā)送丟失的包,不用發(fā)送后續(xù)所有的包喊废,而且提供相應(yīng)機(jī)制使接收方能告訴發(fā)送方哪些數(shù)據(jù)丟失祝高,哪些數(shù)據(jù)重發(fā)了,哪些數(shù)據(jù)已經(jīng)提前收到等
SACK信息是通過TCP頭的選項部分提供的污筷,信息分兩種工闺,一種標(biāo)識是否支持SACK(類型4),是在TCP握手時發(fā)送瓣蛀;另一種是具體的SACK信息(類型5)
SACK允許選項 陆蟆,該選項只允許在有SYN標(biāo)志的TCP包中,也即TCP握手的前兩個包中惋增,分別表示各自是否支持SACK
SACK選項 叠殷,選項長度: 可變。實際最多不超過4組邊界值
4. MSS: Maxitum Segment Size 最大分段大小
最大報文段長度(MSS)表示TCP傳往另一端的最大塊數(shù)據(jù)的長度诈皿。當(dāng)建立一個連接時林束,每一方都有用于通告它期望接收的 MSS選項(M S S選項只能出現(xiàn)在S Y N報文段中)
通過MSS,應(yīng)用數(shù)據(jù)被分割成TCP認(rèn)為最適合發(fā)送的數(shù)據(jù)塊纫塌,由TCP傳遞給IP的信息單位稱為報文段或段(segment)
我們不難聯(lián)想到诊县,跟最大報文段長度最為相關(guān)的一個參數(shù)是網(wǎng)絡(luò)設(shè)備接口的MTU,以太網(wǎng)的MTU是1500措左,基本IP首部長度為20依痊,TCP首部是20,所以MSS的值可達(dá)1460(MSS不包括協(xié)議首部怎披,只包含應(yīng)用數(shù)據(jù))
MSS是可以通過SYN段進(jìn)行協(xié)商的但它并不是任何條件下都可以協(xié)商的胸嘁,如果一方不接受來自另一方的MSS值(不帶MMS選項即代表不接受),則MSS就定為默認(rèn)值536字節(jié)
Timestamp時間戳選項
時間戳選項使發(fā)送方在每個報文段中放置一個時間戳值凉逛。接收方在確認(rèn)中返回這個數(shù)值性宏,從而允許發(fā)送方為每一個收到的 A C K計算RT T(我們必須說“每一個收到的 A C K”而不是“每一個報文段”,是因為T C P通常用一個A C K來確認(rèn)多個報文段)状飞。我們提到過目前許多實現(xiàn)為每一個窗口只計算一個 RT T毫胜,對于包含8個報文段的窗口而言這是正確的。然而诬辈,較大的窗口大小則需要進(jìn)行更好的RT T計算酵使。 時間戳是一個單調(diào)遞增的值。由于接收方只需要回顯收到的內(nèi)容焙糟,因此不需要關(guān)注時間戳單元是什么口渔。這個選項不需要在兩個主機(jī)之間進(jìn)行任何形式的時鐘同步。
————————————————
版權(quán)聲明:本文為CSDN博主「該昵稱已經(jīng)被占用」的原創(chuàng)文章穿撮,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議缺脉,轉(zhuǎn)載請附上原文出處鏈接及本聲明痪欲。
原文鏈接:https://blog.csdn.net/u011414200/article/details/47948401