[네트워크] TCP 3, 4 way handshake

hyyyynjn·2021년 9월 8일
0

면접대비

목록 보기
8/31
post-thumbnail

Q. TCP 3, 4 way handshake에 대해서 설명해보세요

TCP 3 way handshake는 가상회선을 수립하는 단계이다.
클라이언트는 서버에 요청을 전송할 수 있는지, 서버는 클라이언트에게 응답을 전송할 수 있는지 확인하는 과정이다. SYN, ACK 패킷을 주고받으며, 임의의 난수로 SYN 플래그를 전송하고 ACK 플래그에 1을 더한 값을 전송한다.
SYN (n) ⇒ ACK (n+1), SYN(m) ⇒ ACK (m+1) 순서로 일어난다.
TCP 4 way handshake는 TCP 연결을 해제하는 단계이다.
클라이언트는 서버에게 연결해제를 통지하고 서버가 이를 확인하여 클라이언트에게 이를 받았음을 알리는 패킷을 전송하여 연결이 해제된다. 이때 서버는 클라이언트에게 소켓이 닫혔다고 통지해도 클라이언트 측에서 일정시간 대기한다. 그 이유는 통지 패킷이 나중에 도착할 수 있기 때문이다.


✅ TCP header

TCP header에는 Code bit (Flag bit)라는 부분이 있다.
이 부분은 6bit로 이뤄져있고 각각의 bit가 의미를 지닌다.
Urg-Ack-Psh-Rsh-Syn-Fin 순서로 되어있으며 해당 위치의 비트가 1이면 해당 패킷이 어떤 내용을 담는 패킷인지 나타낸다.
(SYN 패킷인 경우 000010, ACK 패킷인 경우 010000)

  • 혼잡 제어 기능 향상을 위해 Reserved 필드를 사용하여 6개의 플래그에서 NS, CWR, ECE 플래그가 추가되었다.

TCP Header 안의 플래그 정보

  • SYN : Synchronize Sqeunce Number
    • 연결 설정의 의미를 지닌다. 000010
    • Sequence Number를 난수로 설정하여 세션을 연결하는데 사용하고, 초기의 Sequence Number인 ISN을 전송한다.
  • ACK : Acknowledgement
    • 응답 확인의 의미를 지닌다. (패킷을 받았음을 의미한다) 010000
    • Acknowledgement Number 필드가 유효한지를 나타낸다.
    • 양단 프로세스가 쉬지 않고 데이터를 전송한다면,
      최초 연결 설정 과정에서 전송되는 첫번째 세그먼트를 제외하고 모든 세그먼트의 ACK 비트는 1로 지정된다고 생각할 수 있다.
  • FIN : Finish
    • 연결 해제의 의미를 지닌다. (더 이상 전송할 데이터가 없음을 의미한다) 000001
    • 세션 연결을 종료시킬 때 사용된다.

✅ 3 way handshake

연결 성립(Connection Establish)을 위한 3 way handshake 과정

  • 1. Client ⇒ Server : SYN
    클라이언트는 서버에 접속을 요청하는 SYN(a) 패킷을 보낸다.
    • 클라이언트가 최초로 데이터를 전송할 때,
      TCP header의 Sequence Number 필드임의의 랜덤 숫자로 지정하고
      SYN 플래그 비트1로 설정한 세그먼트를 전송한다.
    • Port 상태
      • Client : CLOSED
      • Server : LISTEN ⇒ SYN_RCV (클라이언트로부터 SYN을 받고 난 후)
  • 2. Server ⇒ Client : SYN + ACK
    서버는 클라이언트의 요청 (SYN(a))을 받고 요청을 수락한다는 의미의 패킷인 ACK(a+1)
    클라이언트와 연결을 요청하는 SYN(b)을 발송한다.
    • 서버는 TCP header의 ACK Number 필드Sequence Number + 1로 지정하고,
      SYN과 ACK 플래그 비트1로 설정한 세그먼트를 전송한다.
    • Port 상태
      • Client : CLOSED
      • Server : SYN_RCV
  • 3. Client ⇒ Server : ACK
    클라이언트는 서버의 수락 응답(ACK(a+1)SYN(b))을 받고
    ACK(b+1)을 서버로 보내면 연결이 성립(establish)된다.
    • 전송할 데이터가 있으면 이 단계에서 데이터를 전송할 수 있다.
    • Port 상태
      • Client : CLOSED ⇒ ESTABLISHED (서버로부터 ACKSYN을 받고 난 후)
      • Server : SYN_RCV ⇒ ESTABLISHED (클라이언트로부터 ACK를 받고 난 후)

✅ 4 way handshake

연결 해제(Connection Termination)를 위한 4 way handshake 과정

  • 1. Client ⇒ Server : FIN
    클라이언트는 TCP 연결을 종료하겠다는 FIN 플래그를 전송한다.
    • 서버가 FIN 플래그로 응답하기 전까지 연결을 계속 유지한다.
  • 2. Server ⇒ Client : ACK
    서버는 클라이언트의 요청(FIN)을 받고 확인을 알리는 ACK 패킷을 보낸다.
    • 서버는 ACK Number 필드를 Sequence Number + 1로 설정하고
      ACK 플래그 비트를 1로 설정한 세그먼트를 클라이언트에게 전송한다.
    • 그 후에 자신의 통신이 끝날 때까지 기다린다. (이 상태가 TIME_WAIT 상태이다)
      • 서버가 아직 전송할 데이터가 남아있다면 이어서 계속 전송한다.
  • 3. Server ⇒ Client : FIN
    데이터를 모두 보내고 통신이 끝나면 서버는 연결이 종료되었다는 의미로 FIN 플래그를 클라이언트에게 전송한다.
  • 4. Client ⇒ Server : ACK
    클라이언트는 서버의 응답(FIN) 패킷을 확인했다는 의미로 ACK 패킷을 보낸다.
    1. 서버는 클라이언트의 ACK 패킷을 받은 후 소켓 연결을 CLOSE 한다.
    1. 클라이언트는 서버로부터 받지 못한 데이터가 있을 것을 대비하여
      일정 시간동안 세션을 남겨놓고 잉여 패킷을 기다리는 과정을 거친다. (TIME_WAIT)

✅ 추가 질문

왜 두 종류의 패킷을 사용할까?

연결을 성립하려면 서로 통신이 가능한 상태인지 확인하기 위해 패킷을 주고 받아야한다.
하지만 왜 두 종류의 패킷을 주고 받을까?
요청응답에 대한 패킷을 주고 받아야 하기 때문이다.

2 way가 아닌 3 way 인 이유?

  1. 일단 클라이언트는 자신의 목소리가 들리는지 물어본다 👉 SYN
  2. 서버는 클라이언트의 목소리가 들린다고 말한다 👉 SYN + 1
    그리고 서버 자신의 목소리가 들리는지 물어본다 👉 ACK
  3. 클라이언트는 서버의 목소리가 들린다고 말한다 👉 ACK + 1
    총 3 번의 신호를 주고받아 TCP connection이 establish된다.

TCP connection은 양방향성 connection이다.
클라이언트는 서버에게 자신의 존재를 알리고 패킷을 보낼 수 있다는 것을 알리듯
서버도 클라이언트에게 자신의 존재와 함께 패킷을 보낼 수 있다는 신호를 보내야한다.

그렇기 때문에 2 way handshake로는 부족하다.

왜 클라이언트는 임의의 난수로 설정된 SYN 플래그를 보낼까?

처음 클라이언트에서 SYN 패킷을 서버로 보낼 때, Sequence Number에는 랜덤한 숫자가 담긴다.
초기에 담긴 Sequence Number를 ISN이라고 한다.
ISN이 0부터 시작하지 않고 랜덤한 수로 설정하는 이유가 뭘까?

TCP connection을 맺을 때 사용하는 port는 유한 범위에서 사용되고 시간이 지나면 재사용된다.
이 말은 곧, 두 통신 host가 과거에 사용된 port 번호 쌍을 사용할 수 있는 가능성이 존재한다는 의미다.
서버 측에서 클라이언트 패킷의 SYN을 보고 패킷을 구분하는데, 만약 난수가 아닌 순차적인 Sequence Number가 전송된다면 이전의 connection으로부터 오는 패킷으로 인식할 수 있다.
이러한 문제가 발생할 가능성을 줄이기 위해 ISN을 난수로 설정하는 것이다.

0개의 댓글