2012-09-18 2 views
0

У меня есть простой сервер на Python, который может работать с несколькими клиентами:Восстановление на соединение TCP

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 не указывает, должна ли конечная точка пытаться восстановить соединение, когда видит СБРОС. Есть ли способ заставить сервер восстановить соединение? (Я хочу, чтобы он отправил обратно SYN, чтобы он подключился к третьему клиенту)

ответ

2

Ваш вопрос не имеет большого смысла. TCP просто не работает.

  1. Re «ТСР диаграмма состояний не говорит, если конечная точка должна попытаться восстановить соединение, когда он видит СБРОС»: RFC 793 #3.4 явно говорит: «Если получатель был в любом другом состоянии [чем СЛУШАТЬ или SYN-RECEIVED], он прерывает соединение и советует пользователю и переходит в состояние ЗАКРЫТО. ".

  2. RST не будет нарушать соединение, если он не достигнет этого соединения. Я предполагаю, что вы могли бы правдоподобно подделать один, но вам нужно будет узнать текущий порядковый номер TCP, и вы не сможете получить его из одного из сверстников, не говоря уже о третьем хосте.

  3. Если вам это удастся, соединение будет затем мертвым, законченным, kaput. Не вижу и этого.

  4. Я не могу приложить какое-либо значение к вашему требованию, чтобы сервер отправил SYN на третий хост в ответ на RST с третьего хоста, который был создан так, как будто он появился из второго хост. TCP тоже ничего не работает.

  5. Если вы хотите, чтобы сервер подключился к третьему хосту, ему просто нужно позвонить connect(), как и все остальные. В этом случае он становится клиентом, конечно.

+0

Я думаю, что OP подделал действительный RST (он упоминает scapy), но да, то, что он просит, не ясен. – jman

+0

@skjaidev Возможности OP по подделке действительного RST равны 1 в 2^32. – EJP

Смежные вопросы