[네트워크] TCP 3-way handshake

Jung Wish·2020년 10월 7일
1

네트워크

목록 보기
2/7
post-thumbnail

TCP 3-way handshake

🐰 TCP란,

  • TCP/IP 방식의 4계층에서 쓰이는 주요 프로토콜 중 하나입니다. (TCP, UDP)

  • 4계층은 데이터가 도달함을 보장하는 신뢰성을 제공하는 계층으로, TCP는 에러 복구, 흐름제어, 애플리케이션 식별 등을 수행합니다.

    • 애플리케이션(Application)은, 통신에서 데이터를 주고 받는 컴퓨터 소프트웨어를 말합니다.
    • 4계층에서는 어떤 애플리케이션에 데이터를 전송할지 구별하기 위해 포트번호(Port Number)를 이용합니다.

  • TCP에서의 데이터 전송에는 커넥션(Connection)의 확립이 필요합니다.

    • 커넥션(Connection)이란, 애플리케이션 간의 송수신을 하는 데이터 통로를 의미하며 실제 케이블로 연결된 개념이 아닌 가상의 통신로를 의미합니다.
    • 여기서 커넥션 확립은 가상의 통신로를 만들어 낸다는 의미입니다.

  • TCP의 헤더(Header) 부분은 20옥텟(1옥텟=8bits)으로 이루어져 있으며, 이 중 제어 6비트의 제어 비트(플래그)가 TCP 데이터의 의미를 나타냅니다.

    아래 그림에서 예약 비트 옆에 있는 URG, ACK, PSH, RST, SYN, FIN이 플래그에 해당합니다.

    🔥 ACK : 상대의 통신 응답을 나타냅니다.
    🔥 SYN : 상대에 대한 접속 요청을 나타냅니다.
    🔥 FIN : 접속을 종료하는 것을 나타냅니다.

🐰🐰 TCP 3-way handshake

  • TCP에서는 커넥션 확립(Connection Establishment)을 위해서 전송 허가 요청과 응답을 주고받습니다. 해당 과정을 TCP 3-way handshake라고 합니다.

    1. 송신처(Client)수신처(Server)확립 요청(SYN)을 보냅니다.
    2. 수신처(Serve)송신처(Client)로 부터 수신한 확립 요청(SYN)에 대한 커넥션 확립 응답(ACK)과 함께, 송신처(Client)에 대한 확립 요청(SYN)을 함께 보냅니다.
    3. 수신처(Client)송신처(Server)로 부터 받은 확립 요청(SYN)에 대한 커넥션 확립 응답(ACK)을 보냅니다.
  • 커넥션 확립은 양방향성(bidirectional) 연결입니다. 세 번의 요청을 거쳐야 양방향 연결의 신뢰성을 확보할 수 있기 때문에 TCP의 커넥션 확립 과정을 3-way(3방향) handshake(악수-연결확인 정도라고 보면 될 것 같습니다..😊)라고 부릅니다.

아래는 3-way handshake(커넥션 확립)와 4-way handshake(연결 종료 확립) 과정을 나타낸 것입니다.
Terminating Connection도 마찬가지로 종료를 위해 4번의 신호 전달이 필요하기 때문에 4-way handshake라고 부릅니다.

  • 상태값 설명 :

    • LISTEN : 서버가 클라이언트의 연결요청을 기다리는 상태입니다.
    • SYN_SENT : 클라이언트가 능동적으로 서버에게 연결요청을 하자고 시퀀스 번호(ISN)를 생성하여 SYN 패킷에 담아 보냅니다. 👉🏻 (SYN(a))
    • SYN_RECEIVED : SYN 패킷을 받은 서버는 자신만의 시퀀스 번호를 생성하여 SYN 패킷에 담고 클라이언트의 SYN 패킷에 있는 시퀀스 번호에 1을 더해서 ACK 패킷에 담아 같이 보냅니다. 👉🏻 (SYN(a+1), ACK(b))
    • (Client) ESTABLISHED : SYN+ACK 패킷을 받은 클라이언트는 ACK 패킷의 시퀀스 번호를 보고 자신이 보낸 시퀀스 번호와 차이가 1임을 확인합니다. 차이가 1이라면 제대로 연결되었다고 판단하고 서버의 SYN 패킷에 있는 시퀀스 번호에 1을 더해 ACK 패킷에 담아 보냅니다. 👉🏻 (ACK(b+1))
    • (Server) ESTABLISHED : 클라이언트의 ACK 패킷을 받고 그 안의 시퀀스 번호가 보냈던 SYN 패킷의 시퀀스 번호 +1이라면 연결이 되었다고 판단합니다.

  • 패킷에 담아 보내는 시퀀스 번호(Sequence Number)는 순차적인 번호가 아닌 난수인데, 이는 포트가 재사용된 가능성이 있으므로 이전 connection과 구분해 오류를 줄이기 위해서입니다.

Reference

profile
Frontend Developer, 올라운더가 되고싶은 잡부 개발자, ISTP, 겉촉속바 인간, 블로그 주제 찾아다니는 사람

0개의 댓글