日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[原]TCP/UDP使用细节备忘

發布時間:2023/12/9 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [原]TCP/UDP使用细节备忘 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
[原]TCP/UDP使用細節備忘

?? ? ?首先,TCP和UDP的基本區別是TCP提供可靠的面向連接的流傳輸;UDP提供不可靠的基于數據包的傳輸;


?? ? ?所謂可靠就是說發送端調用send后,數據就一定會發送給接收端。雖然這當中可能會消耗很長的時間,或者實在無法發送的話發送端或者接收端也能得到適當的通知。而不可靠傳輸是指,發送端調用send后,接收端能不能收到數據是沒有保證的,運氣(網絡狀況)好的話,接收端可以立即收到數據。運氣不好的話,數據可能會在傳輸過程中被丟棄。如果數據被丟棄的話,發送端和接收端都不會得到任何通知。另外,數據還有可能經歷漫長的時間后到達接收端。


?? ? ?那么基于流的傳輸是指發送端send一塊數據后,就像把一杯水倒入小河,當水流到達接收端后,接收端能夠汲取到從發送端傳過來的水,那卻很難再把那杯水原原本本地裝進一個杯子里了(當然實際的開發中,可以在這塊數據前后設置標志讓接收端從流中提取出這塊數據來)。正因為TCP的傳輸是基于流的,所以發送端調用N次send總共發送S字節的數據,在接收端對應的是M次recv總共接收的數據還是S字節。這里N往往不等于M,如果實際使用中希望send的數據塊和recv的數據塊的次數對等的話,就要自己給數據塊加上標志以幫助接收端區分數據塊。而且在接收端區分數據塊是也很可能發生一次recv從流中接收的數據不夠一塊的情況,這時,接收端應該等待TCP流再次到達,并從中recv塊剩余的部分。


?? ? ?基于數據包的傳輸和流不一樣,發送端send一塊數據后,如果數據能夠到達接收端,那么接收端recv到的就是一塊完整的數據。如果數據包丟失,那么接收端就收不到任何東西。所以對于UDP的數據包傳輸來說,情況很簡單,接收端要么收到完整的數據包,要么啥都收不到。數據包和數據流另外一個不同點是,數據流中的數據是有序的,接收端收到的數據和發送端發送的數據的順序是一致的。而數據包的數據不能保證有序,發送端發送的數據到達接收端的順序是錯亂的。


?? ? ?相較之下,UDP的概念比TCP要簡潔一些,但是實際使用起來,要注意的地方也要更多一些。所以在使用UDP時要注意以下幾個方面:


1)UDP不提供擁塞控制,如果發送端無節制地向接收端發送數據包,很可能會導致接收端來不及處理數據包,而造成大量的丟包現象。


2)UDP的數據包是無序的,接收端如果對數據的順序有要求的話,要自行處理數據包的順序


3)UDP數據包的大小是有限制的,理論上這個限制是由于一個IP包的最大長度除去UDP包頭的長度,而實際上各個不同的TCP/IP協議的實現給出的限制不同,基本都小于32768。而實際的網絡環境中,往往要更小。


?


?? ? ?除了上面提到過的UDP數據包的大小限制,還有一個MTU的概念,MTU基本上是由于鏈路層協議對數據包的長度的限制,不同的鏈路層的MTU是不一樣的,如果一個IP數據包的長度超過了鏈路的MTU,那么這個包會按MTU的大小在鏈路層分片,當數據通過鏈路后,再重新組包后發送到IP的下一路。在一個IP包的傳輸過程中可能會發生多次分片和組包。如果一個IP包中設置了禁止分片的DF標志,那么,當發現IP包的長度超過MTU時,數據包會被丟棄。發送端會收到一個ICMP的通知,告訴數據包因為過大而被丟棄。看起來,MTU和UDP數據包大小限制這兩個概念比較容易搞混淆。其實MTU是一個影響IP層的概念,而UDP數據包大小限制是傳輸層的問題。假設發送端和接收端之間的MTU是1500,這并不代表UDP包的最大限制就是1500。此時UDP包的最大限制還可能是32768!這是因為承載UDP包的IP包在網絡上自動被分片并組包了。這個情況下UDP包的最大限制是由TCP/IP協議的實現決定的,如果這個實現的IP包都設置DF標志,那么IP包在鏈路上不會被分片,那么UDP的最大限制就等于MTU,是1500。如果這個實現的IP包不設置DF標志,那么IP包在鏈路上就能順序通過,那就由這個實現中對UDP的大小限制這個部分來決定了。


?? ? ?最后,TCP會自己處理每個TCP數據段的大小(MSS),UDP的最大限制就要使用者自己來把握(可以使用比較保險的較小的值,也可以通過在發送端和接收端之間發送檢測包來決定)。還有,當數據無法發送到接收端時(往往是接收端的進程并沒有啟動),TCP和UDP都能收到適當的通過。在socket當中都是10053這個錯誤號,在TCP的實現中,是通過設置了RST標志的包通知,在UDP的實現中,是通過一個ICMP包來通知的。



作者:nobugtodebug 發表于2010-12-17 11:12:00 原文鏈接


閱讀:119 評論:0 查看評論



來自為知筆記(Wiz)

轉載于:https://www.cnblogs.com/nobugtodebug/p/4500264.html

總結

以上是生活随笔為你收集整理的[原]TCP/UDP使用细节备忘的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。