[Network] 5. 전송 계층

KYJ의 Tech Velog·2023년 4월 22일
0

Network

목록 보기
6/21
post-thumbnail

Transport Layer

네트워크 계층에서는 패킷을 주고 받으면서 네트워크 간의 통신이 가능합니다. 하지만 패킷의 전송 순서나 전송이 잘 되었는지를 보장하지 않기 때문에 비신뢰성 통신이라고 합니다.

전송 계층(Transport Layer)에서는 패킷이 전송 과정에서 아무 문제 없이 제대로 수신 측 컴퓨터에 도착할 수 있도록 패킷 전송을 제어하는 역할을 합니다. 즉, 전송 계층은 신뢰성 통신이 수행되는 계층입니다.

전송 계층은 네트워크 혼잡 상황에 따라 패킷의 전송량을 조절하여 패킷의 흐름을 제어하고 패킷 전송의 오류를 점검해서 수신 측 컴퓨터까지 패킷이 제대로 도착했는지 확인합니다. 또한 다양한 애플리케이션이 동작하는 컴퓨터 내에서 어떤 어플리케이션이 사용하는 데이터인지 식별하여 수신 측 컴퓨터에 도착한 데이터를 수신 측 컴퓨터 내의 애플리케이션에 배분하는 역할을 합니다. 네트워크 계층이 컴퓨터 간의 데이터 통신이라면 전송 계층은 애플리케이션 같의 데이터 통신이라고 보면 됩니다.


연결형 통신과 비연결형 통신

  • 연결형 통신
    신뢰할 수 있고 정확한 데이터를 전달하는 통신입니다. 따라서 통신하고자 하는 상대와 확인하는 과정이 필요합니다. 대표적으로 TCP가 연결형 통신 방식에 사용됩니다.
  • 비연결형 통신
    효율적으로 데이터를 전달하는 통신입니다. 통신하고자 하는 상대와 확인 과정 없이 일방적으로 데이터를 전송합니다.

TCP

TCP(Transmission Control Protocol)는 전송 계층에서 신뢰할 수 있고 정확한 통신을 제공하는 연결형 통신 방식의 프로토콜입니다.

Segment

데이터에 TCP 헤더를 붙인 전송 계층에서의 전송 단위입니다. TCP에서 데이터를 분할하는 단위를 MSS(Maximum Segment Size)라고 합니다. MSS는 송신 측과 수신 측이 서로 합의해서 결정됩니다. 표준 MSS는 1,460 바이트입니다. TCP는 MSS를 넘는 크기의 데이터를 MSS 단위로 분할합니다.

TCP 헤더에는 목적지까지 데이터를 제대로 전송하기 위해 필요한 정보가 담겨 있습니다.

데이터를 전송하기 전에 연결(Connetion)이라는 가상의 독점 통신로를 확보해야 합니다. TCP 헤더에는 코드 비트라는 비트가 있습니다. 6비트 크기의 코드 비트에는 연결 제어 정보가 기록이 됩니다.

3-Way Handshake

연결은 앞서 설명드린 코드 비트의 SYN(연결 요청)과 ACK(확인 응답)를 사용해서 확립할 수 있습니다. 데이터를 전송하기 전에 3번의 패킷 교환을 통해 신뢰성을 확보하는 것을 3-Way Handshake라고 합니다.

4-Way Handshake

데이터 전송이 완료된 후에는 연결을 해제하기 위한 요청을 교환해야 합니다. 4번의 패킷 교환을 통해 수행되기 때문에 4-Way Handshake라고 합니다.

3-Way Handshake, 4-Way Handshake에 관련해선 자세한 내용을 포함하여 추가적으로 포스팅하도록 하겠습니다.

Sequence Number & Acknowledgement Number

3-Way Handshake가 끝나고 실제 데이터가 전송되는 과정에는 TCP 헤더의 일련 번호(Sequence Number)와 확인 응답 번호(Acknowledgement Number)를 사용한다.

TCP는 데이터를 분할해서 전송합니다.

  • 일련 번호는 송신 측에서 수신 측에 분할된 이 데이터가 몇 번째 데이터인지 알려줍니다.
  • 확인 응답 번호는 수신 측에서 송신 측에 몇 번째 데이터를 수신했는지 알려줍니다.

Window Size

TCP의 특징은 세그먼트 하나를 보낼 때마다 응답을 한 번 보내는 방식입니다. 한 번 보낼 때마다 한 번 응답을 보내야 하기 때문에 효율이 떨어집니다.

매번 확인 응답을 기다리는 대신 세그먼트를 연속해서 보낸 후에 확인 응답을 받으면 효율은 좋아지지만 수신 측에 세그먼트가 계속 쌓이게 됩니다. 이 때 쌓인 세그먼트를 버퍼(Buffer)라는 곳에 일시적으로 보관합니다. 버퍼덕분에 세그먼트를 연속해서 보내도 대응이 가능하고 효율도 좋아지지만 대량의 데이터가 전송되면 넘쳐버리는 오버플로우(Overflow)가 발생할 수도 있습니다.

오버플로우가 발생하지 않도록 버퍼의 한계 크기를 알고 있어야 합니다. 이 때 이 크기를 윈도우 크기(Window Size)라고 합니다.

Port Number

전송 계층에서는 애플리케이션 간의 통신을 위해 가상의 연결 통로를 이용한다고 생각하면 됩니다. 통신하고자 하는 애플리케이션 간에 가상의 연결 통로를 만드는 작업을 연결 확립이라 하고 연결 통로의 출입구(애플리케이션과 연결 통로의 인터페이스)를 포트(Port)라 하며 포트를 식별하기 위한 주소를 포트 번호라고 합니다.

포트 번호는 동일한 컴퓨터 안에서 통신을 하고 있는 애플리케이션을 식별할 때 사용하는 애플리케이션의 주소라고 볼 수 있습니다. 전송 계층의 데이터 단위인 세그먼트의 헤더에 송수신 애플리케이션의 포트 번호 정보가 담겨있습니다.

포트 번호(Port Number)는 16비트를 사용합니다. 따라서 0~65535번 까지 65536개의 번호를 사용할 수 있습니다. IP 주소를 관리하는 ICANN은 포트 번호를 크게 세 종류로 구분하였습니다.

  • Well-Known Ports (0 ~ 1023)
    서버 애플리케이션용으로 예약된 포트
  • Registered Ports (1024 ~ 49151)
    자주 이용되는 서버 애플리케이션을 식별하기 위한 포트
  • Dynamic Ports (49152 ~ 65535)
    클라이언트 애플리케이션용 임시 포트

서버 애플리케이션은 정해진 포트 번호를 할당합니다. 반면, 클라이언트 애플리케이션은 정해진 포트 번호 없이 필요할 때마다 동적으로 할당됩니다.

Well-Known Port 번호는 HTTP(웹), FTP(파일 전송), SMTP(이메일 전송) 등과 같이 인터넷에서 널리 사용되는 애플리케이션이 사용하도록 예약된 번호입니다. 대표적으로 HTTP 프로토콜을 사용하는 웹 서비스는 80번을 사용합니다.

반드시 정해진 포트를 사용해야 한다는 절대적인 규칙은 없지만 Well-Known Port를 다른 용도로 사용하면 혼란을 야기할 수 있으므로 특별한 이유가 없다면 정해진 용도 외에는 사용하지 않는 것이 좋습니다.

클라이언트 애플리케이션은 운영체제의 의해 포트 번호가 필요할 때마다 동적 포트 번호 범위 내에서 사용되지 않고 있는 임의의 번호가 자동으로 할당됩니다. 통신이 시작되기 전까지 애플리케이션이 어떤 포트를 사용할지 알 수 없으며 통신할 때마다 사용하는 포트도 달라집니다.

신뢰성

TCP는 3-Way Handshake를 통해 연결을 확립하고 통신을 시작합니다. 통신하는 동안에는 연결이 유지됩니다.

TCP는 송신에 대한 수신이 반드시 존재합니다. 송신자에게 수신자는 반드시 ACK를 보내주게 됩니다. 또한, 혹시 송신할 때 패킷이 유실되었거나 송신한 패킷에 대해 ACK를 송신자가 받지 못한다면 송신자는 패킷을 재전송하게 됩니다. 이를 TCP 재전송이라고 합니다. ACK를 받지 못한 것은 송신자가 가진 타이머를 통해 판단합니다. 패킷을 송신한 후에 타임아웃이 발생한다면 패킷을 재전송합니다.

체크섬(Checksum)을 통해 패킷에 오류가 있는지 검출하고 검출되었다면 ACK flag를 0으로 초기화해서 보내고 검출되지 않았다면 코브 비트의 ACK flag를 1로 설정하고 세그먼트의 Sequence Number + 1한 값을 Acknowledgement Number에 저장해서 전송합니다.

TCP Segment가 수신자에게 도착하는 순서가 송신한 순서가 동일해야 합니다. 만약 순서가 뒤바뀐다면 수신자는 수신한 세그먼트를 바로 커널로 전달하지 않고 버퍼에 가지고 있다가 Sequence Number를 확인하여 세그먼트 순서가 맞을 때까지 기다렸다가 전달합니다.

Flow Control

흐름 제어(Flow Control)는 송신 측과 수신 측의 데이터 처리 속도 차이를 해결하기 위한 기법입니다. 송신 측의 데이터 처리 속도는 빠른데 수신 측이 느리다면 송신 측이 보내는 패킷이 처리되지 못하고 계속 block 될 것입니다. 또한 수신 측의 제한된 저장 용량을 초과하면 데이터가 손실될 수도 있습니다. 이를 해결 하기 위해 2가지 방법을 사용합니다.

  • Stop and Wait
    매번 전송한 패킷에 대해 확인 응답을 받아야만 그 다음 패킷을 전송하는 방법입니다.
  • Sliding Window
    수신 측에서 설정한 윈도우 크기만큼 송신 측에서 확인응답없이 세그먼트를 전송할 수 있게 합니다.

Congestion Control

만약 한 라우터에 데이터가 집중되어서 모든 데이터를 처리할 수 없다고 가정해봅시다. 송신 측 호스트들은 보낸 데이터에 대한 응답이 없으니 동일한 데이터를 재전송할 것입니다. 이렇게 되면 혼잡을 더욱 가중시켜서 데이터 손실이 발생할 것입니다.

이러한 네트워크의 혼잡을 피하기 위해 송신측에서 보내는 데이터의 전송 속도를 제어하는 기법이 혼잡 제어(Congestion Control)입니다.

  • AIMD (Additive Increase Multiplicative Decrease)
    처음에는 패킷을 하나씩 보내고 문제없이 도착하면 윈도우 크기를 1씩 증가시킵니다. 패킷 전송에 실패하거나 타임 아웃이 발생하면 윈도우 크기를 절반으로 감소시킵니다. 이 방법은 모든 호스트가 결국 공평하게 네트워크를 사용하게 됩니다. 결국은 윈도우 크기를 증가시켰다 감소시켰다를 반복하다보면 여러 호스트들이 공평하게 네트워크를 사용하게 될 것입니다. 하지만 이 방식은 초기 네트워크의 큰 대역폭을 바로 사용하지 못하기 때문에 모든 대역폭을 활용하여 제대로 된 속도로 통신하기까지 시간이 걸리게 됩니다. 또한 네트워크가 혼잡해지는 상황을 미리 감지하는 것이 아니라 혼잡해진 후에 처리한다는 단점이 있습니다.
  • Slow Start
    처음에는 패킷을 하나씩 보내고 문제없이 도착하면 윈도우 크기를 2배씩 증가시킵니다. 패킷 전송에 실패하거나 타임 아웃이 발생하면 윈도우 크기를 1로 감소시킵니다.

UDP

UDP(User Datagram Protocol)는 전송 계층에서 데이터를 효율적으로 빠르게 보내는 통신을 제공하는 비연결형 통신 방식의 프로토콜입니다.

비연결형 통신이기 때문에 데이터를 전송할 때 확인 작업을 일일히 하지 않습니다. 따라서 신뢰성과 정확성은 보장할 수 없습니다.

데이터를 효율적으로 빠르게 보내는 것이기 때문에 스트리밍 방식으로 전송하는 동영상 서비스와 같은 곳에 사용됩니다.

UDP Header

UDP 헤더가 붙은 데이터를 UDP 데이터그램이라고 합니다.

UDP를 사용하면 같은 네트워크 안에 있는 호스트에게 데이터를 일괄로 보내는 브로드캐스트가 가능합니다.

0개의 댓글