TCP와 UDP

개발(공부) 자국·2021년 9월 28일
1

TCP와 UDP

4계층에서 동작하는 프로토콜은 통신해야할 목적지 프로세스를 정확히 찾아가고 패킷 순서가 바뀌지 않도록 잘 조합해 원래 데이터를 잘 만들어내기 위한 역할을 한다.

4계층 프로토콜(TCP/UDP)과 서비스 포트

Application 계층을 통해 통신할 데이터를 전달하기 위해서 하위 계층인 1~4 계층에서는 인캡슐레이션을 통해 데이터를 원하는 목적지에 패킷 네트워크 형태로 나눠서 통신 가능한 전기 신호로 변환하는 과정을 거친다. 그리고 이 데이터가 각 계층에 필요한 정보들로 하나하나 데이터로 변환되어가는 과정을 디캡슐레이션이라고 한다.

인캡슐레이션을 할 때 정말 중요한 정보 두가지가 있다.

  • 각 계층에서 정의하는 정보
    각 계층을 정의하는 정보는 해당 동일 계층으로 전달 되었을 때 이 데이터가 올바르게 전달 되는지에 대한 정보를 제공하기 위한 것이다. 각 계층의 정보는 각 계층에서 밖에 해석되지 못한다. 그렇기 때문에 계층을 정의하는 정보가 필요하다. 이러한 각 계층의 정보는 2계층에는 MAC 주소, 3계층에는 IP 주소, 4계층에는 시퀀스 번호/ACK 번호 가 있다.

  • 상위 프로토콜 지시자 정보
    상위 프로토콜 지시자는 패킷을 받고 상위 프토토콜로 전달해야 할 때 어떤 프로토콜로 전달해야 하는지에 대한 정보가 담겨있다. 상위 프로토콜의 지시자 정보는 2계층에는 이더 타입, 3계층에는 프로토콜 번호, 4계층에는 포트번호가 상위 지시자 정보다.

가장 많이 사용하고 있는 TCP/IP 프로토콜 스택의 4계층은 TCP와 UDP를 사용한다. 4계층에서는 데이터를 필요한 어플리케이션에 전달하는 것을 목적으로 가진다. 이 TCP와 UDP를 알아보려고 한다.

TCP

TCP 프로토콜은 통신 도중 데이터의 유실을 막아주는 역할을 한다. 데이터를 여러 패킷을 나누고 그 패킷에 보낼때 시퀀스 번호를 붙이고 응답으로 오는 ACK번호를 보고 순서에 맞게 패킷을 보내 데이터 유실이 없는 통신을 가능하게 만든다.

패킷 순서, 응답 번호

분할된 패킷에 순서를 부여하는 것을 시퀀스 번호, 응답 번호를 부여하는 것을 ACK 번호라고 부른다.

  1. 송신자가 수신자에게 SEQ 0번 패킷을 보낸다.
  2. 수신자는 '송신자가 보낸 0번 패킷을 잘 받았으니 1번 패킷을 보내달라'는 의미로 ACK 1번을 보낸다. 이때 수신자가 송신자에게 응답 정보를 담은 패킷을 보낼 때 SEQ 0을 보낸다.
  3. 수신자로부터 응답을 받은 송신자는 응답에 담겨있는 요청된 ACK 번호 1과 맞는 시퀀스 번호 1를 SEQ 에 담아 보낸다. 그리고 수신자가 보낸 응답 패킷의 SEQ 0을 받았으니 다음은 1번을 보내달라고 ACK에 1을 담아 보낸다.

윈도 사이즈와 슬라이딩 윈도

패킷을 나눠서 보낼때 패킷을 보내고 응답을 받으면 다시 다음 패킷을 보내는 과정을 매번 반복한다면 많은 시간이 걸릴 것이다. 그래서 패킷을 하나만 보내는 것이 아니라 많은 패킷을 한꺼번에 보내고 응답을 한번만 받는 방법을 사용한다. 이때 너무 많이 보내면 유실 가능성이 커지기 때문에 적당한 전송량을 결정하게 되는데 이때 한 번에 전송한느 데이터의 크기를 윈도 사이즈라고 한다. 그리고 이 윈도 사이즈를 조절하는 것을 슬라이딩 윈도라고 한다.

3방향 핸드쉐이크

패킷 네트워크는 많은 상대방과 동시에 통신을 하기 때문에 각 통신에 대한 리소스를 미리 확보하는 작업이 필요하다. TCP에서는 3번 패킷을 주고 받으면서 통신 준비를 하는 것을 '3방향 핸드쉐이크'라고 부르다. 패킷을 보내고 받을 때마다 상태가 변하게 되는데

  1. 우선 수신자가 패킷을 받을 준비가 끝나면 LISTEN 상태로 패킷을 기다린다.
  2. 송신자는 처음 패킷을 보내면서 SYN-SENT 상태가 되고
  3. 송신자가 보낸 패킷을 수신자가 받게 되면 수신자는 SYN-RECEIVE 상태가 된다.
  4. 수신자가 다시 SYN, ACK을 담은 응답 패킷을 송신자에게 보낸다.
  5. 송신자가 수신자의 응답 패킷을 받게 되면 ESTABLISHED 상태가 된다.
  6. ESTABLISHED 상태인 송신자가 수신자에게 응답 패킷을 ACK을 담아서 수신자에게 보낸다.
  7. 송신자의 응답 패킷을 받은 수신자는 ESTABLISHED 상태가 되며 송신자와 수신자는 연결에 성공한다.

송신자 수신자 간의 TCP 프로토콜을 통해 패킷을 주고 받을 때 TCP Header 안에 상태와 현재 몇번의 seq, ack 번호인지 header에 정보를 담아서 상태를 확인한다.

URG, ACK, PSH, RST, SYN, FIN 모두 상태를 나타내며 각 자리는 1비트의 값을 표현할 수 있고 SEQ, ACK에 1이 표시가 되면 32비트로 이루어진 시쿼스 번호와 ACK 번호에 1을 추가하면서 상태를 확인할 수 있다.

UDP

UDP는 TCP와 다르게 전송의 신뢰성 보다는 속도나 연결에 문제가 없어야 하는 상황에서 사용한다. 전송의 신뢰성이 보장되지 않다보니 제한된 경우에 사용되는데 다소 일부 데이터가 유실되는 것이 통신이 멈추는 것보다 더 좋은 상황에 사용하는데 생중계나 실시간 스트리밍 서비스 같은 경우가 이에 해당한다. 다소 화질이 잠시 떨어져 보여도 통신이 계속 유지되는 것이 더 중요한 상황이다.

UDP는 3방향 핸드쉐이크 과정이 없다.

profile
기록을 중요하게 생각하는 사람입니다. 학습한 내용을 정리한 것이라 잘못된 정보가 있을 수 있습니다. 잘못된 정보는 언제든 말씀해 주시기 바랍니다.

0개의 댓글