建筑資料網(wǎng)站有哪些鄭州seo技術(shù)外包
還是用一下上一篇文章畫的圖
TCP 的 11 個(gè)狀態(tài),每一個(gè)狀態(tài)都缺一不可,自然 TIME_WAIT 狀態(tài)被賦予的意義也是相當(dāng)重要,咱們直接結(jié)論先行
上文我們提到 tcp 中,主動(dòng)關(guān)閉的一邊會(huì)進(jìn)入 TIME_WAIT 狀態(tài),
另外 Tcp 中的有 TIME_WAIT 狀態(tài),主要是有如下 2 個(gè)原因:
- 為了防止被動(dòng)關(guān)閉一方的延遲數(shù)據(jù)被其他連接竊取
- 為了防止被動(dòng)關(guān)閉的一方,沒有收到最后的一個(gè) ACK 包
如何理解呢?
為了防止被動(dòng)關(guān)閉一方的延遲數(shù)據(jù)被其他連接竊取
對于第一個(gè)
咱們一個(gè)一個(gè)的來詳細(xì)解釋一下,還是上面這個(gè)圖,咱們?nèi)藶榈募右稽c(diǎn)異常的情況
咱們在 tcp 連接中,客戶端先發(fā)起關(guān)閉,那么 TIME_WAIT 狀態(tài)就在客戶端這邊,如下:
這是一個(gè)正常的客戶端和服務(wù)端通信的基本過程,那么,如果在 client 和 server 建立連接后,server 端向 client 端發(fā)發(fā)送的數(shù)據(jù),在網(wǎng)絡(luò)環(huán)境中有延遲,短時(shí)間,沒有順利的達(dá)到 client 端的時(shí)候,就會(huì)出現(xiàn)如下情況
如上圖
- 我們?nèi)藶榈漠嬃艘粋€(gè)會(huì)出現(xiàn)在現(xiàn)實(shí)工作中的問題,當(dāng) client 和 server 正常連接,server 給 client 發(fā)的 seq=100 的包,由于網(wǎng)絡(luò)擁堵等原因,留在了網(wǎng)絡(luò)環(huán)境中
- client 首先發(fā)起關(guān)閉連接,如果這個(gè)時(shí)候,沒有 TIME_WAIT 狀態(tài),或者咱們?nèi)藶榈膶?TIME_WAIT 的值設(shè)小,就會(huì)出現(xiàn) seq=100 這個(gè)包不能正常的被 client 收到,因?yàn)?client 已經(jīng)是 CLOSED 狀態(tài)了
- 這個(gè)時(shí)候,和 client 占用同一端口的程序 client 路人啟動(dòng)程序并和 server 成功建立連接之后,剛才的 seq=100 的包才到目的地址,這個(gè)時(shí)候 client 路人并不期望收到這個(gè) seq=100 的消息,那么這對 client 路人來說,這就是一個(gè)異常問題了
如果咱們的 TIME_WAIT 狀態(tài)存在,或者是正常保持 2MSL 的時(shí)間,就不會(huì)出現(xiàn)這個(gè)情況 ,1 個(gè) MSL 是報(bào)文在網(wǎng)絡(luò)環(huán)境中的最大存活時(shí)間,對于上面這個(gè)例子, client 現(xiàn)在那就還是 TIME_WAIT 狀態(tài), client 路人使用 client 的端口,是無法啟動(dòng)的,且 2MSL 的時(shí)間 seq=100 是完全可以達(dá)到 client 的
那是否會(huì)有人問,為什么 client 程序還在的時(shí)候,就不能啟動(dòng) client 路人程序呢?
對于這個(gè),咱們就需要知道 TCP 的一條連接,是由四元組組成的
- 源地址
- 源端?
- ?的地址
- ?的端?
此處我們知道,client 和 client 路人,源地址,目的地址,目的端口,都是一樣的,那么此時(shí)如果源端口還是一樣的話,那么是沒有辦法 2 個(gè) client 都能正常啟動(dòng)的,其中一個(gè)正常啟動(dòng)了,那么另外一個(gè)就會(huì)報(bào)地址已經(jīng)被使用
為了防止被動(dòng)關(guān)閉的一方,沒有收到最后的一個(gè) ACK 包
再來看第二點(diǎn)
其實(shí)上面我們隱約已經(jīng)說到了這一點(diǎn),只不過不是 ack 包,再使用一下上面的圖,我們?nèi)藶榈呐粋€(gè)異常情況
如上圖,當(dāng)我們的 TIME_WAIT 狀態(tài)不存在,或者設(shè)置的時(shí)間較小的時(shí)候,就可能會(huì)發(fā)生被動(dòng)關(guān)閉的一方,收不到最后的一個(gè) ack 包的情況
- 一條 tcp 連接的四元組現(xiàn)在我們知道是啥意思了,那么,當(dāng)上述 server 對應(yīng)的連接還未是 CLOSED 狀態(tài)的時(shí)候,server 是認(rèn)為當(dāng)前連接還是存在的
- 但是 client 自身已經(jīng)是 CLOSED 狀態(tài)了,所以對于 client 路人來說,我當(dāng)前的連接是有效的,因此我去給 server 發(fā)握手包
- 可是萬萬沒有想到,server 拒絕我的連接,client 路人就很蒙圈
此時(shí),如果 TIME_WAIT 狀態(tài)存在,并且等待的時(shí)間是 2MSL ,那么哪怕最后一個(gè) ack 包丟失了,server 端也可以重新發(fā)送一個(gè) FIN 包給到 client ,再等待一個(gè)新的 ack 包
這樣,2 MSL 之后,client 和 server 端,對于這一條連接,都是正常關(guān)閉的
所以,為什么需要 TIME_WAIT 狀態(tài),心里有點(diǎn)數(shù)了不
感謝閱讀,歡迎交流,點(diǎn)個(gè)贊,關(guān)注一波 再走吧
歡迎點(diǎn)贊,關(guān)注,收藏
朋友們,你的支持和鼓勵(lì),是我堅(jiān)持分享,提高質(zhì)量的動(dòng)力
好了,本次就到這里
技術(shù)是開放的,我們的心態(tài),更應(yīng)是開放的。擁抱變化,向陽而生,努力向前行。
我是阿兵云原生,歡迎點(diǎn)贊關(guān)注收藏,下次見~
可以進(jìn)入地址進(jìn)行體驗(yàn)和學(xué)習(xí):https://xxetb.xet.tech/s/3lucCI