03.03 TCP協議下socket有沒有可能丟包呢?

馬善人


“我是喲喲吼說科技,專注於數據網絡的回答,歡迎大家與我交流數據網絡的問題”

如題,TCP協議下Socket是有可能發生丟包的,但是會有相應機制去處理丟包的問題。下面喲喲舉個實例來說明此問題:

假設客戶端發送數據包給服務器端,因數據包太大,需要進行分片,假設分成5片,分片1、分片2、分片3、分片4、分片5,那麼這5個分片到達服務器端有以下幾種方式:

一、各個分片按照順序到達服務器端

客戶端發送:分片1--分片2--分片3--分片4--分片5

服務器端接收:分片1--分片2--分片3--分片4--分片5

服務器端按照順序收到5個分片後,將這5個分片按照標誌位進行重組處理。

二、各個分片亂序到達服務器端

客戶端發送:分片1--分片2--分片3--分片4--分片5

服務器端接收:分片2--分片4--分片5--分片1--分片3等等

學過代數的同學都清楚,5個分片有25種到達服務器端的順序,除去正確順序的那一組,那麼還有24種。在服務器端收到的分片若不是按照順序接收,那麼服務器端會把接收的分片放入buffer中,等所有分片都到齊後再進行重組處理。

三、部分分片未到達服務器端

客戶端發送:分片1--分片2--分片3--分片4--分片5

服務器端接收:分片1--分片3--分片4--分片5

客戶端重發:分片2

服務器端接收:分片2

這種情況可能發生在網絡不穩定的時候,某分片可能因為此原因而丟失,那麼剩下分片到達服務器端後仍然是放入buffer中,在一定時間內丟失的分片還是未到達服務器端,那麼會回應給客戶端,並要求客戶端重新發送對應的分片,這時客戶端會重新發送對應的分片,當服務器端全部接收完畢後進行重組處理。

四、部分分片長時間後才到達服務器端

客戶端發送:分片1--分片2--分片3--分片4--分片5

服務器端接收:分片1--分片3--分片4--分片5

客戶端重發:分片2

服務器端接收:分片2(重發分片)

服務器端接收:分片2(原分片)--丟棄

跟方式三一樣,同樣是因為網絡不穩定的原因,某分片可能長時間後才能到達,但是未丟失,當服務器端在一定時間內未收到該分片時會通知客戶端重新發送對應分片,當重新發送的分片到達服務器端後,之前因網絡不穩定而未到的分片也到達服務器端,那麼服務器端會識別,並進行丟棄處理。

但是需要注意的一點是:服務器的buffer是有限的,若大量分片報文不能到達,那麼buffer中已接收到的分片可能會超出服務器的限度,造成服務器不正常運行。

歡迎大家多多關注我,在下方評論區說出自己的見解。


分享到:


相關文章: