您好,登錄后才能下訂單哦!
SYN:1 代表請求創建連接
FIN:1 表示請求關閉連接,在四次分手時,我們發現FIN發了兩遍。這是因為TCP的連接是雙向的,所以一次FIN只能關閉一個方向。
ACK:代表確認接受,ACK=1,來表示數據接收成功。
seq:序列號,當發送一個數據時,數據是被拆成多個數據包來發送,序列號就是對每個數據包進行編號,這樣接受方才能對數據包進行再次拼接。初始序列號是隨機生成的。
ack:服務端接收到數據包后進行確認的編號,ack是seq+1,
在創建連接時,
1.客戶端發送syn包(編號seq=x)到服務器,請求創建連接(SYN=1)。
2.服務端接收到后,確認客戶請求(ACK=1,ack=x+1),同時自己發送syn包(seq=y)告訴客戶端請求創建連接(SYN=1):我接受到請求并處理了,我也想跟你建立連接,你確認下。
3.客戶端收到服務器的SYN+ACK包,確認服務端狀態(ACK=1,ack=y+1)。同時向服務器發送syn包( seq=x+1)告訴服務端:我接受到你的確認包了,可以開始通訊了。
三次握手完成!
舉個打電話的例子:
A : 你好我是A,你聽得到我在說話嗎
B : 聽到了,我是B,你聽到我在說話嗎
A : 嗯,聽到了
建立連接,開始聊天!
在四次分手時,
1.首先客戶端請發送一個FIN包(編號seq=u),表示要斷開連接(FIN=1)。
2.服務端接收到請求后,確認客戶請求(ACK=1,ack=u+1),同時發送數據包(seq=v)告知客戶端需要確認當前服務端狀態。
3.服務端完成狀態確認(ACK=1,ack=u+1),向客戶端發送FIN包(seq=w)請求關閉連接(FIN=1)。
4.客戶端接收到服務器端請求(ACK=1,ack=w+1),同時發送數據包(seq=u+1)至服務器,告知收到請求并確認。
5.客戶端等待兩秒,確認服務端收到消息,否則重發一次確認消息。
四次分手完成!
四次揮手:
A:“喂,我不說了。”
B:“我知道了。等下,上一句還沒說完。Balabala…..”
B:”好了,說完了,我也不說了。”
A:”我知道了。”
1.為什么連接的時候是三次握手,關閉的時候卻是四次握手?
因為當Server端收到Client端的SYN連接請求報文后,可以直接發送SYN+ACK報文。其中ACK報文是用來應答的,SYN報文是用來同步的。但是關閉連接時,當Server端收到FIN報文時,很可能并不會立即關閉SOCKET,所以只能先回復一個ACK報文,告訴Client端,"你發的FIN報文我收到了"。只有等到我Server端所有的報文都發送完了,我才能發送FIN報文,因此不能一起發送。故需要四步握手。
2.如果已經建立了連接,但是客戶端突然出現故障了怎么辦?
TCP還設有一個保活計時器,顯然,客戶端如果出現故障,服務器不能一直等下去,白白浪費資源。服務器每收到一次客戶端的請求后都會重新復位這個計時器,時間通常是設置為2小時,若兩小時還沒有收到客戶端的任何數據,服務器就會發送一個探測報文段,以后每隔75分鐘發送一次。若一連發送10個探測報文仍然沒反應,服務器就認為客戶端出了故障,接著就關閉連接。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。