TCP 핸드셰이킹
TCP는 연결형 서비스를 지원하기 위해(신뢰성 있는 데이터를 송수신하기 위해) 송신자와 수신자 간 연결하는 과정을 거친다. 이때, 연결을 제어 및 관리하기 위해 아래와 같은 플래그 값을 주고받는다.
- SYN: Synchronization(동기화)의 약자로, 연결을 생성할 때 사용
- FIN: Finish(종료)의 약자로, 연결을 끊을 때 사용
- ACK: Acknowledgement(승인)의 약자로, 데이터를 전송하면 수신자가 받았음을 알려줄 때 사용
- RST: Reset(초기화)의 약자로, 연결을 재설정할 때 사용
- PSH: Push(밀다)의 약자로, 빠른 응답이 필요한 데이터를 응용 계층으로 즉시 전송할 때 사용
- URG: Urgent(긴급)의 약자로, 다른 데이터보다 우선순위가 높은 데이터를 전송할 때 사용
3-way Handshake
- 하는 이유: 데이터를 주고받기 전에 수신 측과 연결(세션)을 수립하는 과정으로, 이러한 과정을 거쳐 데이터를 주고받을 준비가 되었음을 보장한다.
순서 | 송신부 | FLAG | 수신부 | 설명 |
---|---|---|---|---|
1 | (SEQ: 10, ACK: 0) SYN_SENT |
— SYN → | ( ) | 클라이언트가 서버에 연결 요청을 보낸다. 초기 시퀀스 번호는 10이다. |
2 | (SEQ: 11, ACK: 0) SYN_SENT |
← SYN, ACK — | (SEQ: 100, ACK: 11) SYN_RECEIVED |
서버가 클라이언트의 요청을 수락하고 자신의 시퀀스 번호를 보낸다. ACK는 클라이언트의 다음 시퀀스 번호를 가리킨다. |
3 | (SEQ: 11, ACK: 101) ESTABLISHED |
— ACK → | (SEQ: 101, ACK: 11) | 클라이언트가 서버의 시퀀스를 인정하여 ACK를 보낸다. 연결이 설정된다. |
(SEQ: 11, ACK: 101) ESTABLISHED |
(SEQ: 101, ACK: 11) ESTABLISHED |
클라이언트와 서버 간의 연결이 확립된다. (연결 후 마지막 상태) |
데이터를 주고받는 과정 (HTTP)
순서 | 송신부 | FLAG | 수신부 | 설명 |
---|---|---|---|---|
1 | (SEQ: 11, ACK: 101) ESTABLISHED, 20 bytes |
— PSH, ACK → | (SEQ: 101, ACK: 11) ESTABLISHED |
클라이언트가 HTTP 요청 데이터를 20바이트 전송한다. |
2 | (SEQ: 31, ACK: 101) ESTABLISHED |
← ACK — | (SEQ: 101, ACK: 31) ESTABLISHED |
서버가 데이터 수신을 확인하고 ACK를 보낸다. |
3 | (SEQ: 31, ACK: 101) ESTABLISHED |
← PSH, ACK — | (SEQ: 101, ACK: 31) ESTABLISHED, 30 bytes |
서버가 HTTP 응답 데이터를 30바이트 전송한다. |
4 | (SEQ: 31, ACK: 131) ESTABLISHED |
— ACK → | (SEQ: 131, ACK: 31) ESTABLISHED |
클라이언트가 서버의 응답을 수신하고 ACK를 보낸다. |
(SEQ: 31, ACK: 131) ESTABLISHED |
(SEQ: 131, ACK: 31) ESTABLISHED |
데이터 전송이 완료된다. |
- ACK: 클라이언트가 서버에 데이터를 요청할 때 이전 데이터에 대한 ACK를 함께 보냄으로써 서버가 데이터를 잘 받았음을 확인시켜 준다.
- PSH: 클라이언트가 HTTP 요청 데이터를 보낼 때 PSH 플래그를 설정하여 서버가 데이터를 즉시 응용 계층으로 처리하도록 지시한다.
4-way Handshake
순서 | 송신부 | FLAG | 수신부 | 설명 |
---|---|---|---|---|
1 | (SEQ: 32, ACK: 131) FIN_WAIT_1 | — FIN → | (SEQ: 131, ACK: 31) ESTABLISHED | 클라이언트가 연결 종료를 요청하는 FIN을 보낸다. |
2 | (SEQ: 33, ACK: 131) FIN_WAIT_2 | ← ACK — | (SEQ: 131, ACK: 33) CLOSE_WAIT | 서버가 클라이언트의 FIN을 수신하고 ACK로 확인한다. |
3 | (SEQ: 33, ACK: 132) FIN_WAIT_2 | ← FIN — | (SEQ: 132, ACK: 33) LAST_ACK | 서버가 클라이언트에게 연결 종료를 알리는 FIN을 보낸다. |
4 | (SEQ: 33, ACK: 133) TIME_WAIT | — ACK → | (SEQ: 133, ACK: 33) CLOSED | 클라이언트가 서버의 FIN을 수신하고 ACK로 확인한다. 연결 종료가 완료된다. |
(SEQ: 33, ACK: 133) CLOSED | 클라이언트와 서버 간의 연결이 완전히 종료된다. |
- FIN: 연결을 종료하는 플래그이면서, 실제로 하나의 데이터 바이트로 취급되어 시퀀스 번호가 증가한다. 시퀀스 번호를 증가시켜 ACK가 FIN을 대상으로 하는지 명확히 하며, 실제로 TCP 페이로드에 바이트가 추가되지는 않는다.
결론
- 연결 설정(3-way Handshake): 클라이언트와 서버는 서로의 시퀀스 번호를 설정하고 확인함으로써 TCP 연결을 설정한다.
- 데이터 전송: 클라이언트와 서버는 설정된 연결을 통해 데이터를 주고받는다. 각 데이터 전송 후에는 수신 확인을 위한 ACK가 송수신된다.
- 연결 종료(4-way Handshake): 클라이언트와 서버는 각각 FIN 플래그를 통해 연결 종료 의사를 밝히고, 서로의 FIN에 대해 ACK를 보냄으로써 연결을 안전하게 종료한다.
이 과정을 통해 TCP는 신뢰성 있고 순서가 있는 데이터 전송과 연결 관리 기능을 제공한다.
'CS > 네트워크' 카테고리의 다른 글
HTTP 메서드(GET, POST, PUT, PATCH, DELETE ...)와 멱등성(Idempotent)에 대한 정리 (0) | 2024.08.06 |
---|---|
HTTPS와 TLS Handshake(TLS 1.3v과 이전 버전의 차이) (0) | 2024.08.05 |
HTTP vs HTTPS 가볍게 살펴보고, 대답해보기! (0) | 2024.08.02 |
TCP vs UDP (전송 계층과 '가상 회선 방식'을 덧붙인) (0) | 2024.08.01 |
웹 통신의 큰 흐름 이해하기(DNS조회는 어떻게 이뤄질까?) (0) | 2024.07.30 |
댓글