TCP與UDP的不同接包處理方式


TCP與UDP的不同接包處理方式

1.UDP發包的問題
問:udp 發送兩次數據,第一次 100字節 ,第二次200字節, 接包方一次recvfrom( 1000 ), 收到是 100,還是200,還是300?
答:UDP是數據報文協議,是以數據包方式,所以每次可以接收100,200,在理想情況下,第一次是無論recvfrom多少都是接收到100。當然,可能由於網絡原因,第二個包先到的話,有可能是200了。對可能會由於網絡原因亂序,所以可能先收到200,所以自定義的udp協議包頭里都要加上一個序列號,標識發送與收包對應

2.TCP的發包問題
問:同樣如果換成tcp, 第一次發送 100字節 ,第二次發送200字節,recv( 1000 )會接收到多少?
答:tcp是流協議,所以recv( 1000 ),會收到300 tcp自己處理好了重傳,保證數據包的完整性

3.有分片的情況下如下處理
問:如果MTU是1500,使用UDP發送 2000,那么recvfrom(2000)是收到1500,還是2000?
答: 還是接收2000,數據分片由ip層處理了,放到udp還是一個完整的包。接收到的包是由路由路徑上最少的MTU來分片,注意轉到UDP已經在是組裝好的(組裝出錯的包會經crc校驗出錯而丟棄),是一個完整的數據包

4.分片后的處理
問:如果500那個片丟了怎么辦?udp又沒有重傳
答:udp里有個crc檢驗,如果包不完整就會丟棄,也不會通知是否接收成功,所以UDP是不可靠的傳輸協議,而且TCP不存在這個問題,有自己的重傳機制。在內網來說,UDP基本不會有丟包,可靠性還是有保障。當然如果是要求有時序性和高可靠性,還是走TCP,不然就要自己提供重傳和亂序處理( UDP內網發包處理量可以達 7w~10w/s )

5.不同連接到同一個端口的包處理
問:TCP
A -> C 發100
B -> C 發200
AB同時同一端口
C recv(1000) ,會收到多少?
答:A與C是一個tcp連接,B與C又是另一個tcp連接, 所以不同socket,所以分開處理。每個socket有自己的接收緩沖和發送緩沖

6.什么是TCP粘包

由於TCP是流協議,對於一個socket的包,如發送 10AAAAABBBBB兩次,由於網絡原因第一次又分成兩次發送, 10AAAAAB和BBBB,如果接包的時候先讀取10(包長度)再讀入后續數據,當接收得快,發送的慢時,就會出現先接收了 10AAAAAB,會解釋錯誤 ,再接到到BBBB10AAAAABBBBB,也解釋錯誤的情況。這就是TCP的粘包。
   解決的辦法TLV方式,先接收包頭,在包頭里指定包體長度來接收。設置包頭包尾的檢查位(如群空間0x2開頭,0x3結束來檢查一個包是否完整)。對於TCP來說:1)不存在丟包,錯包,所以不會出現數據出錯 2)如果包頭檢測錯誤,即為非法或者請求,直接重置即可

7.TCE怎么處理TCP包
TCE的Tcp包處理:
1.先按可用buf接收tcp包
2.按照協議頭檢查,提出多個請求包
3.如果檢查失敗,當前接收緩存就會重置( 位置從0開始 ) -> 
1)由於tcp保證了包的完整性,不會出現錯包
2)如果是非法請求(對應的一個socket接收的數據包),會丟棄


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM