TCP 소켓의 입출력 버퍼

TCP 소켓의 데이터 송수신에는 경계가 없음

서버가 한 번의 write 함수 호출로 40바이트를 전송해도 클라이언트는 네 번의 read 함수 호출로 10바이트씩 받는게 가능

→ 그럼 클라이언트가 10바이트를 먼저 수신했다면, 나머지는 어디서 대기?

→ write나 read 함수 호출 시 즉시 데이터가 전송되거나 수신되는 것이 아닌 write 함수 호출 시 데이터가 출력 버퍼로 이동하고, read 함수 호출 시 입력버퍼에 저장된 데이터를 읽음

 

TCP 소켓의 입출력 버퍼의 특성

  • TCP 소켓 각각에 대해 별도로 존재
  • 입출력 버퍼는 소켓생성시 자동 생성
  • 소켓을 닫아도 출력버퍼에 남아있는 데이터는 계속해서 전송
  • 소켓을 닫으면 입력버퍼에 남아있는 데이터는 소멸

 

 

TCP의 내부 동작 원리

  • 상대 소켓과의 연결
  • 접속을 요청하는 쪽에서 SYN(Synchronization) 신호 패킷을 보냄
  • Server에서는 SYN, ACK 신호를 클라이언트 쪽으로 보냄
  • 클라이언트에서 다시 ACK 신호를 보냄으로써 연결이 이루어짐
  • SEQ(Sequence Number)는 패킷 번호
  • 받은 쪽은 다음에 요청할 패킷 번호를 ACK Number를 통해 전달

 

상대 소켓과의 데이터 송수신

  • 연결 후 데이터를 송수신
  • 데이터를 보낸 패킷에 대해 ACK Number를 Sequence Number + 전송된 바이트 크기 + 1로 받음
  • 전송된 바이트 크기를 포함해서 받음으로써 데이터의 손실 유무 확인
  • 패킷 전송 시 타이머가 작동해서 일정 시간 안에 ACK 메세지가 오지 않을 경우 재전송

 

상대 소켓과의 연결 종료

  • 4단계에 걸쳐서 연결 종료
  • 양쪽 모두 정상적 종료를 위해 FIN 신호를 주고 받음

+ Recent posts