轉: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並不保證,網絡層接收包的順序是錯亂的。
下面這張就是網絡的傳輸圖
...