Реализация функции accept() tcp

#python #tcp #implementation

#python #tcp #реализация

Вопрос:

В рамках школьного задания мы должны реализовать очень простую версию tcp python . Само общение осуществляется через udp сокет.

Моя проблема связана с реализацией accept() , в основном поддерживающей несколько клиентов. Я много читал об этом, но не смог найти ни одного источника, чтобы ответить на мои вопросы. Вот мой код прямо сейчас:

 # Accepts an incoming connection. This method blocks until an incoming SYN message
# arrives, handles the SYN message and returns the socket.
def accept(self):
    if self.state < STCP_STATE_LISTEN:
        raise StcpSocketException("Socket not listening")

    # Extract syn segment
    while True:
        syn = stcp_packet.read_from_socket(self.sock)
        if syn.syn:
            log.debug("(%s,%s) received SYN %s" % (self.local_addr, self.local_port, syn))
            break

    # TODO allocates the TCP buffers and variables

    # Allocate new socket
    connection = stcp_socket()
    connection.bind(self.local_addr, 0)
    connection.remote_addr = syn.srcIp
    connection.remote_port = syn.srcPort
    connection.change_state(STCP_STATE_SYN_RCVD)

    # Send syn ack segment
    syn_ack = connection.create_empty_pkt(True, True, False, None, syn.seqNum   1)
    self.seqNum  = 1
    connection.sock.sendto(syn_ack.pack(), syn.srcIp, syn.srcPort)
    log.debug("(%s,%s) sent SYN ACK %s" % (connection.local_addr, connection.local_port, syn_ack))

    # Extract last segment in handshake process
    while True:
        ack = stcp_packet.read_from_socket(connection.sock)
        if ack.ack:
            log.debug("(%s,%s) received ACK %s" % (connection.local_addr, connection.local_port, ack))
            connection.change_state(STCP_STATE_ESTAB)
            break

    return connection
  

И мои вопросы:

  1. Должен ли новый сокет отвечать на пакет syn или старый сокет (слушатель) должен завершить 3-стороннее рукопожатие?
  2. Должен ли клиент продолжать отправлять пакеты в прослушивающий сокет, который, в свою очередь, будет передавать во вновь созданный сокет, или клиент должен получить IP-адрес и порт нового сокета из пакета syn_ack и отправлять пакеты напрямую?

Комментарии:

1. Прочитайте справочную страницу accept(2) .

Ответ №1:

Должен ли новый сокет отвечать на пакет syn или старый сокет (слушатель) должен завершить 3-стороннее рукопожатие?

Старый должен, если есть рукопожатие. Одноранговый узел должен ожидать, что вся последовательность подтверждения будет поступать с одного и того же IP: порта.

Должен ли клиент продолжать отправлять пакеты в прослушивающий сокет, который, в свою очередь, будет передавать во вновь созданный сокет

Нет.

или клиент должен получить IP-адрес и порт нового сокета из пакета syn_ack и отправлять пакеты напрямую?

ДА. Окончательный ACK должен содержать новый номер порта.