首页 > 解决方案 > 如何通过以太网在片段中发送超过 1500 字节的 HTML 代码?

问题描述

我为微控制器编写了一个代码,其中 HTML 文本在 LAN 上通过以太网发送到浏览器,该代码工作正常,直到以太网帧大小超过 1500 字节。

有没有办法通过以太网以片段的形式成功地将 HTML 文本发送到浏览器?

案例:如果文本在发送前被分割!在这种情况下,浏览器只显示文本片段的第一部分。而其余的片段不会在浏览器上更新。

在这方面的任何支持将不胜感激!

标签: htmlcembeddedmicrocontrollerethernet

解决方案


我假设您正在使用 TCP 堆栈,并且没有尝试在设备上直接使用您自己的代码编写 TCP/IP 标头。那么您的问题很可能与以太网MTU(最大传输单元)有关。

MTU 是网络上所有设备可以传输(和接收)的最大有效载荷。典型的 MTU 大小为 1500 字节,但不幸的是,通常网络需要较低的 MTU(例如,在某些时候添加 PPPoE 或 VLAN 标头时)。通常它只是一个配置问题。大多数以太网硬件都支持超过 1500 字节的 MTU。

通常发生的情况是,一旦 TCP 尝试发送一个太大的数据包,它就会在某个点(发送方、接收方、交换机或路由器)被丢弃。像Wireshark这样的数据包嗅探器会进行 TCP 分析,并告诉您可疑的数据包丢失和 TCP 重传尝试。

将流拆分为数据包的是 TCP,因此 TCP 堆栈需要知道 MTU 是什么。在 Linux 上,TCP 堆栈将从网络接口获取此设置。ip link您可以使用或查看当前值ifconfig。它需要在 TCP 连接的两端进行配置,但您的问题应该通过在嵌入式设备的 TCP 堆栈中设置较低的 MTU 来解决。

除此之外,当路由器想要将帧从具有高 MTU 的网络转发到具有较低 MTU 的网络时(或者如果它添加了另一个以太网标头,并且帧现在太大),可能会发生IP 分段。除非您使用的是不支持分片的非常糟糕的 IP 堆栈,否则这应该不是问题。(但这是在浪费带宽。)根据标志,路由器可能会发送 ICMP 消息来通知发送方该问题。但是,如果中间有防火墙丢弃 ICMP 数据包,这将不起作用,并且会导致重新传输尝试而不会降低 MTU。


推荐阅读