TCP服务端为何向客户端回传与客户端发送一致的重复报文,是否正常?
你观察到的现象属于TCP的正常机制,和你的代码实现无关。
具体原因说明
你在Wireshark中看到的“服务端回传相同内容”是工具的辅助展示效果,并不是服务端真的主动发送了重复的应用层数据:
- TCP是可靠传输协议,内核协议栈会自动对收到的数据段回复ACK(确认)报文,这个过程不需要上层应用代码参与,所以哪怕你注释掉了所有服务端的send逻辑,只要服务端成功收到客户端发送的数据,内核就会自动返回ACK报文。
- Wireshark为了降低分析门槛,会在ACK报文的信息列中直接标注该报文确认的数据内容,看起来就像是服务端把收到的内容发回去了一样。你可以点开对应报文查看详情,该报文的
Length字段为0,没有携带任何应用层载荷,和客户端发送的长度为14(对应this is a test的字节数)的数据报文有本质区别。 - 你也可以通过客户端运行结果验证:你的客户端代码中写了接收逻辑,但是运行后只会打印
Connection closed,不会打印Bytes received: 14,进一步证明没有收到应用层回发的数据。
补充说明(不影响当前功能的代码小问题)
你客户端代码中初始化hints时设置了AI_PASSIVE标志,这个标志是服务端调用getaddrinfo获取bind地址时才需要的,客户端连接服务端不需要设置该标志,不过该问题不会影响代码的正常运行。
内容的提问来源于stack exchange,提问作者1acb20cbef47f8ff0612dd8421
相关产品推荐
相关产品推荐

