日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux网络编程——浅谈 TCP 三次握手和四次挥手

發(fā)布時(shí)間:2025/3/21 linux 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux网络编程——浅谈 TCP 三次握手和四次挥手 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、tcp協(xié)議格式





二、三次握手


在 TCP/IP 協(xié)議中,TCP 協(xié)議提供可靠的連接服務(wù),采用三次握手建立一個(gè)連接。

?


第一次握手:建立連接時(shí),客戶端發(fā)送 syn 包(tcp協(xié)議中syn位置1,序號(hào)為J)到服務(wù)器,并進(jìn)入 SYN_SEND 狀態(tài),等待服務(wù)器確認(rèn);?


第二次握手:服務(wù)器收到 syn 包,必須確認(rèn)客戶的 SYN,同時(shí)自己也發(fā)送一個(gè) SYN 包,即 SYN+ACK包(tcp協(xié)議中syn位置1,ack位置1,序號(hào)K,確定序號(hào)為J+1),此時(shí)服務(wù)器進(jìn)入 SYN_RECV 狀態(tài);?


第三次握手:客戶端收到服務(wù)器的 SYN+ACK 包,向服務(wù)器發(fā)送確認(rèn)包 ACK(tcp協(xié)議中ack位置1,確認(rèn)序號(hào)K+1),此包發(fā)送完畢,客戶端和服務(wù)器進(jìn)入 ESTABLISHED 狀態(tài),完成三次握手。


?


通過這樣的三次握手,客戶端與服務(wù)端建立起可靠的雙工的連接,開始傳送數(shù)據(jù)。?三次握手的最主要目的是保證連接是雙工的,可靠更多的是通過重傳機(jī)制來保證的。但是為什么一定要進(jìn)行三次握手來保證連接是雙工的呢,一次不行么?兩次不行么?


我們舉一個(gè)現(xiàn)實(shí)生活中兩個(gè)人進(jìn)行語言溝通的例子來模擬三次握手。


第一次對(duì)話:?

老婆讓甲出去打醬油,半路碰到一個(gè)朋友乙,甲問了一句:哥們你吃飯了么??


結(jié)果乙?guī)е鷻C(jī)聽歌呢,根本沒聽到,沒反應(yīng)。甲心里想:跟你說話也沒個(gè)音,不跟你說了,溝通失敗。說明乙接受不到甲傳過來的信息的情況下溝通肯定是失敗的。

?

如果乙聽到了甲說的話,那么第一次對(duì)話成功,接下來進(jìn)行第二次對(duì)話。?



第二次對(duì)話:?

乙聽到了甲說的話,但是他是老外,中文不好,不知道甲說的啥意思也不知道怎樣回答,于是隨便回答了一句學(xué)過的中文 :我去廁所了。甲一聽立刻笑噴了,“去廁所吃飯”?道不同不相為謀,離你遠(yuǎn)點(diǎn)吧,溝通失敗。說明乙無法做出正確應(yīng)答的情況下溝通失敗。?


如果乙聽到了甲的話,做出了正確的應(yīng)答,并且還進(jìn)行了反問:我吃飯了,你呢?那么第二次握手成功。?


通過前兩次對(duì)話證明了乙能夠聽懂甲說的話,并且能做出正確的應(yīng)答。接下來進(jìn)行第三次對(duì)話。?



第三次對(duì)話:?

甲剛和乙打了個(gè)招呼,突然老婆喊他,“你個(gè)死鬼,打個(gè)醬油咋這么半天,看我回家咋收拾你”,甲是個(gè)妻管嚴(yán),聽完嚇得二話不說就跑回家了,把乙自己晾那了。乙心想:這什么人啊,得,我也回家吧,溝通失敗。說明甲無法做出應(yīng)答的情況下溝通失敗。?


如果甲也做出了正確的應(yīng)答:我也吃了。那么第三次對(duì)話成功,兩人已經(jīng)建立起了順暢的溝通渠道,接下來開始持續(xù)的聊天。?


通過第二次和第三次的對(duì)話證明了甲能夠聽懂乙說的話,并且能做出正確的應(yīng)答。?可見,兩個(gè)人進(jìn)行有效的語言溝通,這三次對(duì)話的過程是必須的。

?

同理對(duì)于TCP為什么需要進(jìn)行三次握手我們可以一樣的理解:?

為了保證服務(wù)端能收接受到客戶端的信息并能做出正確的應(yīng)答而進(jìn)行前兩次(第一次和第二次)握手,為了保證客戶端能夠接收到服務(wù)端的信息并能做出正確的應(yīng)答而進(jìn)行后兩次(第二次和第三次)握手。?


三、四次揮手

由于 TCP 連接是全雙工的,因此每個(gè)方向都必須單獨(dú)進(jìn)行關(guān)閉。這好比,我們打電話(全雙工),正常的情況下(出于禮貌),通話的雙方都要說再見后才能掛電話,保證通信雙方都把話說完了才掛電話



那TCP 的四次握手,是為了保證通信雙方都關(guān)閉了連接,具體過程如下:




1)客戶端 A 在應(yīng)用層調(diào)用close時(shí)會(huì)激發(fā)底層發(fā)送一個(gè) FIN(tcp協(xié)議中FIN位置1、序號(hào)為M,結(jié)合上圖分析)請(qǐng)求,用來關(guān)閉客戶 A 到服務(wù)器 B 的數(shù)據(jù)傳送,客戶端A此時(shí)處于半關(guān)閉狀態(tài)應(yīng)用層無法接收數(shù)據(jù)但底層還可以接收數(shù)據(jù));


2)服務(wù)器 B 底層收到客戶端A的FIN時(shí)會(huì)做兩件事

2.1)第1件事:收到客戶端A的FIN時(shí)底層會(huì)主動(dòng)回發(fā)一個(gè)ACK(tcp協(xié)議中ACK位置1,確認(rèn)序號(hào)M+1

2.2)第2件事:收到客戶端A的FIN時(shí),導(dǎo)致服務(wù)器B的應(yīng)用層read()返回0(告訴服務(wù)器B應(yīng)用層:客戶端A關(guān)閉了


3)服務(wù)器B應(yīng)用層調(diào)用close()激發(fā)底層給客戶端 A 發(fā)送一個(gè) FIN(tcp協(xié)議中FIN位置1、序號(hào)為N),這是服務(wù)器B已處于半關(guān)閉狀態(tài);


4)客戶端 A 底層發(fā) ACK(tcp協(xié)議中ACK位置1,確認(rèn)序號(hào)N+1) 給服務(wù)器B,這是客戶端A、服務(wù)器B都處于完全關(guān)閉狀態(tài),回收相應(yīng)的資源。





為什么建立連接協(xié)議是三次握手,而關(guān)閉連接卻是四次握手呢?


這是因?yàn)榉?wù)端的 LISTEN 狀態(tài)下的 SOCKET 當(dāng)收到 SYN 報(bào)文的建連請(qǐng)求后,它可以把 ACK 和 SYN(ACK 起應(yīng)答作用,而 SYN 起同步作用)放在一個(gè)報(bào)文里來發(fā)送。但關(guān)閉連接時(shí),當(dāng)收到FIN 報(bào)文通知時(shí),如果能將ACK、FIN放在一個(gè)報(bào)文里那么就有了三次揮手,但是這是不可能,因?yàn)锳CK是服務(wù)器B一收到FIN報(bào)文底層就回發(fā)的,而服務(wù)器B的FIN是應(yīng)用層調(diào)用close()激發(fā)的,所以它這里的 ACK 報(bào)文和 FIN 報(bào)文在發(fā)送的時(shí)間上都是分開的,不可能同時(shí)發(fā)送


為什么 TIME_WAIT 狀態(tài)還需要等 2MS L后才能返回到 CLOSED 狀態(tài)?


這是因?yàn)殡m然雙方都同意關(guān)閉連接了,而且握手的 4 個(gè)報(bào)文也都協(xié)調(diào)和發(fā)送完畢,按理可以直接回到 CLOSED 狀態(tài)(就好比從 SYN_SEND 狀態(tài)到 ESTABLISH 狀態(tài)那樣);但是因?yàn)槲覀儽仨氁傧?span style="background-color:rgb(255,204,0)">網(wǎng)絡(luò)是不可靠的,你無法保證你最后發(fā)送的 ACK 報(bào)文會(huì)一定被對(duì)方收到,因此對(duì)方處于 LAST_ACK 狀態(tài)下的 SOCKET 可能會(huì)因?yàn)槌瑫r(shí)未收到 ACK 報(bào)文,而重發(fā) FIN 報(bào)文,所以這個(gè) TIME_WAIT 狀態(tài)的作用就是用來重發(fā)可能丟失的 ACK 報(bào)文。(里面涉及的狀態(tài)是什么意思,詳情請(qǐng)看《TCP 通信過程中各步驟的狀態(tài)》)

總結(jié)

以上是生活随笔為你收集整理的Linux网络编程——浅谈 TCP 三次握手和四次挥手的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。