我在網(wǎng)站看到一位老哥問(wèn)了個(gè)問(wèn)題。
簡(jiǎn)單點(diǎn)說(shuō),為什么在 TCP 三次握手過(guò)程中,如果客戶(hù)端收到的 SYN-ACK 報(bào)文的確認(rèn)號(hào)不符合預(yù)期的話(huà),為什么是回 RST,而不是丟棄呢?
我說(shuō)回 RST 就回 RST 嗎?
當(dāng)然不是,我也是看 RFC 標(biāo)準(zhǔn)確認(rèn)過(guò)。
我來(lái)先描述下這個(gè)場(chǎng)景吧:
- 客戶(hù)端向服務(wù)端發(fā)送 SYN 報(bào)文(seq=100),但是網(wǎng)絡(luò)中有個(gè)不速之客,一個(gè)歷史的 SYN 報(bào)文(seq=90)先抵達(dá)服務(wù)端;
- 服務(wù)端收到歷史的 SYN 報(bào)文,就會(huì)對(duì)此 SYN 報(bào)文做了確認(rèn),回了 SYN-ACK 報(bào)文,確認(rèn)號(hào)為 90+1;
- 客戶(hù)端收到 SYN-ACK 報(bào)文后,誒發(fā)現(xiàn)不對(duì)勁,他明明發(fā)的是 SYN 報(bào)文(seq=100),按道理 SYN-ACK 報(bào)文中的確認(rèn)號(hào)是 100+1,可現(xiàn)在收到的確認(rèn)號(hào)為 90+1 的 SYN-ACK 報(bào)文,所以禮貌地回了 RST 給服務(wù)端;
- 服務(wù)端收到 RST 報(bào)文后,服務(wù)端就斷開(kāi)處于 SYN_RECEVIED 狀態(tài)的連接;
- 最后正常的 SYN 報(bào)文(seq=100)終于抵達(dá)了服務(wù)端,經(jīng)過(guò)三次握手后,雙方的 TCP 連接都建立完成。
上面這個(gè)過(guò)程,就是 TCP 三次握手防止歷史連接建立的過(guò)程,之所以 TCP 需要三次握手,首要原因是為了防止舊的重復(fù)連接初始化造成混亂,其次原因是可靠的同步雙方的序列號(hào)。
那為什么要設(shè)計(jì)成,當(dāng)客戶(hù)端收到不符合期望的 SYN-ACK 報(bào)文,是回 RST,而不是丟棄呢?
現(xiàn)在我們來(lái)假設(shè)是丟棄處理,看看會(huì)發(fā)生什么?
可以看到,當(dāng)處于 SYN_SENT 狀態(tài)連接的客戶(hù)端收到不符合期望的 SYN-ACK 報(bào)文時(shí),如果選擇的處理是「丟棄」,那么雙方都會(huì)觸發(fā)超時(shí)重傳,直到達(dá)到最大的重傳次數(shù)才會(huì)進(jìn)入 CLOSE 狀態(tài),這個(gè)過(guò)程需要持續(xù) 10-20 秒。
從客戶(hù)端的角度看,就是遲遲與服務(wù)端建立不來(lái)連接,因?yàn)榉?wù)端這邊已經(jīng)存在一個(gè)相同四元組的舊連接,如果不把服務(wù)端這個(gè)連接干掉,那么是無(wú)法確認(rèn)客戶(hù)端新的連接(SEQ=100),因?yàn)榉?LISTEN 狀態(tài)下,如果收到 SYN,都是回 challenge ack,這個(gè) ack 并不是對(duì)收到 SYN 報(bào)做確認(rèn),而是繼續(xù)回復(fù)上一次已發(fā)送 ACK。
是不是有種服務(wù)端的舊連接(SEQ=90)占著茅坑不拉屎的感覺(jué)?
所以啊,干掉服務(wù)端的舊連接的工作,就交給了客戶(hù)端來(lái)做了。
當(dāng)處于 SYN_SENT 狀態(tài)連接的客戶(hù)端,在收到不符合期望的 SYN-ACK 報(bào)文時(shí),就直接 RST 給服務(wù)端,干掉服務(wù)端的舊連接,這樣客戶(hù)端的新連接才能快速建立。
怎么樣,TCP 處處是細(xì)節(jié)啊!
再次感受到了 TCP 的博大精深
審核編輯 :李倩
-
TCP
+關(guān)注
關(guān)注
8文章
1402瀏覽量
80993 -
RFC
+關(guān)注
關(guān)注
0文章
16瀏覽量
10209 -
服務(wù)端
+關(guān)注
關(guān)注
0文章
68瀏覽量
7228
原文標(biāo)題:這也能考慮到?TCP 有點(diǎn)牛逼
文章出處:【微信號(hào):小林coding,微信公眾號(hào):小林coding】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
中國(guó)5G基站總量占全球60%,你感受到了嗎?
學(xué)raw os 以來(lái)的真實(shí)感受之小見(jiàn)
為什么步進(jìn)電機(jī)能感受到在轉(zhuǎn)動(dòng),但是看不到轉(zhuǎn)動(dòng)?
最新可穿戴技術(shù)可助聾啞人通過(guò)皮膚感受到立體聲
Linux那些事兒之我是U盤(pán)
可以感受到瓢蟲(chóng)腿兒運(yùn)動(dòng)的“人造皮膚”
雷霆世紀(jì)獵空C504評(píng)測(cè) 感受到了滿(mǎn)滿(mǎn)的誠(chéng)意
機(jī)器人進(jìn)行新聞播報(bào) 使人類(lèi)感受到了前所未有的壓力
傳感器技術(shù)用于文物保護(hù),將迎來(lái)新的機(jī)遇和挑戰(zhàn)
Apple推出VR手套專(zhuān)利 可以使用戶(hù)感受到VR或AR顯示的對(duì)象
Apple VR手套專(zhuān)利技術(shù)可以讓您感受到虛擬紋理
Apple VR手套專(zhuān)利可讓我們感受到虛擬紋理
能感受到空氣質(zhì)量變化的開(kāi)源設(shè)計(jì)

評(píng)論