TIL 40 - TCP 3-way handshake 네트워크

crystalee·2021년 10월 17일
0

CS

목록 보기
1/2
post-thumbnail

📖 TCP 3-way handshake

💁🏻‍♀️ TCP란 무엇인가?

TCP/IP 방식의 4계층에서 쓰이는 주요 프로토콜 중 하나이다.
서비스를 구분하고 데이터의 전송 방식을 담당하는 계층(TCP, UDP)

4계층은 데이터가 도달함을 보장하는 신뢰성을 제공하는 계층으로, TCP는 에러 복구, 흐름제어, 애플리케이션 식별 등을 수행합니다. 네트워크를 4계층으로 나눌때 응용 계층(Application) ,전송 계층(Transport), 인터넷 계층(Internet), 네트워크 연결 계층(Network Access)으로 나뉩니다.

  • 응용 계층(Application) : 응용프로그램 간의 데이타 송수신
  • 전송 계층(Transport) :호스트 간의 자료 송수신
  • 인터넷 계층(Internet) : 데이타 전송을 위한 논리적 주소 지정 및 경로 지정
  • 네트워크 연결 계층(Network Access) : 실제 데이타인 프레임을 송수신

4계층에서는 어떤 애플리케이션에 데이터를 전송할지 구별하기 위해 포트번호(Port Number)를 이용합니다.

TCP

웹이나 이메일과 같이 데이터가 정확하게 전달되어야 하는 통신에서 사용되며,
통신을 맺고 끊는 과정에서 클라이언트와 서버간 확인 절차를 거치는데,
이러한 특징으로 연결지향 프로토콜이라고 합니다.

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

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

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

UDP

VolIP나 동영상 스트리밍과 같이 전송 속도가 빨라야 하는 통신에서 사용되며,
TCP와 다르게 연결을 맺지 않고 한쪽에서 일방적으로 데이터를 보냅니다.
따라서 이러한 특징을 비연결지향 프로토콜이라고 부릅니다.

💁🏻‍♀️ TCP 3-way handshake

3-way handshake란?

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

TCP 3 Way Handshake는 TCP/IP프로토콜을 이용해서 통신을 하는 응용프로그램이 데이터를 전송하기 전에 먼저 정확한 전송을 보장하기 위해 상대방 컴퓨터와 사전에 세션을 수립하는 과정을 의미한다.

  • 송신처(Client)는 수신처(Server)로 확립 요청(SYN)을 보냅니다.
  • 수신처(Serve)는 송신처(Client)로 부터 수신한 확립 요청(SYN)에 대한 커넥션 확립 응답(ACK)과 함께, 송신처(Client)에 대한 확립 요청(SYN)을 함께 보냅니다.
  • 수신처(Client)는 송신처(Server)로 부터 받은 확립 요청(SYN)에 대한 커넥션 확립 응답(ACK)을 보냅니다.

Client > Server : TCP SYN
Server > Client : TCP SYN ACK
Client > Server : TCP ACK

SYN은 'synchronize sequence numbers', ACK는'acknowledgment'

커넥션 확립은 양방향성(bidirectional) 연결이며, 세 번의 요청을 거쳐야 양방향 연결의 신뢰성을 확보할 수 있기 때문에 TCP의 커넥션 확립 과정을 3-way(3방향) handshake라고 부릅니다.

TCP가 통신을 맺는 과정

커넥션이 맺어지면 데이터를 전송할 수 있는 상태가 되고, 데이터 전송이 끝나면 커넥션을 끊게 됩니다.

[STEP 1]

A클라이언트는 B서버에 접속을 요청하는 SYN 패킷을 보낸다. 이때 A클라이언트는 SYN 을 보내고 SYN/ACK 응답을 기다리는SYN_SENT 상태가 되는 것이다.

[STEP 2]

B서버는 SYN요청을 받고 A클라이언트에게 요청을 수락한다는 ACK 와 SYN flag 가 설정된 패킷을 발송하고 A가 다시 ACK으로 응답하기를 기다린다. 이때 B서버는 SYN_RECEIVED 상태가 된다.

[STEP 3]

A클라이언트는 B서버에게 ACK을 보내고 이후로부터는 연결이 이루어지고 데이터가 오가게 되는것이다. 이때의 B서버 상태가 ESTABLISHED이다.
위와 같은 방식으로 통신하는것이 신뢰성 있는 연결을 맺어 준다는 TCP의 3 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과 구분해 오류를 줄이기 위해서입니다.

4-Way handshake

3-Way handshake는 TCP의 연결을 초기화 할 때 사용한다면, 4-Way handshake는 세션을 종료하기 위해 수행되는 절차입니다.

[STEP 1]

클라이언트가 서버에 연결을 종료 (fin)플래그를 전송, 클아이언트는 종료신호를 기다리는 상태 fin_wait1

[STEP 2]

서버는 일단 확인(ack) 했다는 메시지를 보내고 자신의 통신이 끝날때 까지 기다리게함. 서버는 close wait 상태 클라이언트는 종료신호를 기다리겠다는 fin_wait2 상태 전환

[STEP 3]

서버가 통신이 끝나면 이제 종료해도된다는 (fin) 플래그를 클라이언트에 전달. 서버는 last_ack 상태로 전환, 클라이언트는 time_wait 상태 전환

[STEP 4]

클라이언트는 연결종료를 확인했다는 응답(ack) 플래그를 보냄. 서버 상태 closed

profile
코린이 성장일기

0개의 댓글