[네트워크] | TCP 3 way handshake & 4 way handshake

제롬·2023년 7월 18일
0

TCP(Transmission Control Protocol)

TCP는 전송계층에서 동작하는 프로토콜로 송신지와 수신지가 연결된 상태에서 데이터를 주고 받는 연결 지향적 프로토콜이다. 데이터를 전송하기 전 송신지와 수신자를 3 way handshake 과정을 통해 연결한다. 연결을 설정하면 통신 회선이 고정되고 모든 데이터는 고정된 통신회선을 통해 전달된다. 또한, 수신지에서 데이터 전송이 끝나면 4 way handshake 과정을 통해 데이터가 모두 전달되었는지 확인하고 연결을 해제한다.

3 way handshake (TCP 연결과정)

통신할 네트워크 장치 간 논리적 접속 상태를 만들기 위해 3 way handshake 방법을 사용한다. 이 과정을 위해 TCP 세그먼트 헤더에 존재하는 ACK와 SYN 비트가 사용된다.

[1단계: SYN]
클라이언트는 서버에게 접속을 요청하는 클라이언트의 ISN이 담긴 SYN을 전송한다.
(ISN은 새로운 TCP 연결의 첫 번째 패킷에 할당된 임의의 시퀀스 번호)

[2단계: SYN + ACK]
이때 서버는 Listen 상태로 포트 서비스가 가능한 상태여야한다. 서버는 SYN 요청을 수신하고 요청을 수락한다는 의미로 서버의 ISN을 담아 SYN을 보내며 승인번호로 클라이언트의 ISN + 1을 담아 ACK를 보낸다.

[3단계: ACK]
클라이언트는 서버로부터 ACK와 SYN플래그가 설정된 패킷을 받고 서버의 ISN + 1 의 값을 승인번호로 담아 ACK를 발송한다.

4 way handshake(TCP 연결해제 과정)

데이터 송수신이 완료되면 TCP 연결을 해제하는 과정이 필요하다. 이 과정을 4 way handshake라고 한다. 4 way handshake를 수행하기 위해서는 TCP 헤더의 ACK와 FIN 플래그가 사용된다.

[1단계: FIN(클라이언트 연결해제 요청)]
먼저 클라이언트가 연결을 닫으려고 할 때 FIN으로 설정된 세그먼트를 서버에 보낸다. 그리고 클라이언트는 FIN_WAIT_1의 상태로 들어가 서버의 응답을 기다린다.

[2단계: ACK(클라이언트 연결해제 요청 확인)]
서버는 클라이언트에게 ACK를 보내 해제요청 승인 세그먼트를 보낸다. 그리고 CLOSE_WAIT 상태에 들어간다. 클라이언트가 서버의 ACK 세그먼트를 받으면 FIN_WAIT_2 상태에 들어간다.

[3단계: FIN(서버 연결해제 요청)]
서버는 2단계에서 ACK 세그먼트를 보내고 일정 시간 이후에 클라이언트에 FIN이라는 세그먼트를 보낸다. 서버로부터 FIN 세그먼트를 받은 클라이언트는 TIME_WAIT 상태가 된다.

[4단계: ACK(서버 연결해제 요청 확인)]
클라이언트는 다시 서버로 ACK를 보내고 이를 받은 서버는 CLOSED상태가 된다. 이후 클라이언트는 TIME_WAIT상태를 유지하며 어느정도 시간을 대기한 후 CLOSED 상태로 연결이 닫히고 클라이언트와 서버의 모든 자원의 연결이 해제된다.

4 way handshake 과정에서 마지막에 TIME_WAIT 상태를 유지하는 이유

첫 번째는, TIME_WAIT 없이 즉각적으로 연결을 해제할 경우 지연패킷이 발생하여 패킷이 뒤늦게 도착하고 이를 처리하지 못한다면 데이터 무결성 문제가 발생할 수 있다.

두 번째는, 두 장치가 연결이 닫혔는지 확인하기 위함이다. 만약 연결해제 마지막 과정에서 ACK를 전송하자마자 포트를 닫아버릴 경우 서버는 FIN을 보낸후 승인 메시지를 받지못해 포트가 열려있는 LAST_ACK 상태를 유지하게 된다. 이때 클라이언트가 포트를 닫아 버린다면 서버는 승인 메시지를 다시 받을 수 없어 응답 메시지를 계속 기다리게 될것이다. 따라서, 다시 새로운 연결을 하려고 할 때 장치는 줄곧 LAST_ACK로 되어있기 때문에 접속 오류가 발생할 수 있다.

이러한 이유로 TIME_WAIT이라는 안전장치가 필요하다.

TCP 주요 제어비트(Flag Bit)

TCP 연결 및 해제 포트상태

2개의 댓글

comment-user-thumbnail
2023년 7월 18일

잘 봤습니다. 좋은 글 감사합니다.

답글 달기
comment-user-thumbnail
2023년 7월 18일

소중한 정보 감사드립니다!

답글 달기