使用Python Scapy建立TCP连接时客户端未生成连接记录的异常问题排查
问题原因分析
这个问题的核心原因很明确:你的客户端操作系统TCP/IP协议栈完全没有参与这次TCP连接的建立过程,自然不会在netstat里记录这个连接。
具体拆解来看:
- 服务器端的
ncat是基于操作系统TCP栈工作的:当它监听端口时,内核的TCP模块负责处理SYN包、回复SYN-ACK,收到ACK后会把连接状态标记为ESTABLISHED,所以netstat能查到这条连接记录——因为内核自己维护了这个连接的状态。 - 而你用Scapy写的客户端代码,是直接在链路层构造并发送原始数据包:从SYN包到最后的ACK包,都是Scapy绕过了客户端内核的TCP栈,直接把数据包发出去的。客户端的内核根本不知道有这么一个连接正在建立,它既没有收到SYN-ACK包(因为Scapy已经把这个包截获处理了,没交给内核),也没有参与ACK包的发送,所以内核的连接状态表里完全没有这条记录,
netstat自然查不到。
简单来说:你相当于手动帮客户端“伪造”了三次握手的数据包,但客户端自己的“通讯录”(内核TCP栈)根本没记下来这件事,所以你查通讯录当然找不到这条连接。
如果想要客户端netstat能查到连接,你需要用操作系统TCP栈原生的方式发起连接——比如用Python的socket库,而不是Scapy直接构造数据包。
内容的提问来源于stack exchange,提问作者ak_neo
相关产品推荐
相关产品推荐

