《TCP-IP詳解 卷1:協議》學習筆記(一)

由於要從事通信協議的開發工作,最近開始學習TCP-IP詳解三卷書,希望通過不斷的更新博客,同大家共同的學習,相信網絡的力量是能夠激發人的思維的!

 

一、如何區別DIXV2幀和IEEE幀?

由於二者在同一個局域網內是不能共存的。因此,IEEE允許現存的DIXV2網卡和網絡設備到IEEE的標準設備的遷移。爲了使設備可以識別使用的是哪種類型的幀,IEEE沒有分配1536以下(十六進制爲600)的數位協議類型代碼。數據字段的最大值爲1500字節。所以一臺設備可以從源地址後的兩個字節來判斷是哪種類型的幀,如果值爲1536(十進制)或更高則爲類型字段,意味着是DIXV2幀,如果從源地址之後的2個字節小於1536,則可確定是長度字段,爲IEEE802.3幀

二、TCP的連接的建立和釋放

由於TCP連接時全雙工的,因此每個方向都必須單獨進行關閉。這個原則是當一方完成它的數據發送任務後就能發送一個FIN來終止這個方向的連接。收到一個FIN意味着這個方向上沒有數據流動,一個TCP連接收到一個FIN後仍能發送數據。一個主動關閉,一個被動關閉。

但爲什麼連接是三次握手,而關閉是四次握手?

因爲服務器端的LISTEN狀態下的socket當收到SYN報文的建連請求後,它可以把ACK和SYN(ACK其應答作用,SYN起同步作用)放在一個報文裏來發送。

但關閉連接時,當收到對方的FIN報文時,它僅僅表示對方沒有數據發送給你了,但未必你所有的數據都全部發送給對方了,所以你可以未必會馬上關閉socket,也即你可能還需要發送一些數據給對方,再發送FIN報文給對方來表示你同意現在可以關閉連接了,所以它這裏的ACK報文和FIN報文多數情況下是分開發送的

下圖是TCP建立連接、關閉的過程:


我用Wireshark抓包工具抓取了TCP建立連接的報文,如下過程所示:

(1)第一次握手的數據包,可以看到客戶端發送一個TCP,標誌位爲SYN,序列號爲0,代表客戶端請求建立連接,如下圖:


(2)第二次握手的數據包,可以看到服務器發回確認包,標誌位爲SYN,ACK。將確認序號ack設置爲1(即使不發送數據也要消耗一個序列號)如下圖:


(3)第三次握手的數據包,可以看到客戶端再次發送確認包(ACK),標誌位ACK,將sequence+1,如下圖:


 

發佈了39 篇原創文章 · 獲贊 25 · 訪問量 31萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章