韓順剛-tcp報文頭協(xié)議詳細(xì)分析第一包數(shù)據(jù):序號是0,發(fā)送數(shù)據(jù)的長度是0,因?yàn)闆]有收到對端的數(shù)據(jù),所以確認(rèn)號是0, Syn的標(biāo)志位設(shè)置成1,這里沒有發(fā)送的數(shù)據(jù),只發(fā)送TCP的20個字節(jié)的頭部

TCP報文段首部格式
大部分TCP報文頭部都是20個字節(jié),有的數(shù)據(jù)包要加上選項(xiàng)。
上面一行代表4個字節(jié),源端口和目的端口都是2個字節(jié)。
TCP協(xié)議是面向字節(jié)流的協(xié)議

TCP是一段一段分塊的發(fā)送數(shù)據(jù)的
序號指的就是你當(dāng)前分段的數(shù)據(jù)塊的第一個字節(jié)在整個文件中的位置,就是對應(yīng)的序號。對端收到數(shù)據(jù)之后,按照序號的從小到大重新組裝起來,得到的就是我們要發(fā)送的文件。所以TCP是面向字節(jié)流的協(xié)議。
確認(rèn)號:
如果被叫收到了序號是1的數(shù)據(jù)段,該數(shù)據(jù)段的長度是4個字節(jié),最后一個字節(jié)的是4,那么下次我想收到的數(shù)據(jù)段的序號應(yīng)該是5開始的,所以這里的確認(rèn)號就是5.
如果收到的數(shù)據(jù)段的最后一個字節(jié)是180,那么確認(rèn)號就是181
字段數(shù)據(jù)偏移:
該字段用來指定TCP首部的大小,如果這里的值是40,減去固定的20個字節(jié),tcp首部那么偏移的大小就是20.
用來表示TCP的報文段。
例如數(shù)據(jù)偏移的值占4位,如果是1111,對應(yīng)的值是15,此時還要剩4,表示TCP的頭部是60個字節(jié),偏移就是40個字節(jié)。
所以TCP的頭部最小是20個字節(jié),最大是60個字節(jié)。



上面就是web客戶端向web服務(wù)器申請網(wǎng)易數(shù)據(jù),xp向web發(fā)送一個數(shù)據(jù),第一個包序號是1,確認(rèn)號也是1(希望web服務(wù)器發(fā)送序號是1的數(shù)據(jù)包),數(shù)據(jù)的長度是203個字節(jié)
web服務(wù)收到請求之后,連續(xù)發(fā)送了兩個數(shù)據(jù)包,確認(rèn)號都是是204表示收到了客戶端序號是1長度是203個字節(jié)的數(shù)據(jù),希望下次發(fā)送的數(shù)據(jù)的序號從204開始

標(biāo)記為URG標(biāo)記位如果是1表示不管發(fā)送緩存中最后還有多少數(shù)據(jù)需要發(fā)送,該數(shù)據(jù)段都優(yōu)先傳輸。
Ack和syn主要用在TCP握手的三次連接中使用

syn是tcp的請求建立連接的標(biāo)志位:
第一包數(shù)據(jù):序號是0,發(fā)送數(shù)據(jù)的長度是0,因?yàn)闆]有收到對端的數(shù)據(jù),所以確認(rèn)號是0,
Syn的標(biāo)志位設(shè)置成1,這里沒有發(fā)送的數(shù)據(jù),只發(fā)送TCP的20個字節(jié)的頭部
第二包數(shù)據(jù):序號是0,因?yàn)槭盏搅藢Χ说臄?shù)據(jù)(數(shù)據(jù)的長度是0,序列號是0),那么確認(rèn)號是1,發(fā)送數(shù)據(jù)的長度也是0,同時標(biāo)志位syn和ack 都是1
第三包:發(fā)送寫序列號是1,確認(rèn)號也是1,同時將ack標(biāo)志位設(shè)置成1
syn的攻擊:

我們可以弄很多假的客戶端去和服務(wù)器建立TCP連接,導(dǎo)致服務(wù)器癱瘓
第二種情況就是:讓服務(wù)器和服務(wù)器自己建立大量的TCP連接,導(dǎo)致服務(wù)器資源耗盡。
Psh字段的作用:

接受端接受數(shù)據(jù)是按照緩存中的數(shù)據(jù)依隊列依次交給上層應(yīng)該程序去處理,如果收到的數(shù)據(jù)中帶有psh標(biāo)志位,表示直接將數(shù)據(jù)放在緩存的頭部,優(yōu)先立刻可以提交給應(yīng)該程序。
RST標(biāo)志位:
表示會話過程中TCP連接異常終端,RST標(biāo)志位是1.
FIN表示正常結(jié)束連接,比如網(wǎng)頁傳輸完成了,web服務(wù)器給客戶端回復(fù)一個FIN數(shù)據(jù)包,正常斷開TCP連接。
TCP的窗口字段:占2個字節(jié)
在TCP三次握手的時候,A計算機(jī)會告訴B計算機(jī)字節(jié)接受緩存的大小是65535,那么A計算機(jī)最大的發(fā)送緩存就是65535.
同理B計算機(jī)也會告訴A計算機(jī)自己的最大接受緩存是64034自己,A計算機(jī)最大的發(fā)送緩存就是64034字節(jié)。
依據(jù)對方的接受窗口大小來設(shè)置自己的發(fā)送窗口大小。

校驗(yàn)和字段:
校驗(yàn)的TCP的首部和數(shù)據(jù)字段再加上12個字節(jié)的偽首部三個部分組成
我們來看下udp的校驗(yàn):


TCP校驗(yàn)和計算方法同上,只需要將版本號17換成6就可以了。TCP的協(xié)議號是6
緊急指針只有在URG標(biāo)志位是1的時候才有用,如果緊急指針的值是50,表示TCP數(shù)據(jù)部分的前50個字節(jié)的數(shù)據(jù)需要緊急發(fā)送。
選項(xiàng)字段:
選項(xiàng)指針:
在tcp三次握手的時候可以通過選項(xiàng)告訴對端自己tcp包最大傳輸?shù)淖止?jié)MSS是1460字節(jié)


還可以告訴對端選擇性確認(rèn)功能:
還可以告訴對端支持SACK選擇性確認(rèn)功能。

2 TCP如何實(shí)現(xiàn)可靠性傳輸

網(wǎng)絡(luò)層是主要是實(shí)現(xiàn)數(shù)據(jù)的傳輸,不保證數(shù)據(jù)的可靠傳輸,數(shù)據(jù)的可靠傳輸是在傳輸層實(shí)現(xiàn)的。

A發(fā)了M1,在規(guī)定的時間內(nèi)如果沒有收到對端M1的確認(rèn),就重新發(fā)送M1.


B收到了兩個M1,丟棄第二次重復(fù)的M1數(shù)據(jù)



停止等待協(xié)議的缺點(diǎn)就是信道利用太低

我們來看看下面這種方式

現(xiàn)在發(fā)送12個數(shù)據(jù)包
窗口的大小是5
先發(fā)送 1 2 3 4 5這五個數(shù)據(jù)包
當(dāng)收到第一個數(shù)據(jù)包的回復(fù)之后,窗口向右移動,第一個數(shù)據(jù)包可以從緩存中刪除掉。


發(fā)送窗口中的數(shù)據(jù)包只有收到確認(rèn)之后才能夠從滑動窗口中刪除。
累計確認(rèn)

B計算機(jī)說收到了第三個數(shù)據(jù)包,表示前三個數(shù)據(jù)包都都收到了,第一個數(shù)據(jù)包和第二個數(shù)據(jù)包就不用再回確認(rèn)信息了

B收到了第一個數(shù)據(jù)包,第二個數(shù)據(jù)包,第四個數(shù)據(jù)包,第三個數(shù)據(jù)包在傳輸?shù)倪^程中丟失了,這個時候B給A回復(fù)的確認(rèn)標(biāo)識是2,A要重新傳輸?shù)谌齻€數(shù)據(jù)包和第四個數(shù)據(jù)包。

posted on 2017-04-21 17:38 luzhouxiaoshuai 閱讀(1271) 評論(0) 收藏 舉報
浙公網(wǎng)安備 33010602011771號