在TCP/IP Socket连接中发送重置

25 投票
4 回答
29003 浏览
提问于 2025-04-16 20:04

我正在使用Python的socket.py来连接一个ftp服务器。现在我想重置这个连接(发送一个RST标志),并监听ftp服务器的回应。(顺便说一下,使用socket.send('','R')并不能实现,因为操作系统会发送FIN标志,而不是RST。)

4 个回答

3

如果你想在连接上实现自己的功能,我觉得你可以试试 Scapy。这是一个非常有用的库和工具。它可以让你玩弄 IP、TCP、UDP 和 ICMP 数据包。

3

要在TCP连接上发送一个重置信号(RST),你需要把一个叫SO_LINGER的选项设置为true,并且把超时时间设置为零,然后关闭这个连接的套接字。这样就会重置连接。我不知道在Python中怎么做到这一点,或者说是否能做到。

47

打开SO_LINGER这个套接字选项,并把保持时间设置为0秒。这样做会让TCP在关闭连接时立即中断,清空数据并发送一个重置信号(RST)。具体的内容可以参考《UNP》书中的第7.5节和示例15.21。

在Python中:

def client(host, port):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
    s.connect((host, port))
    l_onoff = 1                                                                                                                                                           
    l_linger = 0                                                                                                                                                          
    s.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER,                                                                                                                     
                 struct.pack('ii', l_onoff, l_linger))
    # send data here
    s.close()

撰写回答