CS/Network

[Network]TCP 연결 관리 - 3/4way handshake

frog-in-well 2022. 7. 29. 20:11

TCP 연결관리

클라이언트 호스트의 애플리케이션이 서버 호스트와 연결을 원한다는 것을 클라이언트 TCP에게 알린다. 클라이언트 TCP는 서버와 연결 설정을 시작한다.

+) ACK 세그먼트는 확인응답 세그먼트라는 의미이며, ACK 플래그를 의미하는 것이 아니다. ACK 플래그는 1비트이기 때문에 순서번호 +1 을 저장할 수 없다. ACK 플래그는 “수신한 세그먼트가 성공했다는 것을 확인 응답”하는 비트이다. 3-way에서 1단계에는 0으로 설정 / 2,3단계에서는 1으로 설정되어 있다.

3-way handshake

  1. SYN 세그먼트 전송 : 클라이언트 측 TCP는 SYN 플래그 비트를 1로 표시하고, 순서번호 필드에 임의의 숫자로 자신의 최초 순서번호를(clinet_isn) 설정하고 전송한다. 이 때, ****애플리케이션 계층 데이터는 포함하지 않는다.
  2. SYNACK 세그먼트 전송 : IP 데이터그램이 서버 호스트에 도착하면 TCP SYN 세그먼트를 역캡슐화한다. 그리고 연결에 TCP 버퍼와 변수들을 할당한다. 또한 클라이언트 TCP에게 연결 승인 세그먼트를 전송한다. 이 때, SYN 비트를 1로 표시한다. 확인응답 필드는 client_isn+1로 설정한다. 순서번호 필드에는 자신의 최초 순서번호를 저장한다(server_isn).
  3. SYNACK 세그먼트를 수신하면 클라이언트는 연결에 버퍼와 변수들을 할당한다. 그리고 서버로 연결 승인 세그먼트를 확인했다는 것을 알려준다. 확인응답 필드 안에 server_isn+1을 설정하고 연결이 설정되었기 때문에 SYN 비트는 0으로 설정한다. 3번째 단계에서는 세그먼트 페이로드에 애플리케이션 데이터가 운반될 수 있다.

3-way handshake로 연결이 설정되고 모든 데이터를 주고 받았다면 연결을 종료해야 한다. 클라이언트 호스트의 애플리케이션이 서버 호스트와 연결을 끊는다는 것을 클라이언트 TCP에게 알린다.

4-way handshake

  1. 클라이언트 측 TCP는 FIN 비트를 1로 설정하고 세그먼트를 전송한다.
  2. 서버 측 TCP는 클라이언트에게 ACK 세그먼트를 보낸다. 이후 남은 데이터를 모두 전송 완료한다.
  3. 종료할 준비가 되었다면 서버 측 TCP는 클라이언트에게 FIN 비트를 1로 설정하고 세그먼트를 전송한다.
  4. 클라이언트 측 TCP는 ACK 세그먼트를 보낸다. 일정 시간동안 대기한 후 두 호스트의 모든 자원의 할당이 해제된다.

만약 서버의 FIN 전송이 유실되면(3단계) 서버는 타임아웃 이벤트가 발생하여 다시 FIN 전송을 하게 된다. 이 때 연결을 위한 자원이(TCP 버퍼 및 할당된 변수들) 필요하므로 서버의 FIN 세그먼트를 받고 일정 시간동안 대기하는 것이다.