TCP 协议的三次握手、四次分手
詳細描述了 TCP 協議的連接和關閉的整個過程。解釋了為什么 TCP 協議是面向連接的、可靠的數據傳輸協議。
TCP
在互聯網上之間的通信交流,一般是基于 TCP (Transmission Control Protocol,傳輸控制協議) 或者 UDP (User Datagram Protocol,用戶數據報協議) 。兩者的一個重要區別是,TCP 是面向連接提供端到端可靠的數據流(flow of data)。
“面向連接”就是在正式通信前必須要與對方建立起連接。比如你給別人打電話,必須等線路接通了、對方拿起話筒才能相互通話。
三次握手
TCP 是基于連接的協議,也就是說,在正式收發數據前,必須和對方建立可靠的連接。一個 TCP 連接必須要經過三次“握手”才能建立起來,簡單的講就是:
三次“握手”的目的是使數據包的發送和接收同步,經過三次“對話”之后,主機 A 才向主機 B 正式發送數據。
四次分手
由于 TCP 連接是全雙工的,因此每個方向都必須單獨進行關閉。這個原則是當一方完成它的數據發送任務后就能發送一個 FIN 來終止這個方向的連接。收到一個 FIN 只意味著這一方向上沒有數據流動,一個 TCP 連接在收到一個 FIN 后仍能發送數據。首先進行關閉的一方將執行主動關閉,而另一方執行被動關閉。
TCP 采用四次分手關閉連接如圖2所示。
為什么建立連接協議是三次握手,而關閉連接卻是四次握手呢?
這是因為服務端的 LISTEN 狀態下的 SOCKET 當收到 SYN 報文的建連請求后,它可以把 ACK 和 SYN(ACK起應答作用,而SYN起同步作用)放在一個報文里來發送。但關閉連接時,當收到對方的 FIN 報文通知時,它僅僅表示對方沒有數據發送給你了;但未必你所有的數據都全部發送給對方了,所以你可以未必會馬上會關閉SOCKET,也即你可能還需要發送一些數據給對方之后,再發送 FIN 報文給對方來表示你同意現在可以關閉連接了,所以它這里的 ACK 報文和 FIN 報文多數情況下都是分開發送的。 【收到2個“好的”才算完成。大家好才是真的好】
為什么 TIME_WAIT 狀態還需要等 2MSL 后才能返回到 CLOSED 狀態?
這是因為雖然雙方都同意關閉連接了,而且握手的4個報文也都協調和發送完畢,按理可以直接回到 CLOSED 狀態(就好比從 SYN_SEND 狀態到 ESTABLISH 狀態那樣);但是因為我們必須要假想網絡是不可靠的,你無法保證你最后發送的ACK報文會一定被對方收到,因此對方處于 LAST_ACK 狀態下的 SOCKET 可能會因為超時未收到 ACK 報文,而重發 FIN 報文,所以這個 TIME_WAIT 狀態的作用就是用來重發可能丟失的 ACK 報文
控制信息字段
- SYN: 同步序列編號(Synchronize Sequence Numbers)
- ACK: 確認字段
- FIN: 發送方已經傳完數據
- PSH: 推送功能
- RST: 重置連接
- URG: 緊急指針
總結
以上是生活随笔為你收集整理的TCP 协议的三次握手、四次分手的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 做梦梦到眼镜坏了怎么回事
- 下一篇: 梦到朋友买衣服是什么意思