1

我有一个可以处理多个客户端的简单 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以便它连接到第三个客户端)

4

1 回答 1

2

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

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

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

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

  4. 我无法对您要求服务器向第三台主机发送 SYN 以响应来自第三台主机的 RST 的要求附加任何意义,该 RST 看起来好像来自第二台主机。TCP 也不能像这样工作。

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

于 2012-09-18T23:32:31.987 回答