假设:主机A把应用程序P1要发送的用户数据"abcd"填充到udp包,然后向主机B发送一条此udp包,接着主机B的应用程序P2收到了此udp包。请问,在主机B的程序P2里,收到的用户数据有可能不是"abcd"吗?如果有可能,是不是说明用户数据在传输的过程中式有可能损坏的,那么有什么方法来检测用户数据是否已经损坏。

解决方案 »

  1.   

    可能损坏,但是,假如用户B收到一般就是ABCD,前提是不超过MTU。
      

  2.   

    UDP通过校验和验证数据的完整性,《WinSock网络编程经络》中有说明,这有UDP例子:
    http://download.csdn.net/detail/geoff08zhang/4571358
      

  3.   

    我想楼主说的意思是:
    udp的不安全性:表现为不保证数据包送达目的,也不保证数据包到达的顺序
    只要收到了数据包,那么这个数据包就一定是正确完整的这个说法正确吗?
      

  4.   


    和MTU无关。UDP有一个可选的校验选项,默认是打开的。
    1、只要收到UDP包,那么在传输层,数据是保证完整、正确的。(当然,如果你提供的buf不够大,会出现WSAEMSGSIZE,那是应用层的问题了。)
    2、UDP在发多个包时,不保证顺序到达。
    3、接收缓冲区满时,再收到的包将被丢弃。
    4、由于协议的限制,UDP的最大包容量为64k。(mtu只是链路层是否需要拆分的一个因素)
      

  5.   

    --------------
    你在公网上发一个64KB的包试试看?你发个JB毛的,这然道和MTU也没有关系?64KB指的是在局域网内部,属于以太网,故而可以支持64KB以下的包大小。其他的你说的都是对的。
      

  6.   


    和MTU无关。UDP有一个可选的校验选项,默认是打开的。
    1、只要收到UDP包,那么在传输层,数据是保证完整、正确的。(当然,如果你提供的buf不够大,会出现WSAEMSGSIZE,那是应用层的问题了。)
    2、UDP在发多个包时,不保证顺序到达。
    3、接收缓冲区满时,再收到的包将被丢弃。
    4、由于协议的限制,UDP的最大包容量为64k。(mtu只是链路层是否需要拆分的一个因素)

    假如我一次发送大于mtu的包,接收端会出现什么情况呢?
      

  7.   

    UDP
    和MTU无关。UDP有一个可选的校验选项,默认是打开的。
    1、只要收到UDP包,那么在传输层,数据是保证完整、正确的。(当然,如果你提供的buf不够大,会出现WSAEMSGSIZE,那是应用层的问题了。)
    2、UDP在发多个包时,不保证顺序到达。
    3、接收缓冲区满时,再收到的包将被丢弃。
    4、由于协议的限制,UDP的最大包容量为64k。(mtu只是链路层是否需要拆分的一个因素)

    假如我一次发送大于mtu的包,接收端会出现什么情况呢?
    可以的,IP层会把它拆为一堆小包,接收端的UDP层再把小包组起来。不过如果丢了一个小包,你就什么也得不到。
      

  8.   

    在原IP设计上是打算支持IP分片的,但是对于UDP在广域网上分片,目前的实现是没有的。因为过于复杂,和带来不划算的开销,目前的OS都基本上没有实现对UDP的分片。所以,在公网条件,UDP分片一说,基本不成立。因为分片就意味着重组,目前绝大多数网络设备不支持UDP的组包。所以,在公网条件发送大于1500字节的数据,基本被直接丢掉了。至于UDP可靠,需要自己做。大家可以了解我设计 的UDX协议。测试网址http://www.goodudx.com/web/index.php/site/download