TCP 連接的建立和終止

1、概述

網絡開發中,你怎麼也不會避開TCP協議,而且面試中這個也是一個基礎問題。總的來說 TCP 的建立分爲三次握手,而 TCP 的終止則需要四次揮手。

2、TCP的建立(三次握手)

建立一個 TCP 連接時會發生以下情形。
1、服務器端必須準備好接受外來的連接。通常通過調用 socket、bind 和 listen 這3個函數來完成,我們稱爲被動打開(passive open)。
2、客戶端通過調用 connect 發起 主動打開(active open)。這導致客戶端 TCP 發送一個 SYN(同步序列編號:Synchronize Sequence Numbers)分節,它告訴服務器客戶端將在連接中發送的數據的初始序列號。通常 SYN 分節不攜帶數據,其所在 IP 數據報只含一個 IP 首部、一個 TCP 首部及可能有的 TCP 選項(後面進行說明)。
3、服務器端接收到客戶端的請求後,必須確認客戶的 SYN,同時自己也得發送一個 SYN 分節,它含有服務器端將在同一連接中發送的數據的初始序列號。確認的因爲單詞 Acknowledgement,所以簡稱 ACK。服務端在給客戶端回覆時,同時發送自己的 SYN 和 對客戶 SYN 的 ACK。
4、客戶端接收到服務器端的消息,必須對服務器端的 SYN 進行確認

這種交換至少需要 3 個分節,因此稱爲TCP 的三次握手
在這裏插入圖片描述

圖中,客戶端給的初始序列號爲 J,服務器的初始序列號爲 K。ACK 中的確認號是發送這個請求的一端所期待的下一個序列號,即服務端發送的 ACK 爲 J+1,而客戶端確認服務端的 ACK 爲 K+1。

3、TCP連接終止(四次揮手)

TCP建立一個連接需 3 個分節,終止一個連接則需要 4 個分節。
1、某個應用進程首先調用 close,我們稱爲該端執行 主動關閉(active close)。該端的 TCP 於是發送一個 FIN 分節,表示數據發送完畢。
2、接收到這個 FIN 的對端執行 被動關閉(passive close)。這個 FIN 由 TCP 確認。它的接收也作爲一個文件結束符(end-of-file)傳遞給接收端應用程序(放在已排隊等候該應用程序接收的任何其它數據之後),因爲 FIN 的接收意味着接收端應用程序在相應連接上再無額外的數據可接收。
3、一段時間後,接收到這個文件結束符的應用進程將調用 close 關閉它的套接字。這導致它的 TCP 也發送一個 FIN。
4、接收這個最終 FIN 的原發送端 TCP(即執行主動關閉的那一端)確認這個 FIN。類似的,每個 FIN 的 ACK中的確認號是該 FIN 序列號加 1。

既然每個方向都需要一個 FIN 和一個 ACK,因此通常需要 4 個分節,所以稱爲TCP 的四次揮手。
在這裏插入圖片描述
調用 close 的一端,只是說不能通過這個 套接字 發送數據了,接收數據是沒有影響的,這種情況叫做 半關閉(half-close)。

4、TCP 選項

在第二節裏,我們說 SYN 分節會帶有 TCP選項,這裏就對這個選項進行介紹。

每一個 SYN 可以含有多個 TCP 選項。下面是常用的 TCP 選項。
1、MSS選項。發送 SYN 的 TCP 一端使用本選項告知對端它的 最大分節大小(maximumsegment size)即 MSS。就是每個 TCP 包中能夠接受的最大數據量。發送端TCP使用接收端的 MSS 值作爲所發送分節的最大大小。

2、窗口規模選項。這個主要是用於TCP通訊中的,因爲TCP是穩定傳輸,需要確定數據流的正確性,需要對發送的數據進行校驗,如果出現問題需要進行重發。如果每發送一個數據包就進行檢驗,效率非常的低,窗口就是可以一次發送多少包,然後進行校驗(原理大概是這個樣子,細節自行百度)。

3、時間戳選項。這個選項對於高速網絡連接是必要的,它可以防止由失而復得的分節可能造成的數據損壞。它是一個較新的選項。

5、TCP 狀態轉換圖

TCP 涉及 連接建立連接終止 的操作可以用狀態轉換圖來說明。

在這裏插入圖片描述TCP 爲一個連接定義了 11 種狀態,並且 TCP 規則規定了如何基於當前狀態及在該狀態下所接收的分節從一個狀態轉換到另個一狀態。

自ESTABLISHED 狀態引出的兩個箭頭處理連接的終止。如果某個應用進程在接收到一個 FIN 之前調用 close(主動關閉),那就轉換到 FIN_WAIT_1狀態。但如果某個應用進程在 ESTABLISHED 狀態期間接收到一個FIN(被動關閉),那就轉換到 CLOSE_WAIT狀態。

這些狀態可使用 netstat顯示,它是一個在調試客戶/服務器應用時很有用的工具。

感謝大家,我是假裝很努力的YoungYangD(小羊)

參考資料:
《UNIX 網絡編程(卷1:套接字)》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章