【问题标题】:Recover a TCP connection恢复 TCP 连接
【发布时间】:2012-09-18 23:07:34
【问题描述】:

我有一个可以处理多个客户端的简单 Python 服务器:

import select 
import socket 
import sys 

host = '' 
port = 50000 
backlog = 5 
size = 1024 
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
server.bind((host,port)) 
server.listen(backlog) 
input = [server,sys.stdin] 
running = 1 
while running: 
    inputready,outputready,exceptready = select.select(input,[],[]) 

    for s in inputready: 

        if s == server: 
            # handle the server socket 
            client, address = server.accept() 
            input.append(client) 

        elif s == sys.stdin: 
            # handle standard input 
            junk = sys.stdin.readline() 
            running = 0 

        else: 
            # handle all other sockets 
            data = s.recv(size) 
            if data: 
                s.send(data) 
            else: 
                s.close() 
                input.remove(s) 
server.close()

一个客户端连接到它,他们可以通信。我有第三个盒子,我从那里向服务器发送RST 信号(使用 Scapy)。 TCP 状态图没有说明端点是否应该在看到 RESET 时尝试恢复连接。有什么办法可以强制服务器恢复连接? (我希望它发回一个SYN 以便它连接到第三个客户端)

【问题讨论】:

    标签: sockets networking tcp network-programming scapy


    【解决方案1】:

    你的问题没有多大意义。 TCP 就是不能那样工作。

    1. 关于“TCP 状态图没有说明端点是否应该在看到 RESET 时尝试恢复连接”:RFC 793 #3.4 明确表示“如果接收器处于任何其他状态 [除了 LISTEN或 SYN-RECEIVED],它会中止连接并通知用户并进入 CLOSED 状态。”。

    2. RST 不会干扰连接,除非它通过该连接到达。我猜你可能会伪造一个,但你必须知道当前的 TCP 序列号,而你无法从任何一个对等方中获取该序列号,更不用说第三台主机了。

    3. 如果你以某种方式成功了,那么连接就会死掉,完成,结束。也看不出有什么意义。

    4. 对于您要求服务器向第三台主机发送 SYN 以响应来自第三台主机的 RST(看起来好像来自第二宿主。 TCP 也不能像这样工作。

    5. 如果您希望服务器连接到第三台主机,它只需要像其他人一样调用connect()。在这种情况下,它当然会成为客户。

    【讨论】:

    • 我认为 OP 伪造了一个有效的 RST(他提到了 scapy),但是是的,他的要求并不清楚。
    • @skjaidev OP 伪造有效 RST 的机会是 2^32 分之一。
    猜你喜欢
    • 1970-01-01
    • 2012-05-17
    • 1970-01-01
    • 1970-01-01
    • 2016-11-19
    • 1970-01-01
    • 1970-01-01
    • 2018-01-27
    • 1970-01-01
    相关资源
    最近更新 更多