tcp 連結的建立和斷開
面試總是不免被問到 簡述 tcp 三次握手 四次揮手的問題。
這個問題困擾我許久,因為我一直不能解釋清楚為什麼 握手需要三次 揮手需要四次 為什麼不是五次或者兩次 多一次少一次不行嗎?
三次握手的目的
tcp 協議是用於兩臺機器在網路上通訊用的。
那麼這涉及到一個問題:怎麼保證在資料傳輸之前兩臺機器都有通訊能力
。
對話的必要條件
- 有AB
兩個物件
- AB都能
接收
和傳送
訊息
以上的的條件需要 A 和 B 都知道雙方都擁有這個能力。(達成共識)
為什麼是三次
我剛才提到機器通訊前需要雙方都線上並且都擁有通訊能力
,那麼我們看下最少需要多少步能夠滿足對話的必要條件。
第一步:
A 向 B 在一定時間範圍內傳送[1]
嘗試想要建立連結的訊息 (如果成功證明 A 能夠發訊息)
第二步: (B 接受到 A 的訊息)
B 向 A 傳送[2]
收到了 A 的訊息的訊息 (已經證明 A 能夠傳送訊息 B 能夠接收訊息) (未知的是 A 能不能收到 B 的訊息,以及 B 能不能成功的發訊息)
第三步: (A 接受到 B 的訊息)
停止第一步的行為。
此時 A 已經知道了 AB 都具有收發訊息的能力。
但是 B 還不知道 A 能不能接收到訊息。
所以這個時候需要 A 傳送[3]
一條訊息告訴 B 。
如果 B 收到了訊息說明雙方都具備的完成一次對話的基本條件,tcp連結建立完成。
四次揮手
四次揮手的目的是為了達到完成一次通訊後能夠關閉無用連結釋放掉伺服器資源來做其他的事。
由於 tcp 是一種全雙工通訊協議。
所以達到目的的標誌是
AB 雙方都關閉了自己的 接受資料
的介面 和 傳送資料
的介面。
我們來看下最少需要多少步:
1、A(主動方)發起[1]
斷開連結的請求告訴A所有資料傳送完畢可以關閉接收資料的介面 (只是說明A將要關閉傳送介面,此時A正常接收資料)
2、B(被動方)接收到請求關閉接收資料的介面
向 A 傳送[2]
確認關閉接收資料的介面的訊息,叫A不要再次傳送關閉連結的請求了。
A 收到 B 的確認訊息後關閉了傳送介面,等待 B 將所有的資料傳輸完畢後關閉介面的訊息。
3、B 如果沒有資料傳輸給 A 了會傳送[3]
一條關閉傳送介面的訊息給 A 讓 A 關閉自己的就收資料的介面。
4、A 收到 B 的訊息後會關閉自己的接收資料介面,並且傳送[4]
一條確認訊息告訴 B 不要再次傳送關閉介面的通知了。
如圖:
為什麼建立連線是三次握手,而關閉連線卻是四次揮手呢?這是因為服務端在LISTEN狀態下,收到建立連線請求的SYN報文後,把ACK和SYN放在一個報文裡傳送給客戶端。而關閉連線時,當收到對方的FIN報文時,僅僅表示對方不再傳送資料了但是還能接收資料,己方也未必全部資料都傳送給對方了,所以己方可以立即close,也可以傳送一些資料給對方後,再傳送FIN報文給對方來表示同意現在關閉連線,因此,己方ACK和FIN一般都會分開傳送。
(完)