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伺服器沒有收到