1. 程式人生 > >http三次握手和四次揮手

http三次握手和四次揮手

同步包內資料

SYN是一個標誌位,syn=1 代表建立新的連線
sep是一個序號  會隨機生成一個內容 佔32位
Ack是確認序號,將收到的sep序號的值+1,當ACK標誌位為ACK=1時確認序號才有效

三次握手(精簡)

第一次:

從客戶端呼叫connect開始,傳送一個同步包給伺服器,告訴伺服器我要給你發訊息了

第二次:

伺服器傳送確認包(同步包中的值+1)告訴客戶端說可以,同時傳送同步包告訴客戶端我也要給你發訊息了

第三次:

客戶端傳送確認包(伺服器發的同步包的值+1)告訴伺服器我準備好了,伺服器收到確認包後三次握手結束,建立連線

三次握手(詳解)

第一次:

從客戶端呼叫connect開始,客戶端傳送一個同步包

給伺服器,告訴伺服器我要給你發訊息了

同步包:SYN=1,sep=k

第二次:

伺服器收到客戶端的同步包後,發現SYN=1,知道客戶端是要建立新的連線,傳送確認包告訴客戶端我同意你的請求

確認包:將同步包內的sep的k值+1,確認序號Ack=k+1,將ACK=1使確認序號生效

並且告訴客戶端我要給你發訊息了(傳送同步包)

同步包:SYN=1,sep=j

第三次:

1)客戶端收到確認包後,發現

確認序號Ack=k+1,並且ACK=1

得知伺服器將我發給他的sep值+1了,並且ACK=1,同意了我的連線請求 2)收到同步包後,發現SYN=1,知道伺服器要和我建立連線了

同步包:SYN=1, sep=j

3)客戶端傳送確認包告訴伺服器我知道了,伺服器收到之後連線建立

確認包:Ack=j+1,ACK=1

四次揮手(精簡)

msl:一個數據包在網路上的存活時間最多為1個msl,2分鐘
FIN是一個識別符號,FIN=1表示釋放連線

第一次:

客戶端呼叫close開始,傳送同步包告訴伺服器我不再給你發訊息了

同步包:FIN=1, sep=k

第二次:

伺服器傳送確認包(同步包內值+1)告訴客戶端我知道了

確認包:Ack=k+1,ACK=1

第三次:

伺服器呼叫close,傳送同步包告訴客戶端我也不給你發訊息了,此時伺服器會等待1msl,若1msl後客戶端無響應會再次傳送請求

同步包:FIN=1,sep=w

第四次:

客戶端傳送確認包(伺服器傳送的同步包內的值+1)告訴伺服器我知道了,此時會等待2msl,伺服器收到之後連線斷開

確認包:Ack=w+1,ACK=1

: ①為什麼四次揮手中第三次揮手和第四次揮手不能同時進行

因為第一次揮手時伺服器僅代表不再發送訊息,但還可以接收訊息 伺服器收到請求後recv解阻塞,既可以選擇傳送一些資料給客戶端之後再呼叫close關閉傳送功能,也可以馬上呼叫close關閉傳送功能,這是不確定的,所以要分開進行

②為什麼要等待2msl:

1)2msl在客戶端第四次揮手時啟動,傳送Ack回覆可能因為網路原因1個msl後才到達伺服器,也可能會丟失 2)伺服器在第三次揮手時傳送了斷開請求,在1個msl後沒有收到客戶端的回覆,會再次傳送斷開請求,這個請求可能因為網路原因需要1個msl才到達客戶端,一發一收2次,所以需要等待2個msl 3)為了防止以上情況再次發生,客戶端收到斷開請求並回復後會重新整理2msl時間,防止最後一個Ack伺服器沒有收到