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