精华内容
参与话题
问答
  • 因为UDP数据传输的无连接特性,最简单的UDP数据传输就是一次数据交互一个UDP包搞定,这样就不用管分包问题(因为不像TCP,UDP传输时如果分包则是不能保证顺序的,这会带来很多问题)。 所以你一次交互的数据如果太多...
        

    前言

    因为UDP数据传输的无连接特性,最简单的UDP数据传输就是一次数据交互一个UDP包搞定,这样就不用管分包问题(因为不像TCP,UDP传输时如果分包则是不能保证顺序的,这会带来很多问题)。

    所以你一次交互的数据如果太多的话,用UDP实现就很可能并不优雅。

    思考

    在进行UDP编程的时候,我们最容易想到的问题就是,一次发送多少bytes好?
    当然,这个没有唯一答案,相对于不同的系统,不同的要求,其得到的答案是不一样的,我这里仅对像ICQ一类的发送聊天消息的情况作分析,对于其他情况,你或许也能得到一点帮助。

    网络原理

    首先,我们知道,TCP/IP通常被认为是一个四层协议系统:包括链路层、网络层、运输层、应用层 。

    UDP属于运输层,下面我们由下至上一步一步来看。

    结论1:局域网环境下,建议将UDP数据控制在1472字节以下

    以太网(Ethernet)数据帧的长度必须在46-1500字节之间,这是由以太网的物理特性决定的,这个1500字节被称为链路层的MTU(最大传输单元)。 但这并不是指链路层的长度被限制在1500字节,其实这这个MTU指的是链路层的数据区,并不包括链路层的首部和尾部的18个字节。

    所以,事实上这个1500字节就是网络层IP数据报的长度限制。因为IP数据报的首部为20字节,所以IP数据报的数据区长度最大为1480字节。而这个1480字节就是用来放TCP传来的TCP报文段或UDP传来的UDP数据报的。

    又因为UDP数据报的首部8字节,所以UDP数据报的数据区最大长度为1472字节。这个1472字节就是我们可以使用的字节数

    当我们发送的UDP数据大于1472的时候会怎样呢?

    这也就是说IP数据报大于1500字节,大于MTU,这个时候发送方IP层就需要分片(fragmentation)。把数据报分成若干片,使每一片都小于MTU,而接收方IP层则需要进行数据报的重组。这样就会多做许多事情,而更严重的是,由于UDP的特性,当某一片数据传送中丢失时,接收方无法重组数据报,将导致丢弃整个UDP数据报。

    因此,在普通的局域网环境下,我建议将UDP的数据控制在1472字节以下为好。

    结论2:Internet编程时,建议将UDP数据控制在548字节以下

    进行Internet编程时则不同,因为Internet上的路由器可能会将MTU设为不同的值。如果我们假定MTU为1500来发送数据,而途经的某个网络的MTU值小于1500字节,那么系统将会使用一系列的机制来调整MTU值,使数据报能够顺利到达目的地,这样就会做许多不必要的操作。

    鉴于Internet上的标准MTU值为576字节,所以我建议在进行Internet的UDP编程时, 最好将UDP的数据长度控件在548字节(576-8-20)以内。

    这句话貌似有问题,unix网络编程第一卷里说:ipv4协议规定ip层的最小重组缓冲区大小为576!所以,建议udp包不要超过这个大小,而不是因为internet的标准MTU是576!
    展开全文
  • TCP、UDP数据包大小限制

    万次阅读 多人点赞 2016-05-29 10:27:34
    1、概述 首先要看TCP/IP协议,涉及到四层:链路层,网络层,传输层,应用层。 ...它们的关系是 数据帧{IP包{TCP或UDP包{Data}}}  不同的协议层对数据包有不同的称谓,在传输层叫做段(se

    1、概述

    首先要看TCP/IP协议,涉及到四层:链路层,网络层,传输层,应用层。   
    其中以太网(Ethernet)的数据帧在链路层   
    IP包在网络层   
    TCP或UDP包在传输层   
    TCP或UDP中的数据(Data)在应用层   
    它们的关系是 数据帧{IP包{TCP或UDP包{Data}}}   

        不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报(datagram),在链路层叫做帧(frame)。数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,最后将应用层数据交给应用程序处理。


    在应用程序中我们用到的Data的长度最大是多少,直接取决于底层的限制。   
    我们从下到上分析一下:   
    1.在链路层,由以太网的物理特性决定了数据帧的长度为(46+18)-(1500+18),其中的18是数据帧的头和尾,也就是说数据帧的内容最大为1500(不包括帧头和帧尾),即MTU(Maximum Transmission Unit)为1500;  
    2.在网络层,因为IP包的首部要占用20字节,所以这的MTU为1500-20=1480; 
    3.在传输层,对于UDP包的首部要占用8字节,所以这的MTU为1480-8=1472;   
    所以,在应用层,你的Data最大长度为1472。当我们的UDP包中的数据多于MTU(1472)时,发送方的IP层需要分片fragmentation进行传输,而在接收方IP层则需要进行数据报重组,由于UDP是不可靠的传输协议,如果分片丢失导致重组失败,将导致UDP数据包被丢弃。   
    从上面的分析来看,在普通的局域网环境下,UDP的数据最大为1472字节最好(避免分片重组)。   
    但在网络编程中,Internet中的路由器可能有设置成不同的值(小于默认值),Internet上的标准MTU值为576,所以Internet的UDP编程时数据长度最好在576-20-8=548字节以内。
     

    2、TCP、UDP数据包最大值的确定     

            UDP和TCP协议利用端口号实现多项应用同时发送和接收数据。数据通过源端口发送出去,通过目标端口接收。有的网络应用只能使用预留或注册的静态端口;而另外一些网络应用则可以使用未被注册的动态端口。因为UDP和TCP报头使用两个字节存放端口号,所以端口号的有效范围是从0到65535。动态端口的范围是从1024到65535。  

            MTU最大传输单元,这个最大传输单元实际上和链路层协议有着密切的关系,EthernetII帧的结构DMAC+SMAC+Type+Data+CRC由于以太网传输电气方面的限制,每个以太网帧都有最小的大小64Bytes最大不能超过1518Bytes,对于小于或者大于这个限制的以太网帧我们都可以视之为错误的数据帧,一般的以太网转发设备会丢弃这些数据帧。


            由于以太网EthernetII最大的数据帧是1518Bytes这样,刨去以太网帧的帧头(DMAC目的MAC地址48bits=6Bytes+SMAC源MAC地址48bits=6Bytes+Type域2Bytes)14Bytes和帧尾CRC校验部分4Bytes那么剩下承载上层协议的地方也就是Data域最大就只能有1500Bytes这个值我们就把它称之为MTU。


    UDP 包的大小就应该是 1500 - IP头(20) - UDP头(8) = 1472(Bytes)
    TCP 包的大小就应该是 1500 - IP头(20) - TCP头(20) = 1460 (Bytes)


    注*PPPoE所谓PPPoE就是在以太网上面跑“PPP”。随着宽带接入(这种宽带接入一般为Cable Modem或者xDSL或者以太网的接入),因为以太网缺乏认证计费机制而传统运营商是通过PPP协议来对拨号等接入服务进行认证计费的,所以引入PPPoE。PPPoE导致MTU变小了以太网的MTU是1500,再减去PPP的包头包尾的开销(8Bytes),就变成1492。不过目前大多数的路由设备的MTU都为1500。


            如果我们定义的TCP和UDP包没有超过范围,那么我们的包在IP层就不用分包了,这样传输过程中就避免了在IP层组包发生的错误;如果超过范围,既IP数据报大于1500字节,发送方IP层就需要将数据包分成若干片,而接收方IP层就需要进行数据报的重组。更严重的是,如果使用UDP协议,当IP层组包发生错误,那么包就会被丢弃。接收方无法重组数据报,将导致丢弃整个IP数据报。UDP不保证可靠传输;但是TCP发生组包错误时,该包会被重传,保证可靠传输。

            UDP数据报的长度是指包括报头和数据部分在内的总字节数,其中报头长度固定,数据部分可变。数据报的最大长度根据操作环境的不同而各异。从理论上说,包含报头在内的数据报的最大长度为65535字节(64K)。

           我们在用Socket编程时,UDP协议要求包小于64K。TCP没有限定,TCP包头中就没有“包长度”字段,而完全依靠IP层去处理分帧。这就是为什么TCP常常被称作一种“流协议”的原因,开发者在使用TCP服务的时候,不必去关心数据包的大小,只需讲SOCKET看作一条数据流的入口,往里面放数据就是了,TCP协议本身会进行拥塞/流量控制。 

           不过鉴于Internet(非局域网)上的标准MTU值为576字节,所以建议在进行Internet的UDP编程时,最好将UDP的数据长度控制在548字节 (576-8-20)以内。


    3、TCP、UDP数据包最小值的确定

         在用UDP局域网通信时,经常发生“Hello World”来进行测试,但是“Hello World”并不满足最小有效数据(64-46)的要求,为什么小于18个字节,对方仍然可用收到呢?因为在链路层的MAC子层中会进行数据补齐,不足18个字节的用0补齐。但当服务器在公网,客户端在内网,发生小于18个字节的数据,就会出现接收端收不到数据的情况。

           以太网EthernetII规定,以太网帧数据域部分最小为46字节,也就是以太网帧最小是6+6+2+46+4=64。除去4个字节的FCS,因此,抓包时就是60字节。当数据字段的长度小于46字节时,MAC子层就会在数据字段的后面填充以满足数据帧长不小于64字节。由于填充数据是由MAC子层负责,也就是设备驱动程序。不同的抓包程序和设备驱动程序所处的优先层次可能不同,抓包程序的优先级可能比设备驱动程序更高,也就是说,我们的抓包程序可能在设备驱动程序还没有填充不到64字节的帧的时候,抓包程序已经捕获了数据。因此不同的抓包工具抓到的数据帧的大小可能不同。下列是本人分别用wireshark和sniffer抓包的结果,对于TCP 的ACK确认帧的大小一个是54字节,一个是60字节,wireshark抓取时没有填充数据段,sniffer抓取时有填充数据段。

           

    4、实际应用

            用UDP协议发送时,用sendto函数最大能发送数据的长度为:65535- IP头(20) - UDP头(8)=65507字节。用sendto函数发送数据时,如果发送数据长度大于该值,则函数会返回错误。  

            用TCP协议发送时,由于TCP是数据流协议,因此不存在包大小的限制(暂不考虑缓冲区的大小),这是指在用send函数时,数据长度参数不受限制。而实际上,所指定的这段数据并不一定会一次性发送出去,如果这段数据比较长,会被分段发送,如果比较短,可能会等待和下一次数据一起发送。


    参考链接:http://blog.csdn.net/yaopeng_2005/article/details/6706739

    参考链接:http://blog.csdn.net/naturebe/article/details/6712153

    展开全文
  • udp数据包大小问题

    千次阅读 2018-07-15 16:31:50
    参考UDP数据包大小问题 几个关键点: 1. 以太网(Ethernet 在数据链路层)数据帧的长度必须在46-1500字节之间,这个1500字节被称为链路层的MTU(最大传输单元)(已经减去首部和尾部的18字节)这个1500字节就是网络层IP...

    参考UDP数据包大小问题
    几个关键点:
    1. 以太网(Ethernet 在数据链路层)数据帧的长度必须在46-1500字节之间,这个1500字节被称为链路层的MTU(最大传输单元)(已经减去首部和尾部的18字节)这个1500字节就是网络层IP数据报的长度限制.因为IP数据报的首部为20字节,所以IP数据报的数据区长度最大为1480字节.而这个1480字节就是用来放TCP传来的TCP报文段或UDP传来的UDP数据报的.又因为UDP数据报的首部8字节,所以UDP数据报的数据区最大长度为1472字节.当我们发送的UDP数据大于1472的时候会怎样呢?这也就是说IP数据报大于1500字节,大于 MTU.这个时候发送方IP层就需要分片(fragmentation).把数据报分成若干片,使每一片都小于MTU.而接收方IP层则需要进行数据报的重组.这样就会多做许多事情,而更严重的是,由于UDP的特性,当某一片数据传送中丢失时,接收方便无法重组数据报.将导致丢弃整个UDP数据报。因此,在普通的局域网环境下建议将UDP的数据控制在1472字节以下为好.
    2. 进行Internet编程时则不同,,因为Internet上的路由器可能会将MTU设为不同的值. 鉴于 Internet上的标准MTU值为576字节,所以在进行Internet的UDP编程时.最好将UDP的数据长度控件在548字节 (576-8-20)以内.

    展开全文
  • linux udp 数据包大小问题

    千次阅读 2012-04-17 15:36:17
    首先要看TCP/IP协议,...TCP或UDP包在传输层 TCP或UDP中的数据(Data)在应用层 它们的关系是 数据帧 = | 帧头 | IP包头 | TCP或UDP包头 | 用户发送数据 |  2)各层单包的最佳长度 在应用程序中我们用到的

    首先要看TCP/IP协议,涉及到四层:链路层,网络层,传输层,应用层。

    1)各层数据包格式

    以太网(Ethernet)的数据帧在链路层
    IP包在网络层
    TCP或UDP包在传输层
    TCP或UDP中的数据(Data)在应用层

    它们的关系是 数据帧 = | 帧头 |  IP包头 | TCP或UDP包头 | 用户发送数据 | 



    2)各层单包的最佳长度

    在应用程序中我们用到的Data的长度最大是多少,直接取决于底层的限制。
    在链路层,由以太网的物理特性决定了数据帧的长度为(46+18)-(1500+18),其中的18是数据帧的头和尾,也就是说数据帧的内容最大为1500,即MTU(Maximum Transmission Unit)为1500;
    在网络层,因为IP包的首部要占用20字节,所以这的MTU为1500-20=1480;
    在传输层,对于UDP包的首部要占用8字节,所以这的MTU为1480-8=1472;
    所以,在应用层,你的Data最大长度为1472。
    当我们的UDP包中的数据多于MTU(1472)时,发送方的IP层需要分片fragmentation进行传输,而在接收方IP层则需要进行数据报重组,由于UDP是不可靠的传输协议,如果分片丢失导致重组失败,将导致UDP数据包被丢弃。

    从上面的分析来看,在普通的局域网环境下,UDP的数据最大为1472字节最好(避免分片重组)。

    一些典型的MTU值:
    网络:                                               MTU字节
    超通道                                                65535
    16Mb/s信息令牌环(IBM)             17914
    4Mb/s令牌环(IEEE802.5)            4464
    FDDI                                                     4352
    以太网                                                 1500
    IEEE802.3/802.2                              1492
    X.25                                                       576
    点对点(低时延)                             296
    路径MTU:如果两台主机之间的通信要通过多个网络,那么每个网络的链路层就可能有不同的MTU。重要的不是两台主机所在网络的MTU的值,重要的是两台通信主机路径中的最小MTU。它被称作路径MTU。
    X.25的MTU只有576,而大数公众网(我国的也是)正是采用的这个结构!所以,如果你的UDP程序需要通过公众网通信,那么这一点就应该引起你的注意了!

    Internet上的标准MTU值为576,所以Internet的UDP编程时数据长度最好在576-20-8=548字节以内。

    3)UDP包的最大长度

    UDP数据包的最大长度为64K,因为UDP包头部用2个字节描述报文长度,再减去UDP包头的8个字节,最大长度为65527,这个值也就是调用getsockopt是指定SO_MAX_MSG_SIZE的返回值,如果在SOCK_DGRAM模式下,使用sendto发送大于这个值就会报错

    4)查看MTU

    MTU对我们的UDP编程很重要,那如何查看路由的MTU值呢?
    对于windows OS: ping -f -l <data_length> <gateway_IP>
    如:ping -f -l 1472 192.168.0.1
    如果提示:Packets needs to be fragmented but DF set.
    则表明MTU小于1500,不断改小data_length值,可以最终测算出gateway的MTU值;
    对于linux OS: ping -c <number> -M do -s <data_length> <gateway_IP>
    如: ping -c 1 -M do -s 1472 192.168.0.1
    如果提示 Frag needed and DF set……
    则表明MTU小于1500,可以再测以推算gateway的MTU。
    当然要修改MTU的值,那就是网管的事了(一般人没这权限呀),我们只能申请加等待了 ^-^ .

    展开全文
  • TCP、UDP大小限制

    2020-04-03 01:42:40
    限制于MTU(Maximum Transmission Unit)的大小,MTU一般为1500 UDP 大小: 1500 - IP头(20) - UDP头(8) = 1472(Bytes) TCP 大小:1500 - IP头(20) - TCP头(20) = 1460 (Bytes)
  • UDP数据包大小问题

    万次阅读 2009-12-22 14:14:00
    当然,这个没有唯一答案,相对于不同的系统,不同的要求,其得到的答案是不一样的,这里仅对像ICQ一类的发送聊天消息的情况作分析,对于其他情况,或许也能得到一点帮助: 首先,我们知道,TCP/IP通常被认为是一个四层协议...
  • udp发包大小选择

    千次阅读 2015-04-01 19:03:55
    当然,这个没有唯一答案,相对于不同的系统,不同的要求,其得到的答案是不一样的,我这里仅对 像ICQ一类的发送聊天消息的情况作分析,对于其他情况,你或许也能得到一点帮助: 首先,我们知道,TCP/IP通常被认为是一个四...
  •  但这并不是指链路层的长度被限制在1500字节,其实这这个MTU指的是链路层的数据区.   并不包括链路层的首部和尾部的18个字节. 因为IP数据报的首部为20字节,所以IP数据报的数据区长度最大为1480字节.  又因为.....
  • UDP数据包大小设定

    2019-11-30 13:48:23
    当然,这个没有唯一答案,相对于不同的系统,不同的要求,其得到的答案是不一样的,我这里仅对像ICQ一类的发送聊天消息的情况作分析,对于其他情况,你或许也能得到一点帮助: 首先,我们知道,TCP/IP通常被认为是一个四层...
  • 1500字节: 以太网.1492字节: PPPoE.1472字节: ping1468字节: DHCP1430字节: VPN and PPTP 576字节: 拨号ISP RFC 1883: 最小576,新的可能会是1280 UDP一次发送数据包的大小,TCP一次发送数据包的大小。 MTU最大传输...
  • UDP传输数据包的大小

    千次阅读 2018-08-02 15:48:46
    之前面试被问了,后来查了一下,但是太详细,有时也不好。 1500字节被称为链路层的MTU(最大传输单元).1500-20-8=1472 在普通的局域网环境下...UDP 大小就应该是 1492 - IP头(20) - UDP头(8) = 1464(BYTES) TC...
  • UDP传输包大小问题

    千次阅读 2014-09-05 09:33:17
    当然,这个没有唯一答案,相对于不同的系统,不同的要求,其得到的答案是不一样的,我这里仅对 像ICQ一类的发送聊天消息的情况作分析,对于其他情况,你或许也能得到一点帮助: 首先,我们知道,TCP/IP通常被认为是一个四...
  • TCP与UDP的不同接处理方式 1.UDP发包的问题 问:udp 发送两次数据,第一次 100字节 ,第二次200字节, 接方一次recvfrom( 1000 ), 收到是 100,还是200,...当然,可能由于网络原因,第二个先到的话,可能是...
  • UDP中一个大小最大能多大

    千次阅读 2013-09-18 11:56:48
    当然,这个没有唯一答案,相对于不同的系统,不同的要求,其得到的答案是不一样的,我这里仅对  像ICQ一类的发送聊天消息的情况作分析,对于其他情况,你或许也能得到一点帮助:  首先,我们知道,TCP/IP通常被认为是一...
  • TCP、UDP数据包大小的确定  UDP和TCP协议利用端口号实现多项应用同时发送和接收数据。数据通过源端口发送出去,通过目标端口接收。的网络应用只能使用预留或注册的静态端口;而另外一些网络应用则可以使用未被...
  • UDP包大小与MTU

    千次阅读 2011-11-25 13:37:52
    当然,这个没有唯一答案,相对于不同的系统,不同的要求,其得到的答案是不一样的,我这里仅对 像ICQ一类的发送聊天消息的情况作分析,对于其他情况,你或许也能得到一点帮助: 首先,我们知道,TCP/IP通常被认为是一个四...
  • UDP协议sendto消息长度限制

    千次阅读 2018-12-19 22:41:23
    先把测试得到的结果列出来: MacOS 发送buffer长度限制: 1024*9...CentroOS 发送buffer长度限制: 1024*64 - 28=65507 Bytes (推测应该介于55467-65507之间,取决于IP头部长度,如果IP头部长度&gt;最小值20...
  • UDP报文长度限制,在IPv4下是65507字节(65535-8字节UDP header-20字节 IPheader) 长度限制内的都可以发 fragmentation发生在IP层,一个长UDP报文,会被分为若干个fragment,封成IP发送接收端收到所有的...
  • 其中以太网(Ethernet)的数据帧在链路层 IP包在网络层 TCP或UDP包在传输层 TCP或UDP中的数据(Data)在应用层 它们的关系是 数据帧{IP包{TCP或UDP包{Data}}} 不同的协议层对数据包不同的称谓,在传输层叫做...

空空如也

1 2 3 4 5 ... 20
收藏数 56,251
精华内容 22,500
关键字:

udp大小限制