gpt4 book ai didi

c - 在发送数据包之前读取 TCP 序列号

转载 作者:可可西里 更新时间:2023-11-01 02:44:16 27 4
gpt4 key购买 nike

我正在 Linux 下编写 C/C++ 客户端-服务器程序。假设一条消息m要从客户端发送到服务器。

Is it possible for the client to read the TCP sequence number of the packet which will carry m, before sending m?

事实上,我想将这个序列号附加到m,然后发送结果包。 (嗯,事情比较复杂,但让我们保持简单。事实上,我想将身份验证信息应用到此序列号,然后将其附加到 m。)

此外,

is it possible for the server to read the TCP sequence number of the packet carrying m?

最佳答案

你可以做一些非常接近于此的事情。您可以计算发送的所有字节数,并在消息末尾计算消息之前发送的所有字节数。

每当有人谈论 TCP 的“数据包”时,我都会感到非常紧张。因为如果您同时谈论数据包和 TCP,那么您就是在混合不应混合的协议(protocol)级别。您在 TCP 中发送的数据与通过 IP 发送的数据包之间没有有意义的对应关系。

是的,用于发送TCP信息的IP数据包中有序列号。这些序列号是迄今为止发送的字节数(也称为八位字节)的计数。它们标识数据包中的字节在流中的位置,但它们与数据包无关。

如果发生重发,或者如果您正在使用 Nagle 算法,或者如果那天 TCP 堆栈感觉像这样,您可能会在同一个数据包中进行两次发送操作。或者,您可能最终将一个发送操作的一半放在一个数据包中,另一半放在另一个数据包中。每个数据包都有自己的序列号。

正如我所说,您在传输层执行的发送操作与在网络层发送的数据包之间绝对没有任何有意义的关系。我也不是在理论上谈论。它不是“实际上所有数据包都在下面并且发送通常,除非有一些奇怪的情况,将所有字节放在一个数据包中”。不,我在上面概述的场景中,来自单个发送操作的字节被传播到多个数据包,并且在不可预测的条件下经常发生。

所以,我不知道你为什么想知道关于数据包中序列号的任何事情。但是如果您使用序列号作为发送字节数的代理,您可以自己保留该计数并自己将其填充到流中。还要记得计算这些字节数。

关于c - 在发送数据包之前读取 TCP 序列号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4568136/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com