【发布时间】:2021-12-30 09:05:22
【问题描述】:
我正在创建一个简单的 TCP 模拟程序,它可以作为一个简单的 IP 上的 TCP 服务器,问题出在我收到 SYN 数据包时编写的代码中,--> 我在我的程序服务器中完成了所有响应数据包的制定,并且创建响应包并使用 SYN+ACK 包进行回复。
但是在我回复 SYN+ACK 数据包后,我从客户端套接字获得了 RST 数据包。我不知道我的 TCP 有什么问题,或者某些头文件使我的客户端套接字只能用 RST 数据包回复我的 SYN+ACK 数据包。
我在网上看到关于 RST 数据包的信息,它说 RST 在主机上收到有两个原因,但可能还有更多原因
There are a few circumstances in which a TCP packet might not be expected; the two most common are:
The packet is an initial SYN packet trying to establish a connection to a server port on which no process is listening.
The packet arrives on a TCP connection that was previously established, but the local application already closed its socket or exited and the OS closed the socket.
所以我想知道在我的案例中给出的原因是什么。
当我在程序 IP 套接字上收到 SYN 数据包时
0000 45 00 00 3c 81 37 40 00 40 06 24 11 c0 a8 0a 14
0010 c0 a8 0a 0f ba 50 00 50 15 1a 68 41 00 00 00 00
0020 a0 02 fa f0 a3 ce 00 00 02 04 05 b4 04 02 08 0a
0030 de d7 fc f8 00 00 00 00 01 03 03 07
我用 SYN+ACK 包回复。我的 TCP 数据包是这样的
0000 45 00 00 28 00 64 40 00 40 06 a4 f8 c0 a8 0a 0f
0010 c0 a8 0a 14 00 50 ba 50 00 01 00 00 15 1a 68 41
0020 50 12 fa f0 e7 70 00 00
因此,TCP 中的字段类似于上面的 20(IP 标头)+20(TCP 标头)字节的数据包(SYN+ACK),用于从我的代码回复客户端套接字的 SYN+ACK。但不是从客户端开始发送数据,而是我的客户端开始发送 RST 数据包,在我的代码中,当我将 SYN + ACK 数据包从我的代码发送到客户端套接字后,我立即收到 RST 数据包。
但是,我得到 RST 数据包(重置数据包)而不是从客户端获取一些数据,或者至少我的客户端套接字 [connect()] 函数调用成功了?如何使来自我的客户端发送的这个 RST 数据包消失,以便我的客户端最终开始发送数据并且我的服务器代码开始获取数据?我做错了什么?
【问题讨论】:
-
将 ACK 设置为 SYN + 1 中的序列号的代码发生了什么?您收到带有 SEQ
15 1a 68 41的 SYN 数据包,并使用带有 ACK15 1a 68 41的 SYNACK 回复。这看起来不像 SEQ+1。