国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 操作系統(tǒng) > 正文

關(guān)于TCP連接建立與終止那點(diǎn)事

2024-06-28 13:19:08
字體:
供稿:網(wǎng)友
關(guān)于TCP連接建立與終止那點(diǎn)事

0. 前言

  最近在處理公司遺留項(xiàng)目的時(shí)候發(fā)現(xiàn)自己對TCP協(xié)議一點(diǎn)都不懂,所以補(bǔ)了點(diǎn)關(guān)于TCP連接的建立和終止的內(nèi)容,這里簡單寫下自己了解的部分,省略了報(bào)文序號確認(rèn)序號這些無關(guān)的字段,主要討論TCP狀態(tài)的轉(zhuǎn)換以及l(fā)inux下的一些問題。

  對于這篇文章來說,主要是記錄自己遇到的一些問題以及學(xué)習(xí)到的一些東西。

  關(guān)于TCP/ip協(xié)議,這里推薦一本書:《TCP/IP協(xié)議詳解:卷1》

1. TCP連接的建立

  學(xué)過計(jì)算機(jī)網(wǎng)絡(luò)的都知道TCP連接的建立需要三次握手,當(dāng)時(shí)在大學(xué)也這么聽著,但是具體怎么三次還是最近補(bǔ)了才知道這么回事。

  對于客戶端/服務(wù)器模型來說:

  1. 首先客戶端發(fā)起連接(發(fā)送SYN報(bào)文,進(jìn)入SYN_SENT狀態(tài))

  2. 服務(wù)器接收到SYN,然后響應(yīng)(發(fā)送SYN ACK,進(jìn)入SYN_RCVD狀態(tài),注意這個(gè)時(shí)候連接并沒有建立)

  3. 客戶端接受到后,發(fā)送確認(rèn)報(bào)文(發(fā)送ACK,進(jìn)入Established狀態(tài))

  4. 服務(wù)器收到后才進(jìn)入鏈路建立(Established)狀態(tài)。

如下圖(圖為百度搜出來的)

2. TCP連接的終止

  對于TCP連接的終止來說,卻需要四次揮手來完成,這里以客戶/服務(wù)器模型,客戶端主動(dòng)發(fā)起關(guān)閉來說明(這里服務(wù)器也可以發(fā)起主動(dòng)發(fā)起關(guān)閉)。

  1. 客戶端發(fā)送FIN(進(jìn)入FIN_WAIT_1狀態(tài))

  2. 服務(wù)器接收到FIN后對發(fā)送ACK確認(rèn)(此時(shí)服務(wù)器進(jìn)入CLOSE_WAIT狀態(tài),客戶端接受到該ACK后由FIN_WAIT_1 轉(zhuǎn)為FIN_WAIT_2狀態(tài))

  3. 服務(wù)器調(diào)用close發(fā)送FIN(進(jìn)入LASK_ACK狀態(tài))

  4. 客戶端接收到服務(wù)器發(fā)送的FIN后發(fā)送ACK(進(jìn)入TIME_WAIT狀態(tài))

  5. 服務(wù)器接收到后結(jié)束(LASK_ACK狀態(tài)轉(zhuǎn)為虛擬的CLOSED,即已經(jīng)沒有狀態(tài)了)

如下圖所示:

3. TCP狀態(tài)轉(zhuǎn)換

  其實(shí)如果看懂了上面連接的建立以及終止的話,很容易就可以看懂下面的狀態(tài)轉(zhuǎn)換圖,上面兩個(gè)就可以看做由它拆解出來的。

4. 遇到CLOSE_WAIT狀態(tài)的一些情況

  前面說了,最近在維護(hù)一些歷史遺留的項(xiàng)目,那代碼簡直是叼炸天了,直接使用兩個(gè)進(jìn)程共用一個(gè)select,在accept前加上文件鎖,select只監(jiān)聽服務(wù)器端fd,其它fd不監(jiān)聽....(此處省略一千字),然后現(xiàn)在出現(xiàn)了大量的CLOSE_WAIT狀態(tài),我在想難道以前就沒出現(xiàn)過?奇葩。不過被DDoS攻擊有些也會(huì)出現(xiàn)這種現(xiàn)象。最后討論了一下午說怎么樣才能少改動(dòng)原來的代碼....最后老大拍板,重寫select部分~^~,使用epoll實(shí)現(xiàn)。

  上面的狀態(tài)圖可以看出,服務(wù)器由于接收到客戶端發(fā)來的FIN,會(huì)進(jìn)入CLOSE_WAIT,如果此時(shí)沒有監(jiān)聽該客戶端fd并且沒有調(diào)用close,那么這時(shí)會(huì)導(dǎo)致占用的FD沒有被釋放,資源就這么被泄漏掉了,這樣也會(huì)導(dǎo)致存在大量的CLOSE_WAIT狀態(tài),以至于后續(xù)FD消耗完了的時(shí)候(一般系統(tǒng)默認(rèn)1024),accept就會(huì)失敗。(注:這里CLOSE_WAIT狀態(tài)是由于應(yīng)用程序沒有調(diào)用close導(dǎo)致的,系統(tǒng)不會(huì)釋放該資源,即會(huì)一直存在)

 ?。ㄗⅲ杭词筧ccept失敗,但是對于鏈路來說,還是能建立成功的,因?yàn)閷τ贚inux TCP底層實(shí)現(xiàn)來說,存在兩個(gè)隊(duì)列,一個(gè)為半鏈路隊(duì)列,另一個(gè)為三次握手成功但是沒有被服務(wù)器accept取走的鏈接的隊(duì)列。)

  后續(xù)對于Linux下的服務(wù)器來說一般都是使用epoll來處理,效率比select高。

5. 補(bǔ)充

  這里看到一些博客說通過設(shè)置系統(tǒng)參數(shù)來改變CLOSE_WAIT的維持等待時(shí)間,我查閱了一下,并且也嘗試過(其實(shí)不用試)。不能夠通過設(shè)置系統(tǒng)參數(shù)來更改的,因?yàn)檫@時(shí)應(yīng)用程序內(nèi)部導(dǎo)致的,,而且根本就不存在說CLOSE_WAIT維持時(shí)間一說,該狀態(tài)只有應(yīng)用程序調(diào)用close才會(huì)轉(zhuǎn)為其它狀態(tài)(或者關(guān)閉應(yīng)用程序),這里說通過修改系統(tǒng)參數(shù)一般指的時(shí)TIME_WAIT狀態(tài)的維持時(shí)間。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 都匀市| 九龙县| 台山市| 翁源县| 泰来县| 安乡县| 仪征市| 安泽县| 乐都县| 明溪县| 察雅县| 北安市| 芜湖市| 丹东市| 凌源市| 寻乌县| 白城市| 镇坪县| 阿图什市| 鄄城县| 齐齐哈尔市| 农安县| 龙门县| 丘北县| 德庆县| 衡阳县| 华亭县| 九江市| 韩城市| 康保县| 法库县| 金溪县| 大连市| 凤城市| 麟游县| 新建县| 大关县| 扎兰屯市| 三明市| 石阡县| 灵武市|