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

1 つのクライアントがそれに接続し、通信できます。サーバーに信号を送信している場所から3番目のボックスがありRSTます(Scapyを使用)。TCP 状態図には、エンドポイントが RESET を検出したときに接続を回復しようとするかどうかは示されていません。サーバーに強制的に接続を回復させる方法はありますか? SYN( 3番目のクライアントに接続できるようにaを送り返したい)

4

1 に答える 1

2

あなたの質問はあまり意味がありません。TCPはそのようには機能しません。

  1. 「TCP 状態図は、エンドポイントが RESET を見たときに接続を回復しようとするかどうかを示していません」について: RFC 793 #3.4は、「受信者が [LISTEN または SYN-RECEIVED 以外の] 他の状態にあった場合」と明示的に述べています。接続を中止し、ユーザーに通知して CLOSED 状態に移行します。」

  2. RST は、接続を介して到着しない限り、接続を妨害しません。もっともらしく偽造できると思いますが、現在の TCP シーケンス番号を知る必要があり、3 番目のホストは言うまでもなく、いずれのピアからも取得できません。

  3. 何らかの方法で成功した場合、接続は切断され、終了し、カプトになります。その点もわかりません。

  4. 3 番目のホストからの RST に応答して、サーバーが SYN を 3 番目のホストに送信するという要件に意味を与えることはできません。TCPもこのように機能しません。

  5. connect()サーバーを 3 番目のホストに接続する場合は、他のすべてのホストと同じように呼び出す必要があります。もちろん、その場合はクライアントになります。

于 2012-09-18T23:32:31.987 に答える