一个数据包,大小为10K,使用UDP协议进行传输,网络MTU为1K,则该数据包要进行传输必须要分成一组小于MTU的数据包进行传输,接收端接收数据包后,应该如何组装该数据包。
特别是用于视频传输,超过MTU的数据包相当多,客户端应该怎么接收啊?谁能给个思路,谢谢了

解决方案 »

  1.   

    首先UDP协议是无连接的不可靠的.
    也就是讲UDP socket来发送数据不能保证一定到达接收端,也不能保证按发送的先后顺序到达(也许后发的还先到达).MTU,应用程序员不用关心,因为在IP层,数据包过大,发送端的IP层会自动分片.然后到了接收端,在送给上层协议时自动还原成分片前的包.结论:你要用UDP来发送视频包,应当允许接在路由的过程中丢失一些包.
      

  2.   

    要区分包的先后顺序,自己在UDP数据部分加一些东东(也就是应用层,自己设计一个头部,算是应用层的私有协议吧. :-)).
      

  3.   

    首先UDP协议是无连接的不可靠的.
    也就是讲UDP socket来发送数据不能保证一定到达接收端,也不能保证按发送的先后顺序到达(也许后发的还先到达)
    ---------------------------------------------------------------------------------------------------------
    对,TCP协议才是有序的包
      

  4.   

    不知道QOS协商能不能有所帮助.
      

  5.   

    <64k的IP层能帮你处理掉,一般非高清的压缩后都能满足这要求。视频传输用rtp的话每一个包都有序列号,收到缓存几个重组即可
      

  6.   

    我也觉得在应用层不用考虑MTU,这些是在IP层会自动分片,到了目的地后,IP层给上层的是已经完整的包
      

  7.   

    如果要实现不丢包,就需要自己自定义协议了,应用层来控制丢包和重传机制。可以看一下http://udt.sourceforge.net/
      

  8.   

    MTU是在IP协议层分片的,UDP工作在IP协议之上,可以不用关心这个。要发送和接收视频,可以用RTP和RTCP协议,封装视频数据流,可以实现可靠传输和数据按序到达。
      

  9.   


    谢谢你,难道RTP协议解决了时序问题吗?如果我捕捉到一帧大小为70K的数据,RTP协议也不能帮我传输吧?好像不能传输这么大的数据
      

  10.   


    数据包到达的时序问题我可以解决,丢包也可以解决,但是我是把一帧数据作为一个UDP数据包发过去的,另外在前面加了一个包头,可是某些时候一帧数据过大(比如说70K),UDP能发送吗?
      

  11.   

    sendto
    The sendto function sends data to a specific destination.int sendto(
      SOCKET s,                        
      const char FAR *buf,            
      int len,                         
      int flags,                       
      const struct sockaddr FAR *to,  
      int tolen                        
    );
    Parameters

    [in] Descriptor identifying a (possibly connected) socket. 
    buf 
    [in] Buffer containing the data to be transmitted. 
    len 
    [in] Length of the data in buf. 
    flags 
    [in] Indicator specifying the way in which the call is made. 
    to 
    [in] Optional pointer to the address of the target socket. 
    tolen 
    [in] Size of the address in to. 
    Return Values
    If no error occurs, sendto returns the total number of bytes sent, which can be less than the number indicated by len. Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling WSAGetLastError.
      

  12.   

    mtu 的概念属于哪层?不要将莫须有的东西  当作真实来看 先试验下 其实不会遇到你说的问题的这些都在ip分组的时候处理了。 
      

  13.   

    自己在UDP协议的基础上进行改造吧
    我是将UDP改造成了TUDP来进行类似TCP的传输的
      

  14.   

    sendto不仅适用于UDP,同时也适用于TCP,所以上面加粗的部分,应该说的是应用于TCP,而不是UDP.
      

  15.   

    RUDP(可信赖UDP):
    成熟的第三方RUDP库清单
    UDT(Last Version UDTm 4.2)
    Enat (Last Version 1.2)
    Raknet