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