wireshark實驗之TCP

計網學完傳輸層之後雖然書上的東西都差不多理解了,但是紙上學來終覺淺,還是實際感受一下TCP的整個傳輸過程才能理解得更深

就從最經典的三次握手開始


第一步源地址向目的地址發送一個SYN請求(seq=0),第二步目的地址向源地址發送一個SYN-ACK響應(seq=0,ack=1),第三步源地址向目的地址發送ACK確認(seq=1,ack=1),接下來分析看到的簡略參數:

seq和ack就不說了,但是有一點要提,wireshark中的seq和ack是相對值,不是真實值,真實值在Preferences->Protocols->TCP設置一下才能看到,如下圖,也就是說seq和ack是用隨機數生成的

把紅色得那塊得勾去掉就可以看到真實的seq和ack了,巨長,果然不能浪費了4個字節的空間


長度len都是0代表沒發送過數據,MSS代表最大報文傳輸段,這裏是進行MSS初始化設定,而且這個MSS只出現在SYN報文段中,爲什麼是1460個字節呢,因爲以太網規定最大數據長度不超過1500個字節,所以1500-20個字節的ip首部-20個字節的tcp首部=1460個字節,最後一個SACK_PERM=1是指開啓選擇重傳機制(不啓用就是回退N步),細心的同學可能會問62個字節是怎麼來的,或者說是不應該是28+20+26=74嗎?實際上對於以太網幀,wireshark只抓了源地址、目的地址和類型,也就是說除了前同步碼和FCS(前同步碼實際上是在物理層加的,所以以太網幀最小幀長是64=46+6+6+2+4),6+6+2=14,所以有28+20+14=62

接下來咱們再分析詳細一點的參數


從上圖可以清晰的看到TCP的首部結構,這裏說一下檢驗和計算方法

先把僞首部和tcp真正的首部組織成一個大的結構,然後把它分成若干個16比特的字,不足的用0填充,然後再進行相加,遇到任何溢出都要回卷,就是溢出的數單獨拿出來再和原來的數相加,最後再取反碼,接收方接收到數據之後同樣的,把所有的16比特(包括檢驗和)字加起來,如果結果爲1111111111111111,證明校驗成功,否則失敗。

在選項那塊,kind/type表示的是options 的種類,2代表MSS,1代表不操作,2代表是否開啓SACK,這裏有兩個NOP是因爲TCP首部必須是4的倍數,原因是TCP首部長度字段是以32比特的字爲單位,所以要用兩個NOP來填充。

最下面的是這些字段對應的二進制數,就是計算機真實接收的,不過wireshark已經把網絡字節序(大端法)轉爲了主機字節序(小端法)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章