socket 關於同一條TCP鏈接數據包到達順序的問題


轉:http://blog.csdn.net/l1008610/article/details/52197602

 

以前作者也一直以為數據包先發的不一定先到,直到今天才意識這個問題的缺陷,數據包是不一定先發先到,但是對於TCP有一點特殊,若我們接受的數據包是在應用層,並且應用層用的是TCP的傳輸協議的話,這個順序是保證,這個順序的保證是在傳輸層保證的,舉個例子:

client發生數據A,B給server,使用的TCP傳輸,client發送毫無疑問是先發送A,然后發送B,但是有些搞網絡的同學可能會有這個疑問,A跟B在物理層走的鏈路不一樣,傳輸速度不一樣,B是會比A先到達Server,這個是沒有錯的,但是這個數據包被接受是在網絡層跟傳輸層,請記住網絡跟傳輸層的作用,網絡層是保證同一個包的完整,就是說若你的傳輸層發出的包過大,在網絡層(也就是IP層)會被分包,同時在Sever的網絡接受的時候會被組包,有一個完整的包才會交給傳輸層,若包不完整是會丟棄,同時他也不保證你的包的是否達到,數據包的保證是在傳輸層做的,就是說若傳輸層(TCP協議才會,UDP並不保證)沒有收到對方的確認包,會有超時重傳,每個數據包也是有序列號的,同時,傳輸層就是根據這個序列號來保證A,B包的順序,即使B比A先到達了,TCP也會是等A到達之后,先把A提交給應用層,再把B的數據提交給應用層,從而保證了,同一條TCP鏈接,先發的包先到

注:這個順序的保證是傳輸層做的,TCP這個協議保證的,UDP並不保證,網絡層接收包的順序是錯亂的。

下面這張就是網絡的傳輸圖

 

 

 

 

 

 

 

 

 

...


免責聲明!

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



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