TCP 프로토콜의 연결 및 연결해제 과정
TCP 프로토콜은 전송계층에서 동작하는 프로토콜로 송신자와 수신자가 연결된 상태에서 데이터를 주고 받는 연결 지향적 프로토콜이다. TCP 프로토콜은 3 way handshake 연결과정을 통해 송수신자를 연결한 후 데이터를 주고받는 통신을 진행한다. 데이터 전송이 종료되고 나면 4 way handshake 연결해제과정을 통해 통신을 종료한다.
3 way handshake (TCP 연결과정)
3 way handshake 과정은 데이터를 전송하기 전 송신자와 수신자를 연결하는 과정으로 통신할 네트워크 장치 간 논리적 접속 상태를 만들기 위해 사용한다. 이 과정을 위해 TCP 세그먼트 헤더에 존재하는 ACK와 SYN 비트가 사용된다. 3 way handshake TCP 연결과정은 크게 3단계로 구성된다.
Step 1.
클라이언트는 서버에게 접속을 요청하는 클라이언트의 ISN이 담긴 SYN을 전송한다.
(ISN은 새로운 TCP 연결의 첫 번째 패킷에 할당된 임의의 시퀀스 번호)
Step 2.
이때 서버는 Listen 상태로 포트 서비스가 가능한 상태여야한다. 서버는 SYN 요청을 수신하고 요청을 수락한다는 의미로 서버의 ISN을 담아 SYN을 보내며 승인번호로 클라이언트의 ISN + 1을 담아 ACK를 보낸다.
Step 3.
클라이언트는 서버로부터 ACK와 SYN플래그가 설정된 패킷을 받고 서버의 ISN + 1 의 값을 승인번호로 담아 ACK를 발송한다.
4 way handshake (TCP 연결해제 과정)
데이터 송수신이 완료되면 TCP 연결을 해제하는 과정이 필요하다. 이 과정을 4 way handshake라고 합니다. 4 way handshake를 수행하기 위해서는 TCP 헤더의 ACK와 FIN 플래그가 사용된다.
Step 1. 클라이언트 연결해제 요청
먼저 클라이언트가 연결을 닫으려고 할 때 FIN으로 설정된 세그먼트를 서버에 보낸다. 그리고 클라이언트는 FIN_WAIT_1의 상태로 들어가 서버의 응답을 기다린다.
Step 2. 클라이언트 연결해제 요청 확인
서버는 클라이언트에게 ACK를 보내 해제요청 승인 세그먼트를 보낸다. 그리고 CLOSE_WAIT 상태에 들어간다. 클라이언트가 서버의 ACK 세그먼트를 받으면 FIN_WAIT_2 상태에 들어간다.
Step 3. 서버 연결해제 요청
서버는 2단계에서 ACK 세그먼트를 보내고 일정 시간 이후에 클라이언트에 FIN이라는 세그먼트를 보낸다. 서버로부터 FIN 세그먼트를 받은 클라이언트는 TIME_WAIT 상태가 된다.
Step 4. 서버 연결해제 요청 확인
클라이언트는 다시 서버로 ACK를 보내고 이를 받은 서버는 CLOSED상태가 된다. 이후 클라이언트는 TIME_WAIT상태를 유지하며 어느정도 시간을 대기한 후 CLOSED 상태로 연결이 닫히고 클라이언트와 서버의 모든 자원의 연결이 해제된다.
4 way handshake 과정에서 마지막에 TIME_WAIT 상태를 유지하는 이유
첫 번째는, TIME_WAIT 없이 즉각적으로 연결을 해제할 경우 지연패킷이 발생하여 패킷이 뒤늦게 도착하고 이를 처리하지 못한다면 데이터 무결성 문제가 발생할 수 있다.
두 번째는, 두 장치가 연결이 닫혔는지 확인하기 위함이다. 만약 연결해제 마지막 과정에서 ACK를 전송하자마자 포트를 닫아버릴 경우 서버는 FIN을 보낸후 승인 메시지를 받지못해 포트가 열려있는 LAST_ACK 상태를 유지하게 된다. 이때 클라이언트가 포트를 닫아 버린다면 서버는 승인 메시지를 다시 받을 수 없어 응답 메시지를 계속 기다리게 될것이다.
따라서, 다시 새로운 연결을 하려고 할 때 장치는 줄곧 LAST_ACK로 되어있기 때문에 접속 오류가 발생할 수 있다. 이러한 이유로 TIME_WAIT이라는 안전장치가 필요하다.
TCP 주요 제어비트(Flag Bit)
종류 | 내용 |
ACK | ACK는 응답시 사용되는 플래그로 패킷의 수신여부를 확인하기 위한 목적으로 사용된다. |
SYN | SYN은 연결요청 플래그로 TCP 연결을 시작할 때 제일 먼저 보내지며 연결의 시작을 요청할때 사용된다. |
ISN | ISN(초기 시퀀스 번호)은 네트워크를 통해 통신하는 두 장치 간의 고유한 연결을 식별하는데 사용되는 임의의 값이다. |
FIN | FIN은 TCP 연결을 종료시킬 때 사용되며 더 이상 전송할 데이터가 없음을 나타낸다. |
TCP 연결 및 연결해제 포트 상태
상태 | 내용 |
CLOSED | 포트가 닫힌 상태 |
LISTEN | 포트가 열린 상태, 연결요청 상태 |
SYN_SENT | SYN 요청을 보내고 SYN+ACK 응답을 기다리는 상태 |
SYN_RECEIVED | SYN 요청을 받고 상대방의 응답을 기다리는 상태 |
ESTABLISHED | 포트연결 상태 |