TCP header에는 Code bit (Flag bit)라는 부분이 있다. (빨간 테두리 박스)
이 부분은 6bit로 이뤄져 있고 각각의 bit가 의미를 갖는다.
URG - ACK - PSH - RST - SYN - FIN 의 순서로 되어있다.
(혼잡제어 기능 향상을 위해 Reserved 필드를 사용하여 6개의 Flag에서 NS, CWR, ECE Flag가 추가)
해당 위치의 비트가 1이면 해당 패킷이 어떤 내용을 담고있는 패킷인지 나타낸다.
ex) SYN 패킷인 경우 000010
, ACK 패킷인 경우 010000
정의
1. Client → Server : SYN
클라이언트는 서버에 접속을 요청하는 SYN(a)
패킷을 보낸다.
클라이언트가 최초로 데이터를 전송할 때,
TCP header의 Sequence Number 필드를 임의의 랜던 숫자로 지정하고
SYN Flag 필드를 1로 설정한 세그먼트를 전송한다.
Port 상태
CLOSED
LISTEN → SYN_RCV
(클라이언트로부터 SYN을 받고 난 후)2. Server → Client : SYN + ACK
서버는 클라이언트의 요청 (SYN(a)
)을 받은 후,
ACK(a+1) : 요청을 수락한다는 의미 + SYN(b) : 클라이언트와 연결을 요청 을 발송한다.
서버는 TCP header의 Acknowledgement Number 필드를 Sequence Number + 1로 지정하고
SYN Flag 와 ACK Flag 필드를 1로 설정한 세그먼트를 전송한다.
Port 상태
CLOSED
SYN_RCV
3. Client → Server : ACK
클라이언트는 서버의 수락 응답(ACK(a+1)
) 및 연결 요청(SYN(b)
)을 받은 후,
ACK(b+1) : 서버의 요청을 수락한다는 의미 을 서버로 보내면 연결이 성립(establish)된다.
전송할 데이터가 있으면, 이 단계에서 데이터를 전송할 수 있다.
Port 상태
CLOSED → ESTABLISHED
(서버로부터 ACK
와 SYN
을 받고 난 후)SYN_RCV → ESTABLISHED
(클라이언트로부터 ACK
를 받고 난 후)정의
특징
1. Client → Server : FIN
클라이언트는 TCP 연결을 종료하겠다는 FIN
패킷을 보낸다.
FIN
패킷에 대한 응답을 보내기 전까지 연결을 계속 유지한다.2. Server → Client : ACK
서버는 클라이언트의 요청(FIN
)을 받고 확인을 알리는 ACK
패킷을 보낸다.
서버는 TCP header의 Acknowledgement Number 필드를 Sequence Number + 1로 지정하고
ACK Flag 필드를 1로 설정한 세그먼트를 클라이언트에게 전송한다.
그 후에 자신의 통신이 끝날 때까지 기다린다. (이 상태가 TIME_WAIT
상태이다.)
3. Server → Client : FIN
데이터를 모두 보내고 통신이 끝나면, 서버는 연결이 종료되었다는 의미로 FIN
패킷을 클라이언트에게 전송한다.
4. Client → Server : ACK
클라이언트는 서버의 응답(FIN
) 패킷을 확인했다는 의미로 ACK
패킷을 보낸다.
5. 서버는 클라이언트의 ACK
패킷을 받은 후 소켓 연결을 CLOSE 한다.
6. 클라이언트는 서버로부터 받지 못한 데이터가 있을 것을 대비하여,
일정시간동안 세션을 남겨놓고 잉여 패킷을 기다리는 과정을 거친다. (TIME_WAIT)