전송 계층 (Transport layer)

 
 
프로세스 간의 통신을 담당하므로 포트번호를 요구하며 통신 규약은 TCP, UDP 가 있다.
멀티플렉싱/디멀티플렉싱, 포트번호, 세그먼트에 대한 내용은 ‘Network 계층 위에 있는 Transport 계층에 대해 알아보자’ 참고.
 

TCP

  • 패킷 전송의 순서를 보장
  • 연결지향적이므로 신뢰성 보장
  • ‘가상회선 패킷 교환방식’ 사용
 

UDP

  • 순서 보장하지 않음
  • 수신 여부 확인하지 않음
  • ‘데이터그램 패킷 교환방식’ 사용
 
 

가상회선 패킷 교환방식

각 패킷에는 가상회선을 식별하는 식별자가 포함되며, 모든 패킷을 전송하고 나면 가상회선이 해제되고 패킷들은 전송된 순서대로 수신부에 도착한다.
 

데이터그램 패킷 교환방식

패킷이 독립적으로 최적 경로를 선택하여 전송된다.
하나의 메세지에서 분할된 여러 패킷은 서로 다른 경로로 전송될 수 있으며 도착하는 순서가 다를 수 있다.
 

TCP 연결성립과정: 3-way handshake

TCP 에서는 송수신에 신뢰성을 보장하기 위해 클라이언트가 세그멘트를 전송하기 전에 3-way handshake 라는 작업을 선행한다.
 
notion image
  1. SYN 단계
  • SYN은 연결을 요구함을 나타낸다.
  • 클라이언트는 아래와 같이 헤더에 SYN 단계에 필요한 정보를 담아서 서버로 전송한다. sequence number는 TCP 연결 후 첫번째 패킷에 할당된 임의의 숫자이며 클라이언트마다 다르다.
Control-Flags: SYN=1, ACK=0 Sequence-Number: 100203
 
  1. SYN & ACK 단계
  • ACK 는 확인 응답을 나타낸다.
  • 서버는 클라이언트에게 연결이 성립되었고 이를 인지했음을 알리기 위해 아래와 같이 헤더에 정보를 담아서 클라이언트에게 전송한다. 여기서 sequence number는 서버에서 임의로 할당한 숫자이고, ack number 는 클라이언트가 보냈던 sequence number + 1 이다.
Control-Flags: SYN=1, ACK=1 Sequence-Number: 430534 (서버가 임의로 할당한 숫자) Ack-Number: 100204 (클라이언트가 보냈던 Sequence-Number + 1)
 
  1. ACK 단계
  • 서버가 보낸 SYN & ACK 에 대한 확인 응답으로 클라이언트에서 ACK 를 전송한다.
  • 여기서 ack number 는 서버가 2단계에서 보냈던 sequence number + 1 이다.
Control-Flags: ACK=1, SYN=0 Ack-Number: 430535 (서버가 보냈던 Sequence-Number + 1)
 
SYN, ACK 외에 다른 control flags 들도 같이 전송되지만 3-way handshake 단계에서 다른 플래그들은 모두 0으로 전송되므로 위에 예시에 기재하지 않았다.
 
 

TCP 연결해제과정: 4-way handshake

TCP 에서 연결을 해제할 때는 4-way handshake 가 발생한다.
 
notion image
 
  1. 클라이언트의 FIN 전송
  • 클라이언트 프로세스에서 연결을 닫으려고 할 때 멀티플렉서는 control flag FIN=1 으로 헤더를 설정한다.
  • 세그멘트 전송 후 클라이언트의 프로세스는 FIN_WAIT_1 상태로 들어간다.
 
  1. 서버의 ACK 전송
  • 서버는 클라이언트에게 ACK 를 전송한다.
  • ACK 전송 후 서버의 프로세스는 CLOSE_WAIT 상태에 들어간다.
  • 클라이언트 프로세스는 서버로부터 ACK 를 받고나면 FIN_WAIT_2 상태로 들어간다.
 
  1. 서버의 FIN 전송
  • 서버는 ACK 를 보내고 나서 일정 시간 이후에 FIN 을 전송한다.
  • 서버로부터 FIN 을 받고나서 클라이언트 프로세스는 TIME_WAIT 상태가 된다.
 
  1. 클라이언트의 ACK 전송
  • 클라이언트 프로세스가 TIME_WAIT 상태로 바뀌고 나서 서버에게 ACK 를 전송한다.
  • 서버의 프로세스는 ACK 를 받고나면 CLOSED 상태가 된다.
  • 클라이언트는 ACK 를 보낸 후 일정 시간 대기한 후에 CLOSED 상태가 된다.
  • 클라이언트와 서버의 자원 (소켓, 프로세스에 할당했던 메모리 등) 이 해제된다.
 
 
서버로부터 FIN을 받고 나서 클라이언트는 바로 소켓을 닫지 않고 TIME_WAIT 상태에 있다가 ACK 를 전송하는 이유는 전송이 지연되는 세그먼트를 감안하기 때문이다. 아직 서버 측에 전송되지 않은 세그먼트가 남아있는 상태에서 클라이언트가 소켓을 끊어버리면 데이터 무결성이 깨진다.
 
 
참고도서