2017-05-05 16 views
3

我尝试使用UDP通过本地网络传输大量数据,并使用QT作为Socket访问的框架。发送简单消息到目前为止不是问题。 但是,我没有(完全)理解如何处理包的分割以及由谁来完成。UDP拆分/合并。哪一层处理它? (QT Networking)

所以QT指出:

发送数据包大于512个字节是一般disadvised,因为即使它们被成功发送,他们很可能要由IP层在他们到达最终目的地之前支离破碎。

因此我实现了我自己的小协议来处理大数据的拆分和合并。具有更大的尺寸大于512个字节(在10kBytes的顺序)播放的时候,我遇到了下面的代码片段从Wireshark的:

"17","0.145050","192.168.2.111","192.168.2.222","IPv4","1514","Fragmented IP protocol (proto=UDP 17, off=0, ID=3a47) [Reassembled in #23]" 
"18","0.145051","192.168.2.111","192.168.2.222","IPv4","1514","Fragmented IP protocol (proto=UDP 17, off=1480, ID=3a47) [Reassembled in #23]" 
"19","0.145051","192.168.2.111","192.168.2.222","IPv4","1514","Fragmented IP protocol (proto=UDP 17, off=2960, ID=3a47) [Reassembled in #23]" 
"20","0.145051","192.168.2.111","192.168.2.222","IPv4","1514","Fragmented IP protocol (proto=UDP 17, off=4440, ID=3a47) [Reassembled in #23]" 
"21","0.145052","192.168.2.111","192.168.2.222","IPv4","1514","Fragmented IP protocol (proto=UDP 17, off=5920, ID=3a47) [Reassembled in #23]" 
"22","0.145052","192.168.2.111","192.168.2.222","IPv4","1514","Fragmented IP protocol (proto=UDP 17, off=7400, ID=3a47) [Reassembled in #23]" 
"23","0.145052","192.168.2.111","192.168.2.222","UDP","1186","63230 > 8007 Len=10024" 

,并从我得到一个数据报在QT。 对我来说,似乎IP层已经在分解/合并我的(太大)UDP数据包了。 所以:

  1. 为什么建议我自己拆分UDP数据?
  2. “谁”处理IP层? (QT,Windows,网络硬件?)
  3. 我假设在UDP套接字中有读写缓冲区产生的第二个限制,我可以在哪里检查?

回答

3

QT的状态是无意义的。即使数据报在通过互联网的途中分散,他们也会在目的地重新发布。他们对这个正在IP层上进行正确的,所以没有什么对你的应用程序担心,除非你打算打破了64k的最大数据包大小(64K - Wikipedia on UDP

至于你的问题:

  1. 明显错误。忽视。
  2. IP层由IP堆栈处理,通常在内核级别
  3. “第二限制”由IP协议(在你的情况下为v4)定义,它定义长度字段为16位,使得最大数据报大小为64k (RFC 791)

但是,如果你打算做的是以可靠的方式传输大块数据,你应该使用TCP而不是UDP。让TCP处理这些事情而不是你的应用程序。