[原]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使用细节备忘的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (转)java中对集合对象list的几种
- 下一篇: sql查询结果集根据指定条件排序的方法