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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

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

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

一、tcp協議格式





二、三次握手


在 TCP/IP 協議中,TCP 協議提供可靠的連接服務,采用三次握手建立一個連接。

?


第一次握手:建立連接時,客戶端發送 syn 包(tcp協議中syn位置1,序號為J)到服務器,并進入 SYN_SEND 狀態,等待服務器確認;?


第二次握手:服務器收到 syn 包,必須確認客戶的 SYN,同時自己也發送一個 SYN 包,即 SYN+ACK包(tcp協議中syn位置1,ack位置1,序號K,確定序號為J+1),此時服務器進入 SYN_RECV 狀態;?


第三次握手:客戶端收到服務器的 SYN+ACK 包,向服務器發送確認包 ACK(tcp協議中ack位置1,確認序號K+1),此包發送完畢,客戶端和服務器進入 ESTABLISHED 狀態,完成三次握手。


?


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


我們舉一個現實生活中兩個人進行語言溝通的例子來模擬三次握手。


第一次對話:?

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


結果乙帶著耳機聽歌呢,根本沒聽到,沒反應。甲心里想:跟你說話也沒個音,不跟你說了,溝通失敗。說明乙接受不到甲傳過來的信息的情況下溝通肯定是失敗的。

?

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



第二次對話:?

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


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


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



第三次對話:?

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


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


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

?

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

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


三、四次揮手

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



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




1)客戶端 A 在應用層調用close時會激發底層發送一個 FIN(tcp協議中FIN位置1、序號為M,結合上圖分析)請求,用來關閉客戶 A 到服務器 B 的數據傳送,客戶端A此時處于半關閉狀態應用層無法接收數據但底層還可以接收數據);


2)服務器 B 底層收到客戶端A的FIN時會做兩件事

2.1)第1件事:收到客戶端A的FIN時底層會主動回發一個ACK(tcp協議中ACK位置1,確認序號M+1

2.2)第2件事:收到客戶端A的FIN時,導致服務器B的應用層read()返回0(告訴服務器B應用層:客戶端A關閉了


3)服務器B應用層調用close()激發底層給客戶端 A 發送一個 FIN(tcp協議中FIN位置1、序號為N),這是服務器B已處于半關閉狀態;


4)客戶端 A 底層發 ACK(tcp協議中ACK位置1,確認序號N+1) 給服務器B,這是客戶端A、服務器B都處于完全關閉狀態,回收相應的資源。





為什么建立連接協議是三次握手,而關閉連接卻是四次握手呢?


這是因為服務端的 LISTEN 狀態下的 SOCKET 當收到 SYN 報文的建連請求后,它可以把 ACK 和 SYN(ACK 起應答作用,而 SYN 起同步作用)放在一個報文里來發送。但關閉連接時,當收到FIN 報文通知時,如果能將ACK、FIN放在一個報文里那么就有了三次揮手,但是這是不可能,因為ACK是服務器B一收到FIN報文底層就回發的,而服務器B的FIN是應用層調用close()激發的,所以它這里的 ACK 報文和 FIN 報文在發送的時間上都是分開的,不可能同時發送


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


這是因為雖然雙方都同意關閉連接了,而且握手的 4 個報文也都協調和發送完畢,按理可以直接回到 CLOSED 狀態(就好比從 SYN_SEND 狀態到 ESTABLISH 狀態那樣);但是因為我們必須要假想網絡是不可靠的,你無法保證你最后發送的 ACK 報文會一定被對方收到,因此對方處于 LAST_ACK 狀態下的 SOCKET 可能會因為超時未收到 ACK 報文,而重發 FIN 報文,所以這個 TIME_WAIT 狀態的作用就是用來重發可能丟失的 ACK 報文。(里面涉及的狀態是什么意思,詳情請看《TCP 通信過程中各步驟的狀態》)

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产色黄 | 2021亚洲天堂 | 性色在线| 久久久久麻豆v国产精华液好用吗 | 黄瓜视频在线播放 | 男女调教视频 | 先锋影音av资源网 | 开心激情深爱 | 国产婷婷色一区二区三区在线 | 粉嫩av蜜桃av蜜臀av | 99午夜| 大尺度叫床戏做爰视频 | 成人小视频在线播放 | 人人爽人人爽人人片av | 国产伦精品一区二区三区视频女 | 欧美综合自拍亚洲综合图片区 | 国产91精选 | 精人妻无码一区二区三区 | 成 年 人 黄 色 大 片大 全 | 日韩电影中文字幕 | 亚洲码无人客一区二区三区 | 国产精品久久久久桃色tv | 欧美变态口味重另类在线视频 | 日韩精品极品视频在线观看免费 | 精品欧美乱码久久久久久 | 99在线观看视频 | 可以看毛片的网站 | 国产精品视频一 | 亚洲激情av | 插插操操 | 91精品国产综合久久福利 | 免费三级黄 | 日韩国产精品一区二区 | 久久女人 | 成人精品视频一区二区 | 国产又粗又长视频 | 波多野结衣啪啪 | 欧美三日本三级少妇三级99观看视频 | 中文字幕亚洲区 | 四虎毛片| 免费福利在线视频 | 国产又爽又猛又粗的视频a片 | 久草色在线 | 亚洲欧美综合色 | 国产综合图片 | 五月婷六月 | 色射射| 国产一级视频在线 | www.av色 | 精品免费囯产一区二区三区 | 国产成人无码a区在线观看视频 | 久久国产乱子伦精品 | 婷婷综合色 | 久久禁 | 999精品在线 | 在线免费激情视频 | 国产精品久久久久久免费 | 亚洲综合在 | 日本一本在线 | 欧美人与禽zozzo性之恋的特点 | 亚洲精品9999 | 97人人视频 | 国产精品久久久久久久久夜色 | 久久免费精品 | 妖精视频一区二区三区 | 夜夜草网站 | 亚洲综合久久网 | 色在线免费视频 | 99视频导航 | 国产一区二区三区18 | 波多野吉衣在线视频 | 国产乱码久久久 | 国产麻豆乱码精品一区二区三区 | 中文字幕福利视频 | 欧美日韩国产高清视频 | 蜜臀av88| 在线亚洲天堂 | 嫩草视频在线免费观看 | 韩国美女一区二区 | 97色伦影院 | 高潮网址| 伊人影院在线视频 | 香蕉视频911| 开心春色激情网 | 伊人艹| 亚洲欧美成人网 | 国产精品v欧美精品v日韩精品 | 亚洲精品一区二区在线 | 亚洲欧美综合另类 | 麻豆成人在线视频 | 欧美日韩高清一区二区 | 人人妻人人澡人人爽 | 色原网 | 婷婷六月天在线 | 午夜性生活片 | 国产污网站| 蜜桃视频久久一区免费观看入口 | 国内激情| 自拍偷拍国产视频 |