【问题标题】:Sending a reset in TCP/IP Socket connection在 TCP/IP 套接字连接中发送重置
【发布时间】:2011-09-20 08:28:57
【问题描述】:

我正在使用 python 的 socket.py 来创建到 ftp 服务器的连接。现在我想重置连接(发送一个 RST 标志)并监听 ftp-server 的响应。 (仅供参考,使用 socket.send('','R') 不起作用,因为操作系统发送的是 FIN 标志而不是 RST。)

【问题讨论】:

标签: python sockets networking reset


【解决方案1】:

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

【讨论】:

  • 它会导致 TCP 在关闭时中止连接,丢弃任何未决数据,并发送 RST。
  • 对于那些好奇的人来说,这里只是一些更多信息:时间为 0 秒的 SO_LINGER 意味着 TCP 堆栈不会在 close() 上“徘徊”:它将丢弃任何未发送的数据并发送一个RST 而不是 FIN。欲了解更多信息,请阅读 thisthis
  • 请注意,如果您在 Microsoft Windows 环境中使用此代码,则需要将调用 struct.pack() 中的 'ii' 替换为 'hh'。 Windows 在 struct linger 中使用 short,而 Linux 使用 ints。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-15
      • 1970-01-01
      • 2012-11-18
      • 2014-12-10
      • 2014-04-08
      • 2020-12-03
      • 2013-06-29
      相关资源
      最近更新 更多