1. 程式人生 > >TCP 三次握手與四次揮手?(解釋一下三次握手與四次揮手)

TCP 三次握手與四次揮手?(解釋一下三次握手與四次揮手)

TCP 三次握手與四次揮手?(解釋一下三次握手與四次揮手)


三次握手建立連線

1)  主機A傳送一個SYN段到主機B告訴B想要連線的主機埠,以及初始的序列號(ISN:x)(報文段1)

2) 主機B應答,伺服器發回包含B的初始序號的SYN報文段(報文段2)作為應答。同時,將確認序號ACK設定為客戶的ISN加1以對A的SYN報文段進行確認。

3)主機A必須將確認序號ACK設定為B的ISN加1以對B的SYN報文段進行確認(報文段3)

四次揮手斷開連線


1)現在的網路通訊都是基於socket實現的,當客戶端將自己的socket進行關閉時,核心協議棧會向伺服器自動傳送一個FIN置位的包,請求斷開連線。

2)伺服器端B收到請客端的FIN斷開請求後,核心協議棧會立即傳送一個ACK包作為應答,表示已經收到客戶端的請求

3)伺服器執行一段時間後關閉了自己的socket。這個時候核心協議棧會向客戶端A傳送一個FIN置位的包,請求斷開連線

4)客戶端A收到服務端B發來的FIN斷開請求後,會發送一個ACK做出應答,表示已經收到服務端的請求

為什麼建立連線協議是三次握手,而關閉連線卻是四次握手呢?


這是因為服務端的LISTEN狀態下的SOCKET當收到SYN報文的建連請求後,它可以把ACK和SYN(ACK起應答作用,而SYN起同步作用)放在一個報文裡來發送。但關閉連線時,當收到對方的FIN報文通知時,它僅僅表示對方沒有資料傳送給你了但未必你所有的資料都全部發送給對方了,所以你可以未必會馬上會關閉SOCKET,也即你可能還需要傳送一些資料給對方之後,再發送FIN報文給對方來表示你同意現在可以關閉連線了,所以它這裡的ACK報文和FIN報文多數情況下都是分開發送的。


三次握手與四次揮手