Network

'TCP 3-way-handshake & 4-way-handshake'는 무엇일까?

woo0doo 2023. 1. 13. 00:39

TCP란?

TCP는 네트워크 계층 중 전송 계층에서 사용하는 프로토콜 중 하나로, 신뢰성을 보장하는 연결형 서비스이다.

TCP 특징

  • 전송되는 데이터의 신뢰성 보장 (흐름 제어, 혼잡 제어, 오류 제어)
  • 파일전송에 주로 사용
  • 가상 회선을 만들어 신뢰성을 보장

※ TCP가 가상회선 방식을 제공한다는 것은 발신지와 수신지를 연결하여 패킷을 전송하기 위한 논리적 경로를 배정한다는 말이다.

 


3-way-handshake

연결하고자 하는 두 장치 간의 논리적 접속을 성립하기 위해 사용하는 연결 확인 방식으로, 3번의 확인 과정을 거친다고 해서 3 way handshake라고 부른다.

 

TCP 3-way-handshake를 간단히 표현하면 다음과 같다.

  1. Client -> Server : 내 말 들려?
  2. Server -> Client : 잘 들려. 내 말은 들려?
  3. Client -> Server : 잘 들려!

SYN (synchronize sequence numbers) - 연결 확인을 위해 보내는 무작위의 숫자값 (내 말 잘 들려?)

 

ACK (acknowledgements) - Client 혹은 Server로부터 받은 SYN에 1을 더해 SYN을 잘 받았다는 ACK (잘 들려)

 

이를 적용하면 

 

A  프로세스(client)가 B 프로세스(Server)에 연결을 요청

1. A(CLOSED) -> B(LISTEN) : SYN(a)

  • 프로세스 A가 연결 요청 메시지 전송 (SYN)
  • 이 때 sequence number를 임의의 랜덤 숫자 a로 지정하고, SYN 플래그 비트를 1로 설정한 segment를 전송한다.

 

 

2. B(SYN_RCV) -> A(CLOSED) : ACK(a+1), SYN(b)

  • 연결 요청 메시지를 받은 프로세스 B는 요청을 수락(ACK)했으며, 요청한 A 프로세스도 포트를 열어달라(SYN)는 메시지 전송
  • 받은 메시지에 대한 수락에 대해서는 ACK number를 SYN number + 1 로 지정하여 표현한다. 그리고 SYN과 ACK 플래그 비트를 1로 설정한 segment를 전송한다.

 

 

3. A(ESTABLISHED)  -> B(SYN_RCV): ACK(b+1)

  • 마지막으로 프로세스 A가 수락 확인을 보내 연결을 맺음 (ACK)
  • 이 떄, 전송할 데이터가 있으면 이 단계에서 데이터를 전송할 수 있다.

 

  ㅇ SYN (Synchronize)  [연결시작,회선개설 용도]
     - TCP 연결설정 초기화를 위한 순서번호의 동기화  ☞ TCP 연결 설정
        . 연결요청  : SYN=1, ACK=0   (SYN 세그먼트)
        . 연결허락  : SYN=1, ACK=1   (SYN+ACK 세그먼트)
        . 연결설정  : ACK=1          (ACK 세그먼트)
ㅇ ACK (Acknowledgement)
     - 확인응답 필드에 확인응답번호(Acknowledgement Number) 값이 셋팅됐음을 알림
        . 1로 셋팅되면, 확인번호 유효함을 뜻함
        . 0로 셋팅되면, 확인번호 미포함 (즉, 32 비트 크기의 확인응답번호 필드 무시됨)
     - SYN 세그먼트 전송 이후(TCP 연결 시작후) 모든 세그먼트에는 항상 이 비트가 1로 셋팅됨

상태                                         설명

CLOSED 연결 수립을 시작하기 전의 기본 상태 (연결 없음)
LISTEN 포트가 열린 상태로 연결 요청 대기 중
SYN-SENT SYN 요청을 한 상태
SYN-RECEIVED SYN 요청을 받고 상대방의 응답을 기다리는 중
ESTABLISHED 연결의 수립이 완료된 상태, 서로 데이터를 교환할 수 있다.

 

 

즉 이 예시의 최종 PORT 상태 : A-ESTABLISHED, B-ESTABLISHED (연결 수립)

 

  • Client가 연결하고자 하는 Server에게 seq port (2915269997) 전송
  • Server가 해당 seq pory를 받고 해당 숫자에 1을 더한 ack port (2915269998) + Client의 연결을 확인하고자 하는 seq port (1458477026) 전송
  • Client가 Server의 seq port를 받고 해당 숫자에 1을 더한 ack port (1458477027)을 Server에 전송

 

TCP 4-way-handshake

 

3 way handshake와 반대로 가상 회선 연결을 해제할 때 주고 받는 확인작업이다. 이 역시 4번의 확인과정을 거친다고 하여 4 way handshake라고 부른다.

 

TCP 4 way handshake를 간단히 표현하면 다음과 같다.

  • A -> B: 나는 다 보냈어. 이제 끊자!
  • B -> A: 알겠어! 잠시만~
  • B -> A: 나도 끊을게!
  • A -> B: 알겠어!

FIN (Finish) - TCP 연결을 종료하겠다는 메시지

 

A  프로세스(client)가 B 프로세스(Server)에 연결 해제를 요청

1. A(ESTABLISHED) -> B(ESTABLISHED) : FIN

  • 프로세스 A가 연결을 종료하겠다는 FIN 플래그를 전송
  • 프로세스 B가 FIN 플래그로 응답하기 전까지 연결을 계속 유지

 

 

2. B(CLOSE_WAIT) -> A(FIN_WAIT_1) : ACK

  • 프로세스 B는 일단 확인 메시지(ACK)를 보내고 자신의 통신이 끝날 때까지 기다린다.
  • ACK Number를 SYN Number +1로 지정하고, ACK 플래그 비트를 1로 설정한 segment를 전송한다.
  • 그리고 자신이 전송할 데이터가 남아있다면 이어서 계속 전송한다. (클라이언트 쪽에서도 아직 서버로부터 받지 못한 데이터가 있을 것을 대비해 일정 시간동안 세션을 남겨놓고 패킷을 기다린다. 이를 TIME_WAIT 상태라고 한다.)

 

 

3. B(CLOSE_WAIT) -> A(FIN_WAIT_2) : FIN

  • 프로세스 B의 통신이 끝나면 이제 연결 종료해도 괜찮다는 의미로 프로세스 A에게 FIN 플래그를 전송한다.

 

 

4. A(TIME_WAIT) -> B(LAST_ACK) : ACK

  • 프로세스 A는 FIN 메시지를 확인했다는 메시지를 전송 (ACK)
  • 프로세스 A로부터 ACK 메시지를 받은 프로세스 B는 소켓 연결을 해제한다.

 

 

 

상태                 설명

CLOSE 연결 수립을 시작하기 전의 기본 상태 (연결 없음)
ESTABLISHED 연결의 수립이 완료된 상태, 서로 데이터를 교환할 수 있다.
CLOSE-WAIT 상대방의 FIN(종료 요청)을 받은 상태. 상대방 FIN에 대한 ACK를 보내고 애플리케이션에 종료를 알린다.
LAST-ACK CLOSE-WAIT 상태를 처리 후 자신의 FIN요청을 보낸 후 FIN에 대한 ACK를 기다리는 상태.
FIN-WAIT-1 자신이 보낸 FIN에 대한 ACK를 기다리거나 상대방의 FIN을 기다린다.
FIN-WAIT-2 자신이 보낸 FIN에 대한 ACK를 받았고 상대방의 FIN을 기다린다.
CLOSING 상대방의 FIN에 ACK를 보냈지만 자신의 FIN에 대한 ACK를 못받은 상태
TIME-WAIT 모든 FIN에 대한 ACK를 받고 연결 종료가 완료된 상태. 새 연결과 겹치지 않도록 일정 시간 동안 기다린 후 CLOSED로 전이한다.

 

 

 

즉 이 예시의 최종 PORT 상태 : A-CLOSED, B-CLOSED(연결 해제)

 

 

 

 

참고:

https://github.com/Seogeurim/CS-study/tree/main/contents/network

https://seongonion.tistory.com/74