为了演示 TCP 和 UDP 之间的差异,我通过网络连接传输文件的内容,并记录与 Wireshark 的交互。在 TCP 中一切看起来都很正常,但在 UDP 中,事情变得有点奇怪。
我正在设置在机器 A 上收听
netcat -ul 5000
然后从机器 B 发送文件:
netcat -u <ip address> 5000 < file.txt
当我查看 Wireshark 日志时,我收到一半的消息是通过 UDP 数据包获得的,而另一半显然是通过 IPv4 获得的,根本没有数据报(见下面的屏幕截图)。
这只是 Wireshark 显示数据的方式很奇怪,还是真的有一半的消息没有来自 UDP 的任何东西?为什么?
您会得到一个 UDP 数据包,该数据包具有您要发送的文件的大小。然后,UDP 数据包被 IP 堆栈分段为多个 IP 数据包。
Wireshark 显示原始的 IPv4 碎片数据包和碎片整理的 UDP 数据包碎片。
如果上层发送的数据包比 L2 协议的 MTU 允许的大,这是 IP 层的标准操作行为。
在 TCP 协议中,该协议找出主机之间最大的不可分片 Path MTU,并使用该大小发送正确大小的数据包,因此不需要进行 IP 级别的分片。这对协议操作有好处。
更新:
IPv4 是处理网络操作的路由部分的 L3(互联网层)协议。UDP 是在 IPv4 之上运行的 L4(传输层)协议。
并具体回答您的问题:
这是 Wireshark 显示碎片数据的正常方式,显示两个协议层。如果你有 HTTP 请求,那么你会在 Wireshark 中看到 IPv4 + TCP + HTTP 解码请求,这也是正常的。
一半的消息不是来自其他任何地方,它是协议栈不同级别上的相同数据。