#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
И мои вопросы:
- Должен ли новый сокет отвечать на пакет syn или старый сокет (слушатель) должен завершить 3-стороннее рукопожатие?
- Должен ли клиент продолжать отправлять пакеты в прослушивающий сокет, который, в свою очередь, будет передавать во вновь созданный сокет, или клиент должен получить IP-адрес и порт нового сокета из пакета syn_ack и отправлять пакеты напрямую?
Комментарии:
1. Прочитайте справочную страницу accept(2) .
Ответ №1:
Должен ли новый сокет отвечать на пакет syn или старый сокет (слушатель) должен завершить 3-стороннее рукопожатие?
Старый должен, если есть рукопожатие. Одноранговый узел должен ожидать, что вся последовательность подтверждения будет поступать с одного и того же IP: порта.
Должен ли клиент продолжать отправлять пакеты в прослушивающий сокет, который, в свою очередь, будет передавать во вновь созданный сокет
Нет.
или клиент должен получить IP-адрес и порт нового сокета из пакета syn_ack и отправлять пакеты напрямую?
ДА. Окончательный ACK должен содержать новый номер порта.