我正在 Linux 下编写 C/C++ 客户端-服务器程序。假设客户端要向服务器发送一条消息 m。
客户端是否可以在发送 m 之前读取携带 m 的数据包的 TCP 序列号?
事实上,我想append将此序列号发送给 m,并发送结果数据包。 (嗯,事情比较复杂,但让我们保持简单。事实上,我想将身份验证信息应用于此序列号,然后将其附加到 m。)
而且,
服务器是否可以读取携带m的数据包的TCP序列号?
你可以做一些与此几乎相同的事情。您可以计算发送的所有字节,并将消息之前发送的所有字节的计数放在消息末尾。
每当有人谈论 TCP 的“数据包”时,我都会感到非常紧张。因为如果您同时谈论数据包和 TCP,您就是在混合不应该混合的协议级别。在 TCP 中发送的数据与通过 IP 发送的数据包之间没有任何有意义的对应关系。
是的,IP 数据包中有用于发送 TCP 信息的序列号。这些序列号是迄今为止发送的字节数(也称为八位位组)的计数。它们标识数据包中的字节所属的流中的位置,但它们与数据包无关。
如果发生重新发送,或者如果您正在使用 Nagle 算法,或者如果 TCP 堆栈那天感觉像这样,那么您最终可能会在同一个数据包中得到两个发送操作。或者,您可能最终会看到一个发送操作的一半在一个数据包中结束,另一半在另一个数据包中结束。每个数据包都有自己的序列号。
正如我所说,在传输层执行的发送操作与在网络层发送的数据包之间绝对没有任何有意义的关系。我也不是在理论上谈论。它并不是“实际上所有数据包都在下面,并且通常发送,除非出现一些奇怪的情况,否则会将所有字节放入单个数据包中”。不,我上面概述的将单个发送操作中的字节分散到多个数据包的情况经常发生,并且是在不可预测的条件下发生的。
所以,我不知道你为什么想知道有关数据包中的序列号的任何信息。但是,如果您使用序列号作为发送字节数的代理,您可以自己保留该计数并将其填充到流中。并记住也要计算这些字节。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)