我正在写一些服务器软件来升级电子设备上的固件。 这是一个棘手的任务,因为目前这些设备没有足够的内存来保存完整的固件,然后再安装它。 因此,我的服务器会将设备切换到引导加载程序模式,并指示引导加载程序执行什么操作,通过networking发送指令和固件数据。 正如你可以想象的,这有一些潜在的巨大的缺点。
目前我所关心的是,我发送的单个TCP段是否会被划分为多个以太网帧?
由于引导加载程序的性质,我可以在TCP段中发送的最大大小有效负载为255个字节。
从在Wireshark中抓取数据包,看起来像包含我的一个TCP段的帧的帧大小为309字节(2472位),在根据以太网帧上的Wikipedia页面允许的范围内:
我目前正试图处理如果连接到设备被切断会发生什么。 现在事情我没有任何问题重新build立与设备的连接,但是我想确定的是重新build立连接后会发生什么。
如果我能确定每条指令总是被包含在一个单一的以太网帧中,那么这些指令将会被传送或者不会被传送,那么快乐的日子就会被传送! 我可以看看发送的最后一条指令,然后找出要执行的操作。
但是,如果指令可能被分割成两个以太网帧,那么我就有一个更大的问题。 我不认为这会发生,但有时看起来像是在testing时。
假设我发出了一个写命令,并且引导装载程序正在等待数据写入,我发送了255个字节的TCP段,并将其分成两个以太网帧。 第一帧得到交付,但第二帧没有。 现在,当我重新连接时,我必须确定引导加载程序已经接收了多less个字节,这意味着我需要推送虚拟数据并侦听响应。 如果可能,我真的想避免这种情况。
从这个线程的注释中读取,似乎小于576字节(4,608比特)的IP分组不会被分开。 我是否安全地认为情况总是如此?
实际上,如果分裂了,那么WiFi模块在重新组装之前不应该传送TCP段,是不是正确的? 如果连接丢失,它将被丢弃。
一般来说,很难控制一个数据包是否被分割。 实际上,你需要在堆栈上做得非常深入 – 诸如将TCP卸载到硬件之类的东西也可能成为阻碍,并创build针对传输优化的数据包。
但是你正在谈论一个TCP连接 – 所以如果你的连接有一个短暂的中断,就不会有任何问题。 如果单个TCP数据包被拆分成多个以太网数据包,并且在单个帧的传输之间连接断开(短时间),则TCP将重试传输数据包(协议的一部分)。
有一个更长的/检测到的断开连接,一个更大的问题将是事实,你不能只是继续发送而不重新build立一个新的连接(这将需要你的设备来支持) – build立一个新的套接字发送到相同的没有TCP syn / ack的远程主机可以默认不支持默认堆栈。
关于你想要的目标(如果可能),我会build议有一个正确的方法来处理固件升级过程中的中断(如双启动)。
如果这是不可能的,而且你还没有实现你自己的TCP / IP协议栈,我可以推荐在你的服务器上禁用任何硬件加速(以防止硬件重新组装你的数据包),并禁用套接字连接的nagle的algorithm 。