作为学校作业的一部分,我们需要在python
中实现一个非常简单的tcp版本。它自己的通信是通过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
我的问题:
答案 0 :(得分:0)
新套接字是应该响应syn数据包,还是旧(侦听器)套接字应该完成3次握手?
旧的应该握手。对等体应该期望整个握手序列来自相同的IP:端口。
客户端是否应该继续向侦听套接字发送数据包,而侦听套接字又将传递给新创建的套接字
没有
或者客户端是否应该从syn_ack数据包中获取新套接字的IP和端口并直接发送数据包?
是。最终的ACK将需要包含新的端口号。