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

25

我正在使用Python的socket.py创建到FTP服务器的连接。现在,我想重置连接(发送RST标志)并监听FTP服务器的响应。(顺带一提,使用socket.send('','R')不起作用,因为操作系统发送FIN标志而不是RST。)


1
你为什么想要重置连接? - user207421
4
复制恶意FTP客户端。 - Anvay
相关:从服务器端重置TCP连接 - maxschlepzig
3个回答

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()

4
当关闭连接时,它将导致TCP中止连接,丢弃任何未完成的数据,并发送RST。 - user207421
8
对于那些好奇的人,这里有更多信息:SO_LINGER中0秒的时间意味着TCP栈在close()时不会“逗留”,它将丢弃任何未发送的数据并发送一个RST而不是FIN。要了解更多信息,请阅读此处和此处。 - Steve Kehlet
5
请注意,如果您在Microsoft Windows环境中使用此代码,则需要将对struct.pack()的调用中的“ii”替换为“hh”。Windows在struct linger中使用shorts,而Linux使用ints。 - J Ashley

3
如果您想在连接方面实现自己的行为,我认为您应该尝试使用Scapy。它是一个非常有用的库/工具,可以让您玩转IP/TCP/UDP/ICMP包。

3

如果要在TCP连接上发送RST,请将SO_LINGER选项设置为true,超时时间为零,然后关闭套接字。这将重置连接。我不知道如何在Python中实现这一点,或者是否可以实现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接