UDP

1.udp基本说明


  udp报文是基于数据包的,即一次sendto()对应一次recvfrom()。

  如果调用一次sendto()发送4096个字节,则发送方会进行ip分片发送给接收方,接收方ip重组后交给应用层,应用层调用recvfrom()时传入的buffer长度至少为4096,如果少于4096则会导致数据丢失。不存在多次recvfrom()这个数据块。

  如果调用两次sendto(),第一次发送100个字节,第二次发送200个字节,则接收方也要调用两次recvfrom()来接收这两个数据块。不存在一次recvfrom()收取多个数据块。

2.EDNS0里面的udp-size


  由于udp的特性,所以dns使用edns0来扩展udp报文最大长度。

  dns使用udp时默认的最大长度为512字节,超过之后会设置truncate标记。如果设置了edns0扩展,则可以让udp支持超过512字节的长度。

  问题:

    [1]为什么dns使用udp时要限制长度为512字节,而理论上一个udp包的最大长度可以达到(0xffff - 8)个字节(udp的length字段为2个字节,udp头长度为8)。

      这是因为Internet上的标准MTU值为576字节,即UDP的数据长度在548字节(576-8-20)之内通过任何网络设备时都不会发生分包(ip分片),如果发生分包则其中一片丢失后会丢失整个udp报文(注意ip分片不存在重传)。

      所以dns的长度限制为512字节时只是为了保证不会ip分片。但是使用edns0使得udp长度超过512时,可能会发生分片,因此可能需要应用层处理重发机制(即一段时间没有收到响应时,再发送一次请求)。即dns如果使用了edns0里面的udp-size则要考虑到ip分片带来的副作用。

 

posted on 2019-06-21 10:55  能量星星  阅读(621)  评论(0编辑  收藏  举报

导航