我使用raw socket构建一个tcp客户端程序并在机器A上运行它 我在机器B上运行常规tcp服务器程序
基于套接字的原始客户端程序首先发送SYN数据包 然后它从远程tcp服务器接收SYN / ACK数据包 然后机器A的内核发送远程tcp服务器的RST
序列号和ack序列号很好
有什么可能的原因?
以及如何处理它?谢谢!
BTW:我使用tcpdump来捕获远程机器B上的数据包 它显示来自客户端的SYN数据包的“TCP端口号重用”, 实际上在客户端发送SYN之前,我使用了
netstat -tnp
检查正在进行的tcp会话,它什么都没有显示
答案 0 :(得分:1)
这是完全正常的。如果机器收到它不期望的SYN / ACK数据包,它应该用RST响应,让对方知道它不知道或对该连接感兴趣。内核发送了一个RST因为它应该做的事情 - 它不知道你的程序在做什么。
如果您尝试在已有TCP堆栈的计算机上运行自己的TCP堆栈,则必须阻止常规TCP堆栈响应堆栈尝试与之通信的计算机 - 否则,它们将与两个无法工作的TCP堆栈进行通信。