3

我正在研究通过 TCP 将嵌入式电路板连接到 PC。

该板包含一个芯片,可悲的是,它在接收数据时不会产生任何中断。但它确实会在接收到“Keep-Alive”信号时产生中断。

目前我必须轮询数据。相反,我在想,我将从 PC 发送数据,然后发送 KeepAlive 信号。每当收到 KeepAlive 时,我也会读取数据。我明白这可能会产生误报,但它比连续轮询要好。

我在 Wireshark 上观察到一个 Keep-Alive 数据包,它有一个字节的数据,它是“00”。 在 Wireshark 上保持活动信号

然后我尝试发送数据为“00”的 TCP 数据包: 模拟保活信号

我可以看到,只有Flag部分不同。

我有两个问题:

  1. (Broadly) 如何手动发送 Keep-Alive 信号?
  2. 如何更改该标志设置?(sendsendto中的标志不同)

更新:我尝试过 RawSockets,但这对我没有帮助,或者我错过了一些东西。我只是在 RAW Sockets 标头中将 Flag 更改为 ACK。

4

1 回答 1

3

RFC 1122 第 4.2.3.6 节可能值得一读。

它指出keepalive 是TCP 实现的一个可选特性。它还指出,保活信号应限制为每两小时最多一个。因此,从您的应用程序中手动发出一个通常不是所需的功能。

此外,它描述了有关实现的细节,特别指出了所涉及的序列号。这是您的屏幕截图中可见的一个差异,您显然没有注意到:真正的保活数据包具有非常高的相对序列号,它只是 -1 的无符号表示。要使用原始套接字重现这一点,我认为您必须以某种方式掌握现有连接的当前 TCP 序列号。与 RawSockets 的合作还不够,无法了解如何执行此操作的详细信息。

支持让系统定期发送 keepalive 的方法是使用该SO_KEEPALIVE选项。但我认为,在特定时刻发出这样的信号并没有多大用处。

于 2013-10-01T11:28:49.133 回答