我已经编写了一个微控制器代码,其中HTML文本通过以太网在LAN上发送到浏览器,该代码在以太网帧大小超过1500个字节之前可以正常工作。
是否可以通过以太网将片段中的HTML文本成功发送到浏览器?
案例:如果文本在发送之前是零散的! 在这种情况下,浏览器仅显示文本片段的第一部分。其余片段不会在浏览器上更新。
在这方面的任何支持将不胜感激!
答案 0 :(得分:1)
我假设您正在使用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 fragmentation太大了)。除非您使用的是实现不佳且不支持碎片的IP堆栈,否则这应该不是问题。 (但这浪费带宽。)然后,根据标志,路由器可能会发送ICMP消息以将问题通知发送方。但是,如果之间存在丢弃ICMP数据包的防火墙,则该防火墙将无法工作,并导致重传尝试而不会降低MTU。