인프라/Network

[Network] TCP 3Way Handshake & 4Way Handshake 란?

copcat 2022. 1. 7. 13:44

TCP(Transmission Control Protocol) 은 연결 지향 프로토콜입니다.

또 데이터가 제대로 보내졌나 확인을 해서 신뢰성을 가지고 있습니다.

통신 하는 과정에서 "손흔들기"절차를 통해서 서로 통신하려는 둘 간의 연결을 제대로 확립시켜야 하는데,

이 과정을 "3-Way Handshake"이라 불리고,

연결을 종료하기 위해서도, 3 Way Handshake 처럼, 4 Way Handshaking이라는 과정을 거친다.


TCP 헤더는 다음과 같습니다.

 


 

헤더 부분 flags

📍 Flags 참고

SYN(Synchronize Sequence Number)
- 연결 설정
Sequence Number를 랜덤으로 설정하여 세션을 연결하는 데 사용하며, 초기에 Sequence Number를 전송한다.


ACK(Acknowledgement)
- 응답 확인
패킷을 받았다는 것을 의미한다.
Acknowledgement Number 필드가 유효한지를 나타낸다.
양단 프로세스가 쉬지 않고 데이터를 전송한다고 가정하면
최초 연결 설정 과정에서 전송되는 첫 번째 세그먼트를 제외한 모든 세그먼트의 ACK 비트는 1이라 생각할 수 있음


FIN(Finish)
- 연결 해제
세션 연결을 종료시킬 때 사용되며, 더 이상 전송할 데이터가 없음을 의미한다.

3-Way Handshake

예시

 

Three HandShake과정

TCP는 연결 지향적이라는 특성때문에 통신을 하는 응용 프로그램이 데이터를 전송하기 전에 먼저 정확한 전송을 보장하기 위해 상대방 컴퓨터와 사전에 세션을 수립하는 과정을 의미한다.


예를 들어, A 프로세스(Client)가 B 프로세스(Server)에 연결을 요청

  1. A -> B: SYN(최초 연결)
    1. 접속 요청 프로세스 A가 연결 요청 메시지 전송 (SYN)
    2. 송신자가 최초로 데이터를 전송할 때 Sequence Number를 임의의 랜덤 숫자로 지정하고, SYN 플래그 비트를 1로 설정한 세그먼트를 전송한다.
    3. PORT 상태 - B: LISTEN, A: CLOSED
  2. B -> A: SYN(최초연결) + ACK(응답)
    1. 접속 요청을 받은 프로세스 B가 요청을 수락했으며, 접속 요청 프로세스인 A도 포트를 열어 달라는 메시지 전송 (SYN + ACK)
    2. 수신자는 Acknowledgement Number 필드를 (Sequence Number + 1)로 지정하고, SYN과 ACK 플래그 비트를 1로 설정한 세그먼트를 전송한다.
    3. PORT 상태 - B: SYN_RCV, A: CLOSED
  3. A -> B: ACK
    1. PORT 상태 - B: SYN_RCV, A: ESTABLISHED
    2. 마지막으로 접속 요청 프로세스 A가 수락 확인을 보내 연결을 맺음 (ACK)
    3. 이때, 전송할 데이터가 있으면 이 단계에서 데이터를 전송할 수 있다.
    4. PORT 상태 - B: ESTABLISHED, A: ESTABLISHED

4Way Handshake

예시 

  1. A(cli)-> B(ser) : FIN+ACK (종료)
    1. 프로세스 A가 연결 해제 메시지 전송
    2. server가 받기를 기대하는 마지막 패킷 ACK 넘버를 sequence Number로 지정하고 FIN에는 전 패킷의 응답 ACK 넘버를 지정
    3. PORT 상태 -  A: FIN_WAIT1 , B: CLOSE_WAIT
  2. B -> A: ACK / ACK,FIN
    1. 맨처음에 FIN에 대한 응답코드 ACK( FIN sequence Number+1) 을 클라이언트쪽으로 전송 
    2. 그 후 FIN (client에서 준 ACK 을 sequence Number로 지정) 과 ACK(1단계에서 보냈던 sequence Number 지정) 전송
    3. PORT 상태 -  A: FIN_WAIT2, B: LASK_ACK 
  3. A -> B: ACK
    1. 마지막으로 A가 서버에서 온 FIN 에 대한 응답 ACK(FIN sequence Number +1)을 전송
    2. 이때, 클라이언트쪽에서 대기하다가 PORT 상태를 CLOSED로 바꾸면서 통신 종료 
    3. PORT 상태 - A:TIME_WAIT....->CLOSED B: CLOSED

참고https://mr-zero.tistory.com/36

반응형