CS/네트워크

TCP의 Handshake에 대해 알아보자(3-way, 4-way, data 전송)

개발자 May 2024. 8. 2.

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
클라이언트와 서버 간의 연결이 확립된다. (연결 후 마지막 상태)

3-way handshake

데이터를 주고받는 과정 (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 플래그를 설정하여 서버가 데이터를 즉시 응용 계층으로 처리하도록 지시한다.

HTTP 데이터 통신

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 페이로드에 바이트가 추가되지는 않는다.

4-way handshake

결론

  1. 연결 설정(3-way Handshake): 클라이언트와 서버는 서로의 시퀀스 번호를 설정하고 확인함으로써 TCP 연결을 설정한다.
  2. 데이터 전송: 클라이언트와 서버는 설정된 연결을 통해 데이터를 주고받는다. 각 데이터 전송 후에는 수신 확인을 위한 ACK가 송수신된다.
  3. 연결 종료(4-way Handshake): 클라이언트와 서버는 각각 FIN 플래그를 통해 연결 종료 의사를 밝히고, 서로의 FIN에 대해 ACK를 보냄으로써 연결을 안전하게 종료한다.

이 과정을 통해 TCP는 신뢰성 있고 순서가 있는 데이터 전송과 연결 관리 기능을 제공한다.

댓글