1. linux 應用層用udp發送數據時有大小限制嗎
從理論上來說,UDP數據的總長度為 65535(IP最大長度)-20(IP頭)-8(UDP頭) = 65507個位元組,但大多數系統都達不到這個長度。這一般是受到兩個方面的因素限制:
1) 應用程序編程介面限制。一般socket的緩沖區大小是8K,但都提供API來設置緩沖區的大小(SetSockOpt)。一般發送UDP最好不要超過512位元組,這樣基本可以保證不丟包(因為大部分網路和主機的MTU都大於512).
2) TCP/IP內核的限制。可能存在一些實現特性使得IP長度不能達到65535。
由於IP能夠發送或接收特定長度的數據報並不意味著接收應用程序可以讀取該長度的數據。因此,UDP編程介面允許應用程序指定每次返回的最大位元組數。如果接收到的數據報長度大於應用程序所能處理的長度,那麼會發生什麼情況呢?典型的Berkeley版socket API對數據報進行截斷,並丟棄任何多餘的數據;SVR4下的socket API(包括Solaris 2.x) 並不截斷數據報。超出部分數據在後面的讀取中返回。它也不通知應用程序從單個UDP數據報中多次進行讀取操作;TLI API不丟棄數據。相反,它返回一個標志表明可以獲得更多的數據,而應用程序後面的讀操作將返回數據報的其餘部分。
UDP不會分片,分片是IP層做的事,而且分片重組也是IP層負責的。
如果用UDP發送數據,數據量最好不要太大,應該避免IP層和鏈路層分包,防止分片丟失,導致整個UDP數據包丟失。
2. 採用UDP方式接收和發送的包的最大長度是多少
傳輸層:對於UDP協議來說,整個包的最大長度為65535,其中包頭長度是65535-20=65515;
對於TCP協議來說,整個包的最大長度是由最大傳輸大小(MSS,Maxitum Segment Size)決定,MSS就是TCP數據包每次能夠傳
輸的最大數據分段。為了達到最佳的傳輸效能TCP協議在建立連接的時候通常要協商雙方的MSS值,這個值TCP協議在實現的時候往往用MTU值代替(需
要減去IP數據包包頭的大小20Bytes和TCP數據段的包頭20Bytes)所以往往MSS為1460。通訊雙方會根據雙方提供的MSS值得最小值
確定為這次連接的最大MSS值。
IP層:對於IP協議來說,IP包的大小由MTU決定(IP數據包長度就是MTU-28(包頭長度)。 MTU值越大,封包就越大,理論上可增加傳送速率,但
MTU值又不能設得太大,因為封包太大,傳送時出現錯誤的機會大增。一般默認的設置,PPPoE連接的最高MTU值是1492, 而乙太網
(Ethernet)的最高MTU值則是1500,而在Internet上,默認的MTU大小是576位元組
實際UDP的包長度不要超過MTU值,一般不建議超過1K。
參考:https://..com/question/2265686089445142988.html
3. 求教UDP協議發送數據包的大小問題
UDP 包的大小就應該是 1492 - IP頭(20) - UDP頭(8) = 1464(BYTES)
TCP 包的大小就應該是 1492 - IP頭(20) - TCP頭(20) = 1452(BYTES)
目前大多數的路由設備的MTU都為1500
我對上面的理解是:如果我們定義的TCP和UDP包小於1452,1464,那麼我們的包在IP層就不用分包了,這樣傳輸過程中就避免了在IP層組包發生的錯誤。如果使用UDP協議,如果IP層組包發生錯誤,那麼包就會被丟棄,UDP不保證可靠傳輸。但是TCP發生組包錯誤時,該包會被重傳,保證可靠傳輸。所以,我們在用Socket編程時,包的大小設定不一定非要小於1400,UDP協議要求包小於64K,TCP沒有限定。
總結:
我們設定包的大小對於UDP和TCP協議是不同的,關鍵是看系統性能和網路性能,網路是狀態很好的區域網,那麼UDP包分大點,提高系統的性能。不好,就分小於1464,這樣可以減低丟包率。對於TCP來說,這個就要靠經驗了,因為,TCP丟包可以自動重傳,分大了,系統性能提高了,分包和錯誤重組可能會耗費時間,使傳送時間延長,分小了,系統性能又降低了
4. 如何用udp包發大文件,高手看過來......
若用SendStream(),文件跨越2k是就會溢出。若要用udp協定傳輸文件,應用SendStream辦法照樣用SendBuffer辦法?向大人人就教,感謝。
5. UDP數據包允許的最大數據長度是多少
首先,我們知道,tcp/ip通常被認為是一個四層協議系統,包括鏈路層,網路層,運輸內層,應用層.
udp屬於運輸層,下面我們由下至上一容步一步來看:
乙太網(ethernet)數據幀的長度必須在46-1500位元組之間,這是由乙太網的物理特性決定的.
這個1500位元組被稱為鏈路層的mtu(最大傳輸單元).但這並不是指鏈路層的長度被限制在1500位元組,其實這這個mtu指的是鏈路層的數據區.
並不包括鏈路層的首部和尾部的18個位元組.
所以,事實上,這個1500位元組就是網路層ip數據報的長度限制.
因為ip數據報的首部為20位元組,所以ip數據報的數據區長度最大為1480位元組.
而這個1480位元組就是用來放tcp傳來的tcp報文段或udp傳來的udp數據報的.又因為udp數據報的首部8位元組,所以udp數據報的數據區最大長度為1472位元組.
這個1472位元組就是我們可以使用的位元組數。:)
6. C++ UDP傳輸大文件問題
如果堅持使用UDP的話,你可以嘗試這樣做:
發送文件方(以下稱S)每次發送你自定義大小的一幀數據,並在數據頭加上數據長度。
接收文件方(以下稱R)接收到一幀數據,讀取數據長度,然後累加,直到接收數據總量達到長度。
另外,R讀取一次數據以後應回應S,告知其可以繼續發送。而S則需等待可以發送的指令到來。
這樣能一定程度上因R和S緩沖區不同,數據速率不同導致的問題。
如果要更保險一些,可以加上驗證,比如在開始發送文件之前先獲取R的緩沖區大小,以及發送幾次驗證數據。
7. 區域網多台電腦發送大量UDP數據包給本地網路,應如何防範
你看該計算機是否正常,如果沒有中病毒,那麼可以不用管它。網路內部會自歷含動發一含爛瞎下UDP數據,但19540埠似乎有點問題。你可以配談空置你的放火牆不報警該規則,但是丟棄或攔擊該數據包就可以了。
8. 求教UDP協議發送數據包的大小問題
100位元組是綽綽有餘的,據我所了解的UDP,包括java中構造方法
byte[] buffer = new byte[8192];
DatagramPacket dp = new DatagramPacket(buffer, buffer.length);
對此構造方法而言,它並不在乎緩存能有多大而且會很高興讓你判銀創建一個數兆位元組大小的DatagramPacket。
然而,然後底層的原生網路軟體就少寬容了,最原始UDP實現不支持超過 8,192 byte/datagram。IPv4的理論極限datagram是65,507位元組,而如果一個DatagramPacket對象帶有65,507位元組大小的緩存的話就可以無損接收任何可能的IPv4 datagram。許多基於UDP的協議如DNS和TFTP會使用每datagram 512位元組或更少。NFS的普通使用最大數據大小是余稿8,192位元組。幾乎所有的你可能碰到的UDP datagrams是8K或更少。實際上,許多操作系統並不支持超過8K數據的UDP datagrams,或截斷、或分拆,或丟棄。如果一個datagram因過大而遭到網路截斷或丟棄,你的java程序並不會被通知到該問題的存在(UDP畢竟是不可靠協議) 。因此,豎沖孝你不應該創建超過8,192位元組的DatagramPacket對象。
9. 一般每秒鍾發送多少個udp數據包,伺服器就會卡
用UDP給上位機軟體頌仔發數據包,一個數據包最大1000位元組,一幀數據可能1-20KB。不停的連續滲襪發送。不加延時的時候,一次發送17個1000位元組的數據包,後面的幾個會丟掉,可能是我緩沖區的設置問題,因為是非阻塞的。然後我在網路助手野喊汪裡面看到發上來的數據,固定的能收到9個包,合計9000位元組。然後這9個包用了60ms的時間,這個時間也太長了吧。
10. udp一次能夠傳遞的最大數據是多少
UDP中的總長度欄位為2位元組 所能表示的最大數為65535 UDP協議頭本身占據了8位元組 所以所能發送的最大數據長度是65535-8=65527