2014-06-21 2 views
3

학교 과제의 일환으로 python에 매우 간단한 tcp 버전을 구현해야합니다. 자체 통신은 udp 소켓을 통해 이루어집니다.tcp의 accept() 함수 구현

제 문제는 주로 복수 클라이언트를 지원하는 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. 클라이언트가 청취 소켓에 패킷을 계속 보내면 새롭게 생성 된 소켓으로 패킷을 전달하거나 클라이언트가 syn_ack 패킷에서 새 소켓의 IP 및 포트를 가져와 패킷을 직접 보내야합니까?
+2

[accept (2)] (http://man7.org/linux/man-pages/man2/accept.2.html) 매뉴얼 페이지를 읽으십시오. –

답변

0

는 SYN 패킷에 새 소켓 응답이, 또는 이전 (수신기) 소켓은 3 방향 핸드 셰이크를 완료해야할까요?

옛날 핸드 셰이크라면? 피어는 전체 핸드 셰이크 시퀀스가 ​​동일한 IP : 포트에서 나올 것으로 기대해야합니다.

는 클라이언트가 다시 새로 생성 된 소켓에 전달합니다 청취 소켓에 패킷을 전송 유지해야

번호

또는 클라이언트는 새로운 소켓의를 받아야합니다 IP 및 syn_ack 패킷에서 포트와 직접 패킷을 보내시겠습니까?

예. 마지막 ACK는 새 포트 번호를 포함해야합니다.