[CS] TCP 3 &4 way handshake

→ 3-Way Handshake 는 TCP의 접속, 4-Way Handshake는 TCP의 접속 해제 과정

→ 서버와 클라이언드 모두 연결 요청을 먼저할 수 있기 때문에, 연결 요청을 먼저 시도한 요청자를 Client로, 연결 요청을 받은 수신자를 Server 쪽으로 생각하면 됨

  1. 용어 정리
    1. 포트(PORT) 상태 정보
      1. CLOSED : 포트가 닫힌 상태
      2. LISTEN : 포트가 열린 상태로 연결 요청 대기 중
      3. SYN_RCV : SYNC 요청을 받고 상대방의 응답을 기다리는 중
      4. ESTABLISHED : 포트 연결 상태
    2. 플래그 정보
      1. TCP Header에는 CONTROL BIT(플래그 비트, 6bit)가 존재하며, 각각의 bit는 “URG-ACK-PSH-RST-SYN-FIN”의 의미를 가짐
      2. 즉, 해당 위치의 bit가 1이면 해당 패킷이 어떠한 내용을 담고 있는 패킷인지를 나타냄
      3. SYN(Synchronize Sequence Number) / 000010
      4. 연결 설정. Sequence Number를 랜덤으로 설정하여 세션을 연결하는 데 사용하며, 초기에 Sequence Number를 전송
      5. ACK(Acknowledgement)/ 010000
      6. 응답 확인. 패킷을 받았다는 것을 의미
      7. Acknowledgement Number 필드가 유효한지를 나타냄
      8. 양단 프로세스가 쉬지 않고 데이터를 전송한다고 가정하면 최초 연결 설정 과정에서 전송되는 첫 번째 세그먼트를 제외한 모든 세그먼트의 ACK 비트는 1로 지정된다고 생각할 수 있음
      9. FIN(Finish) / 000001
      10. 연결 해제. 세션 연결을 종료시킬 때 사용되며, 더 이상 전송할 데이터가 없음을 의미
  2. 3-way handshake : 연결 성립
    1. 개념
      1. TCP는 안정적이고 연결지향적인 트랜스포트 계층용 프로토콜로써, 연결 세션 설정을 위해 3단계의 핸드셰이킹 과정을 밟음
      2. TCP/IP 프로토콜을 이용해서 통신을 하는 응용 프로그램이 데이터를 전송하기 전에 먼저 정확한 전송을 보장하기 위해 상대방 컴퓨터와 사전에 세션을 수립하는 과정을 의미
      • TCP 통신은 PAR (Positive Acknowledgement with Re-transmission)을 통해 신뢰적인 통신을 제공
      • PAR을 사용하는 기기는 ack을 받을 때까지 데이터 유닛을 재전송
      • 수신자가 데이터 유닛(세그먼트)이 손상된 것을 확인하면(전송 계층의 checksum을 활용), 해당 세그먼트를 없애면 sender는 positive ack이 오지 않은 데이터 유닛을 다시 보내야 함
      • 이 과정에서 클라이언트와 서버 사이에서 3개의 세그먼트가 교환되는 것을 확인할 수 있는데, 이것이 3-way handshake의 기본 메커니즘임기본 매커니즘
    2. 작동 방식
      1. 클라이언트는 서버와 연결하기 위해 3-way handshake를 통해 연결 요청을 함
      2. SYN (Synchronization) : 연결요청, 세션을 설정하는데 사용되며 초기에 시퀀스 번호를 보냄
      3. ACK (Acknowledgement) : 보낸 시퀀스 번호에 TCP 계층에서의 길이 또는 양을 더한 것과 같은 값을 ACK에 포함하여 전송

- STEP 1 :: SYN
  - 클라이언트는 서버와 커넥션을 연결하기 위해 SYN을 보냄 (seq : x)
  - 송신자가 최초로 데이터를 전송할 때 Sequence Number를 임의의 랜덤 숫자로 지정하고, SYN 플래그 비트를 1로 설정한 세그먼트를 전송
  - PORT 상태
    - Client : CLOSED - SYN_SENT 로 변함
    - SERVER : LISTEN
- STEP 2 :: SYN+ACK
  - 서버가 SYN(x)을 받고, 클라이언트로 받았다는 신호인 ACK와 SYN 패킷을 보냄 (seq : y, ACK : x+1)
  - 접속 요청을 받은 Q가 요청을 수락했으며, 접속 요청 프로세스인 P도 포트를 열어달라는 메세지를 전송 (SYN-ACK signal bits set)
  - ACK Number필드를 Sequence Number +1로 지정하고 SYN과 ACK 플래그 비트를 1로 설정한 세그먼트 전송 (Seq = y, ACK = x+1, SYN, ACK)
  - PORT 상태
    - Client : CLOSED
    - Server : SYN_RCV
- STEP 3 :: ACK
  - 클라이언트는 서버의 응답인 ACK(x+1)와 SYN(y) 패킷을 받고, ACK(y+1)를 서버로 보냄
  - 마지막으로 접속 요청 프로세스 P가 수락 확인을 보내 연결을 맺음 (ACK)
  - 이때, 전송할 데이터가 있으면 이 단계에서 데이터를 전송할 수 있음
  - PORT 상태
    - Client : ESTABLISHED
    - Server : SYN_RCV ⇒ ACK> ESTABLISHED
  1. 4-way handshake : 연결 해제
    1. 개념 : FIN 플래그를 이용하여 연결을 해제하는 과정
    2. Termination의 종류
      1. Graceful connection release (정상적인 연결 해제)
      2. 양 쪽의 커넥션이 서로 모든 커넥션을 닫을 때까지 연결되어 있음
      3. Abrupt connection release (갑작스런 연결 해제)
      4. 갑자기 한 TCP 엔티티가 연결을 강제로 닫는 경우
      5. 한 사용자가 두 데이터 전송 방향을 모두 닫는 경우
    3. 작동방식 (Abrupt)
      1. RST (TCP reset) 세그먼트가 전송되면 갑작스러운 연결 해제가 수행되는데, RST 세그먼트는 다음과 같은 경우에 전송
      2. 존재하지 않는 TCP 연결에 대해 비SYN 세그먼트가 수신된 경우
      3. 열린 커넥션에서 일부 TCP 구현은 잘못된 헤더가 있는 세그먼트가 수신된 경우
        • RST 세그먼트를 보내, 해당 커넥션을 닫아 공격을 방지
      4. 일부 구현에서 기존 TCP 연결을 종료해야 하는 경우
        • 연결을 지원하는 리소스가 부족할 때
        • 원격 호스트에 연결할 수 없고 응답이 중지되었을 때
    4. 작동방식 (Graceful)
      • STEP 1 (Client → Server : FIN(+ACK))
      • 서버와 클라이언트가 연결된 상태에서 클라이언트가 close()를 호출하여 접속을 끊는다.(or 끊으려 함)
      • 이 때, 클라이언트는 서버에게 연결을 종료한다는 FIN 플래그를 보냄
        • 이 때, FIN 패킷에는 실질적으로 ACK도 포함되어 있음
      • STEP 2 (Server → Client : ACK)
      • 서버는 FIN을 받고, 확인했다는 ACK를 클라이언트에게 보내고 자신의 통신이 끝날대까지 기다림 (TIME_WAIT 상태)
        • 서버(수신자)는 ACK Number 필드를 (Sequence Number +1)로 지정하고, ACK 플래그 비트를 1로 설정한 세그먼트를 전송
      • 서버는 클라이언트에게 응답을 보내고 CLOSE_WAIT 상태로 들어가며, 아직 남은 데이터가 있다면 마저 전송을 마친 후에 close()를 호출
      • 클라이언트에서는 서버에서 ACK를 받은 후에 서버가 남은 데이터 처리를 끝내고 FIN 패킷을 보낼 때까지 기다리게 됨
      • STEP 3 (Server → Client : FIN)
      • 데이터를 모두 보냈다면, 서버는 연결의 종료에 합의 한다는 의미로 FIN 패킷을 클라이언트에게 보낸 후에, 승인 번호를 보내줄 때까지 기다리는 LAST_ACK 상태로 들어감
      • STEP 4 (Client → Server : ACK)
      • 클라이언트는 FIN을 받고, 확인했다는 ACK를 서버에게 보냄
      • 아직 서버로부터 받지 못한 데이터가 있을 수 있으므로 TIME_WAIT을 통해 기다림 (실질적인 종료과정 CLOSED에 들어가게 됨)
        • 이 때 TIME_WAIT 상태는 의도치 않은 에러로 인해 연결이 데드락으로 빠지는 것을 방지
        • 만약 에러로 인해 종료가 지연되다가 타임이 초과되면 CLOSED로 들어감
      • 서버는 ACK를 받은 이후 소켓을 닫음
      • TIME_WAIT 시간이 끝나면 클라이언트도 닫음

'CS > Network' 카테고리의 다른 글

[CS] HTTP & HTTPS  (0) 2024.01.26
[CS] 대칭키 & 공개키  (1) 2023.11.29
[CS] UDP  (0) 2023.11.29
[CS] TCP/IP 흐름제어 & 혼잡제어  (1) 2023.11.29
[CS] OSI 7계층  (0) 2023.10.24