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

前序:

最近一直疑惑,tcp能不能保證應用層發包的順序性?例如client A給server B按時間先後分別發送 c和d包(即是先發c包,再發d包),但是因爲網絡的複雜性,並不能保證c包一定比d包先到(因爲走的鏈路有可能不同),那tcp是怎樣保證的呢?如果不能保證,平時寫的程序就會出現很多問題(例如假如c包是要查詢一個用戶的信息,d包是要刪除用戶的信息,那如果d包先到後就交給應用層的話,刪除了這個用戶的信息,c包到的時候就讀取不到這樣的信息了)。

暴擊

查了一下,是我想多了,人家TCP做得確實是牛逼,T小弟佩服。。。

復活

若我們接受的數據包是在應用層,並且應用層用的是TCP的傳輸協議的話,這個順序是保證,這個順序的保證是在傳輸層保證的,舉個例子:

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

注:這個順序的保證是傳輸層做的,TCP這個協議保證的,UDP並不保證,網絡層接收包的順序是錯亂的。
在這裏插入圖片描述
原文鏈接:參考的博客鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章