(TCP) 3-Way Handshake 4-Way Handshake

이재원·2024년 2월 27일

3-Way Handshake

  • 3-way handshake는 TCP/IP 프로토콜에서 연결 지향적 통신을 시작하기 위해 사용되는 과정이다.
  • UDP에서는 사용되지 않으며, TCP 연결 설정 시에만 사용된다.\
  • 연결 초기화 과정

연결과정

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

1. SYN(동기화 요청)

  • 클라이언트가 서버로 SYN패킷을 보낸다. 이 패킷에는 클라이언트가 랜덤으로 생성한 초기 시퀀스 번호(Sequence Number)가 포함되어있다.
    • 이 단계에서 클라이언트는 연결을 시작하고자 함을 서버에 알린다.

    • A클라이언트는 SYN 을 보내고 SYN/ACK 응답을 기다리는SYN_SENT 상태가 된다.

2. SYN-ACK(동기화 및 승인 응답)

  • 서버는 클라이언트의 SYN 요청을 받고, SYN+ACK 패킷을 보낸다.
    • SYN 패킷에는 자신의 연결 요청을 위한 시퀀스 번호를 랜덤으로 생성해서 포함시켜 보내고
    • ACK 패킷에는 클라이언트가 보낸 SYN 패킷에 들어있는 시퀀스 번호시퀀스 번호(Sequence Number)에 +1을 한 값을 ACK 번호(acknowledgment number)로 설정하여 보낸다.
    • 서버는 SYN_RECEIVED 상태

3. ACK(승인)

  • 클라이언트는 서버의 SYN-ACK 패킷을 받고, 서버가 보낸 SYN-ACK 패킷의 SYN 패킷에 포함된 시퀀스 번호(Sequence Number)에 1을 더한 값을 자신의 ACK 번호(acknowledgment number)로 설정하여 ACK 패킷을 서버에게 보낸다.
    • 이 단계를 마지막으로 서버가 ACK 패킷을 받으면 양쪽 모두 연결이 성공적으로 설정된 것으로 간주하고 데이터 전송을 시작할 준비가 완료 된다.
      -이때 서버 상태는 ESTABLISHED.

  • SYN 패킷을 보낼 때 각자 랜덤으로 시퀀스 번호를 생성해서 보낸다.

    ex) 클라이언트가 최초에 보낸 SYN 패킷의 시퀀스 번호와는 별개로, 서버도 자신의 연결 초기 시퀀스 번호를 랜덤으로 생성하여 이를 SYN-ACK 패킷의 시퀀스 번호로 사용한다.
  • 시퀀스 번호(sequence number)를 사용하는 이유?

    • 각 연결을 유일하게 식별하는 데 도움을 준다.
      • 연결을 시작할 때 랜덤으로 생성된 시퀀스 번호를 사용함으로써, 이전 연결의 잔류 데이터 패킷과 혼동되는 것을 방지하고, 각 TCP 세션이 고유하게 유지될 수 있도록 한다.
    • TCP는 데이터가 전송된 순서대로 도착하도록 보장한다.
      • 시퀀스 번호를 사용함으로써 수신자는 수신한 패킷들을 올바른 순서로 재조립할 수 있다.
      • 패킷이 네트워크 상에서 순서가 바뀌거나 지연되어 도착하더라도, 시퀀스 번호를 통해 원래의 데이터 순서를 복원할 수 있다.
    • 시퀀스 번호를 통해 수신자는 누락된 패킷을 감지할 수 있다.
      • 만약 시퀀스 번호가 연속적이지 않은 패킷을 받는다면, 수신자는 중간에 패킷이 누락되었다는 것을 알 수 있고, 해당 데이터의 재전송을 요청할 수 있다.
    • 네트워크 상의 문제로 인해 같은 패킷이 여러 번 수신될 수 있다.
      • 시퀀스 번호를 통해 수신자는 이미 받은 패킷과 중복되는 패킷을 감지하고 필터링할 수 있다.

4-Way Handshake

  • 4-way handshake는 TCP 연결을 종료할 때 사용한다.
  • TCP는 신뢰할 수 있는 데이터 전송을 보장하는 연결 지향적 프로토콜이며, 연결을 안정적으로 종료하기 위해 4-way handshake 과정을 사용한다.

연결해제 과정

상태설명
FIN_WAIT1Close를 호출한 측의 소켓이 진입하는 상태, FIN 보냄
CLOSE_WAITClose를 받으면 CLOSE_WAIT 상태로 진입함, Ack 보냄
FIN_WAIT2Ack 신호를 받은 소켓은 FIN_WAIT1 > FIN_WAIT2로 상태 변경됨
LAST_WAITClose 호출 후 진입하는 상태, FIN 보냄
TIME_WAITClose를 받으면 진입하는 상태, ACK 보냄
CLOSED연결 종료

1. FIN from Client

  • 클라이언트가 연결을 종료하고자 할 때, 클라이언트는 FIN (finish) 플래그가 설정된 패킷을 서버에게 보낸 후 클라이언트는 FIN_WAIT1 상태가 된다.
    • FIN 패킷에는 현재 클라이언트의 시퀀스 번호가 포함된다.
    • 클라이언트가 더 이상 보낼 데이터가 없음을 의미한다.

2. ACK from Server)

  • 서버가 클라이언트로부터 FIN 패킷을 받으면, 서버는 ACK (acknowledgment) 플래그가 설정된 패킷을 클라이언트에게 보내, 클라이언트의 종료 요청을 받았음을 알려준다. 서버는 CLOSE_WAIT 상태가 된다.
    • FIN 패킷에 들어있는 시퀀스 번호에 +1을 해서 ACK 패킷을 보낸다
    • 이 시점에서, 서버는 클라이언트에게 모든 남아 있는 데이터를 전송하기 위해 여전히 연결을 열어 둔다.

3. FIN from Server

  • 서버가 클라이언트에게 모든 데이터를 전송하고, 서버 측에서도 연결을 종료할 준비가 되면, 서버는 FIN 플래그가 설정된 패킷을 클라이언트에게 보낸다. 서버는 CLOSE_WAIT상태에서 LAST_WAIT상태로 변경된다.
    • 현재 서버의 시퀀스 번호가 포함된 FIN 패킷을 보내 연결 종료를 요청한다.
    • 서버 측에서도 더 이상 보낼 데이터가 없음을 클라이언트에게 알린다.

4. ACK from Client

  • 클라이언트가 서버로부터 FIN 패킷을 받으면, 클라이언트는 마지막으로 ACK 패킷을 서버에게 보내 연결 종료를 확정짓는다. 클라이언트는 TIME_WAIT상태가 된다.
    • 이 ACK 패킷에는 FIN 패킷의 시퀀스 번호 + 1이 확인 응답 번호로 설정
    • ACK 패킷이 서버에 도달한 후, 연결은 완전히 종료되며 양측은 더 이상의 데이터 전송 없이 연결을 닫는다.

  • 3-way handshake와 4-way handshake는 TCP 연결의 성립과 종료 과정에 사용되는 프로토콜로, 일반적으로 클라이언트가 시작하는 것이 일반적이다.
  • 그러나, "클라이언트"와 "서버"의 역할은 연결을 시작하는 쪽과 받는 쪽의 관점에서 정의된다. 여기서 중요한 점은 연결을 시작하고 종료하려는 의도를 가진 측이 이러한 과정을 시작한다는 점이다.
  • TCP (Transmission Control Protocol)에서 패킷을 보낼 때, 각 패킷은 TCP 헤더를 포함하고 있다.

TCP 헤더 구성요소

  • 소스 포트(Source Port): 송신자의 포트 번호.
  • 목적지 포트(Destination Port): 수신자의 포트 번호.
  • 시퀀스 번호(Sequence Number): 세그먼트의 데이터가 속하는 순서를 식별하는 번호.
  • 확인 응답 번호(Acknowledgment Number): 수신자가 다음에 기대하는 시퀀스 번호.
  • 데이터 오프셋(Data Offset): TCP 헤더의 길이를 나타내며, 데이터가 시작되는 위치를 결정.
  • 예약(Reserved): 사용되지 않으며, 향후 사용을 위해 예약되어 있다.
  • 플래그(Flags): 연결 설정, 관리, 종료를 제어하는 여러 제어 플래그들.
  • 윈도우 크기(Window Size): 수신자가 현재 받을 수 있는 데이터의 양(윈도우)을 나타낸다.
  • 체크섬(Checksum): 에러 검출을 위한 필드.
  • 긴급 포인터(Urgent Pointer): 긴급 데이터의 끝을 가리키며, URG 플래그가 설정되었을 때만 유효하다.
  • 옵션(Options): 연결 설정 시 필요한 추가 정보를 제공합니다. 옵션은 선택적이며, 길이는 가변적이다.
FLAG설명
SYN ) 000010
(연결 요청 플래그)
TCP에서 세션을 성립할 때 가장 먼저 보내는 패킷
시퀀스 번호를 임의적으로 설정하여 세션을 연결하는 데 사용되며 초기에 시퀀스 번호를 보내게 된다.
ACK ) 010000
(응답플래그)
상대방으로부터 패킷을 받았다는 것을 알려주는 패킷. 다른 플래그와 같이 출력되는 경우도 있다.
받는 사람이 보낸 사람 시퀀스 번호에 TCP 계층에서 길이 또는 데이터 양을 더한 것과 같은 ACK를 보낸다
(일반적으로 +1 하여 보냄).
ACK 응답을 통해 보낸 패킷에 대한 성공, 실패를 판단하여 재전송 하거나 다음 패킷을 전송한다.
FIN ) 000001
(연결종료 플래그)
세션 연결을 종료시킬 때 사용되며 더 이상 전송할 데이터가 없음을 나타냅니다.
RST ) 000100
(연결 재설정 플래그)
재설정(Reset)을 하는 과정이며 양방향에서 동시에 일어나는 중단 작업.
비정상적인 세션 연결 끊기에 해당하며, 이 패킷을 보내는 곳이 현재 접속하고 있는 곳과 즉시 연결을 끊고자 할 때 사용.
PSH ) 001000
(밀어넣기)
TELNET과 같은 상호작용이 중요한 프로토콜의 경우 빠른 응답이 중요하다,
이 때 받은 데이터를 즉시 목적지인 OSI 7 Layer 의 Application 계층으로 전송하도록 하는 FLAG이다.
대화형 트래픽에 사용되며, 버퍼가 채워지기를 기다리지 않고 데이터를 전달한다.
데이터는 버퍼링 없이 바로 7 계층의 응용프로그램으로 바로 전달한다.
URG ) 100000
(긴급 데이터 플래그)
Urgent pointer가 유효한 것인지를 나타낸다.
Urgent pointer란 전송하는 데이터 중에서 긴급히 전달해야 할 내용이 있을 경우에 사용한다.
긴급한 데이터는 다른 데이터에 비해 우선순위가 높아야 한다. 예: ping 명령어 실행 도중 Ctrl+c 입력
  • TCP 헤더 내의 플래그 필드는 여러 제어 플래그를 포함하기 위해 6비트를 사용한다.

출처
https://sh-safer.tistory.com/142

profile
최고가 되기 위한 여정

0개의 댓글