TCP 3 & 4 way handshake

이유석·2022년 4월 27일
0

CS - Network

목록 보기
3/8
post-thumbnail

TCP Header

  • TCP header에는 Code bit (Flag bit)라는 부분이 있다. (빨간 테두리 박스)
    이 부분은 6bit로 이뤄져 있고 각각의 bit가 의미를 갖는다.

  • URG - ACK - PSH - RST - SYN - FIN 의 순서로 되어있다.
    (혼잡제어 기능 향상을 위해 Reserved 필드를 사용하여 6개의 Flag에서 NS, CWR, ECE Flag가 추가)

  • 해당 위치의 비트가 1이면 해당 패킷이 어떤 내용을 담고있는 패킷인지 나타낸다.
    ex) SYN 패킷인 경우 000010, ACK 패킷인 경우 010000


3 way handshake - 연결 성립

정의

  • TCP는 정확한 전송을 보장해야한다.
    따라서 통신하기에 앞서, 논리적인 접속을 성립하디 위해 가상회선을 수립하는 단계이다.
  • 클라이언트는 서버에 요청을 전송할 수 있는지, 서버는 클라이언트에게 응답을 전송할 수 있는지 확인하는 단계이다.

3 way handshake 과정

  • 1. Client → Server : SYN
    클라이언트는 서버에 접속을 요청하는 SYN(a) 패킷을 보낸다.

    • 클라이언트가 최초로 데이터를 전송할 때,
      TCP header의 Sequence Number 필드를 임의의 랜던 숫자로 지정하고
      SYN Flag 필드를 1로 설정한 세그먼트를 전송한다.

    • Port 상태

      • Client : CLOSED
      • Server : LISTEN → SYN_RCV (클라이언트로부터 SYN을 받고 난 후)
  • 2. Server → Client : SYN + ACK
    서버는 클라이언트의 요청 (SYN(a))을 받은 후,
    ACK(a+1) : 요청을 수락한다는 의미 + SYN(b) : 클라이언트와 연결을 요청 을 발송한다.

    • 서버는 TCP header의 Acknowledgement Number 필드를 Sequence Number + 1로 지정하고
      SYN Flag 와 ACK Flag 필드를 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 - 연결 해제

정의

  • 연결 성립 후, 모든 통신이 끝났다면 해제해야 한다.
  • 클라이언트는 서버에게 연결해제를 통지하고,
    서버가 이를 확인하여 클라이언트에게 이를 받았음을 알리는 패킷을 전송하여 연결이 해제된다.

특징

  • 서버는 클라이언트에게 소켓이 닫혔다고 통지한 후, 일정 시간 대기한다.
    이유 : 통지 패킷이 나중에 도착할 수 있기 때문이다.

4 way handshake 과정

  • 1. Client → Server : FIN
    클라이언트는 TCP 연결을 종료하겠다는 FIN 패킷을 보낸다.

    • 서버가 FIN 패킷에 대한 응답을 보내기 전까지 연결을 계속 유지한다.
  • 2. Server → Client : ACK
    서버는 클라이언트의 요청(FIN)을 받고 확인을 알리는 ACK 패킷을 보낸다.

    • 서버는 TCP header의 Acknowledgement Number 필드를 Sequence Number + 1로 지정하고
      ACK Flag 필드를 1로 설정한 세그먼트를 클라이언트에게 전송한다.

    • 그 후에 자신의 통신이 끝날 때까지 기다린다. (이 상태가 TIME_WAIT 상태이다.)

      • 서버가 아직 전송할 데이터가 남아있다면 이어서 계속 전송한다.
  • 3. Server → Client : FIN
    데이터를 모두 보내고 통신이 끝나면, 서버는 연결이 종료되었다는 의미로 FIN 패킷을 클라이언트에게 전송한다.

  • 4. Client → Server : ACK
    클라이언트는 서버의 응답(FIN) 패킷을 확인했다는 의미로 ACK 패킷을 보낸다.

  • 5. 서버는 클라이언트의 ACK 패킷을 받은 후 소켓 연결을 CLOSE 한다.

  • 6. 클라이언트는 서버로부터 받지 못한 데이터가 있을 것을 대비하여,
    일정시간동안 세션을 남겨놓고 잉여 패킷을 기다리는 과정을 거친다. (TIME_WAIT)

profile
https://github.com/yuseogi0218

0개의 댓글