這也能考慮到?TCP 有點牛逼
大家好,我是小林。
我在網站看到一位老哥問了個問題。
簡單點說,為什麼在 TCP 三次握手過程中,如果客戶端收到的 SYN-ACK 報文的確認號不符合預期的話,為什麼是回 RST,而不是丟棄呢?
我說回 RST 就回 RST 嗎?
當然不是,我也是看 RFC 標準確認過。
我來先描述下這個場景吧:
客戶端向服務端傳送 SYN 報文(seq=100),但是網路中有個不速之客,一個歷史的 SYN 報文(seq=90)先抵達服務端; 服務端收到歷史的 SYN 報文,就會對此 SYN 報文做了確認,回了 SYN-ACK 報文,確認號為 90+1; 客戶端收到 SYN-ACK 報文後,誒發現不對勁,他明明發的是 SYN 報文(seq=100),按道理 SYN-ACK 報文中的確認號是 100+1,可現在收到的確認號為 90+1 的 SYN-ACK 報文,所以禮貌地回了 RST 給服務端; 服務端收到 RST 報文後,服務端就斷開處於 SYN_RECEVIED 狀態的連線; 最後正常的 SYN 報文(seq=100)終於抵達了服務端,經過三次握手後,雙方的 TCP 連線都建立完成。
上面這個過程,就是 TCP 三次握手防止歷史連線建立的過程,之所以 TCP 需要三次握手,首要原因是為了防止舊的重複連線初始化造成混亂,其次原因是可靠的同步雙方的序列號。
那為什麼要設計成,當客戶端收到不符合期望的 SYN-ACK 報文,是回 RST,而不是丟棄呢?
現在我們來假設是丟棄處理,看看會發生什麼?
可以看到,當處於 SYN_SENT 狀態連線的客戶端收到不符合期望的 SYN-ACK 報文時,如果選擇的處理是「丟棄」,那麼雙方都會觸發超時重傳,直到達到最大的重傳次數才會進入 CLOSE 狀態,這個過程需要持續 10-20 秒。
從客戶端的角度看,就是遲遲與服務端建立不來連線,因為服務端這邊已經存在一個相同四元組的舊連線,如果不把服務端這個連線幹掉,那麼是無法確認客戶端新的連線(SEQ=100),因為非 LISTEN 狀態下,如果收到 SYN,都是回 challenge ack,這個 ack 並不是對收到 SYN 報做確認,而是繼續回覆上一次已傳送 ACK。
是不是有種服務端的舊連線(SEQ=90)佔著茅坑不拉屎的感覺?
所以啊,幹掉服務端的舊連線的工作,就交給了客戶端來做了。
當處於 SYN_SENT 狀態連線的客戶端,在收到不符合期望的 SYN-ACK 報文時,就直接 RST 給服務端,幹掉服務端的舊連線,這樣客戶端的新連線才能快速建立。
怎麼樣,TCP 處處是細節啊!
再次感受到了 TCP 的博大精深
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024924/viewspace-2934963/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 盤點:史上最牛逼的黑客事件!黑客事件
- 我試圖透過這篇文章告訴你,這行原始碼有多牛逼。原始碼
- Linux TCP程式設計常見問題考慮LinuxTCP程式設計
- 你朋友很牛逼,跟你有什麼關係?
- 不打網球也能贏?這款休閒網球遊戲的設計思路有點皮遊戲
- 今日頭條這麼牛逼,用了什麼技術?
- 帶出超牛逼團隊的獨家祕訣有哪些?
- Yii框架特點及測試考慮框架
- 谷歌CEO:沒有這項能力,再牛的程式設計師也不要!谷歌程式設計師
- MysqL應該考慮到的安全策略MySql
- Get到這些,明年你也能參加谷歌開發者大會!谷歌
- 臥槽,牛逼!vue3的元件竟然還能“暫停”渲染!Vue元件
- 程式設計師別迷茫,通往牛逼的道路有很多程式設計師
- APP功能測試中經常遇見,需要考慮到的測試點APP
- 有了這款外掛,EXCEL也能處理大資料Excel大資料
- 沒有學位,通過這四步也能進GoogleGo
- 管理軟體也太難選了,中小企業選型時應該考慮這些因素!
- 牛逼至極!用這個神器看程式碼太舒服了
- 伺服器託管需要考慮這些因素伺服器
- 由一次KPI考慮到的問題KPI
- Web應用上線前,程式設計師該考慮的技術有這些Web程式設計師
- 選擇ASM做儲存時的一點點考慮ASM
- 高中畢業後女生能考慮學計算機嗎?計算機
- 史上最牛逼程式猿-《棋魂》
- 從ui圖到開發頁面該有的考慮UI
- 有了它,Golang 也能 Eval 了Golang
- 分享一段牛逼程式碼
- 單點登入的實現問題:幾種方式的實現原理有點了解,但還沒怎麼考慮到實現時的技術難點,請各位有這方面經驗的大哥能給我列出些實現上的技術及難點,先謝謝了!
- 懵逼的HTTP、Socket與TCPHTTPTCP
- 好用不卡,這些外掛和配置讓你的 Webstorm 更牛逼!WebORM
- 錄屏軟體哪個好?考慮以下幾點
- 精益工廠佈局考慮這些就夠了!
- 沒有發生GC也進入了安全點?這段關於安全點的JVM原始碼有點意思!GCJVM原始碼
- Java 8 有多牛逼?打破一切你對介面的認知!Java
- Web前端必備基礎知識點,百萬程式設計師:牛逼!Web前端程式設計師
- 99%的程式都沒有考慮的網路異常
- 2023值得考慮的bi軟體有哪些?
- 那些年 IT大佬們吹過的牛逼