본문 바로가기
CS/컴퓨터네트워크

[하향식 접근 8판] Chapter 3 트랜스포트 계층 (3.1 ~ 3.2)

by dingwoon 2024. 11. 1.

※"컴퓨터 네트워킹 하향식 접근 8판" 책을 간단하게 정리한 내용의 글입니다.※

3.1절과 3.2절에서는 트랜스포트 계층의 전반적인 역할과 그 중 다중화와 역다중화에 대해 배운다.

3.1 트랜스포트 계층 서비스 및 개요

트랜스포트 계층은 애플리케이션에게 논리적 통신(logical communication)을 제공한다. 논리적 통신은 애플리케이션이 그 아래 단의 메시지 운반의 세부 사항에 상관하지 않고 멀리 떨어져 있는 호스트들이 직접 연결된 것처럼 보이는 것을 말한다.
애플리케이션 프로세스는 트랜스포트 계층에서 제공해주는 서비스를 사용해서 목적지 애플리케이션 프로세스로 메시지를 보낸다.
송신 측의 트랜스포트 계층은 송신 애플리케이션 프로세스로부터 메시지를 받아서 작은 조각으로 분할하고 캡슐화해서 트랜스포트 계층 세그먼트(segment)를 만든다. 그리고 송신 측의 네트워크 계층으로 세그먼트를 전달하다. 그러면 데이터그램으로 캡슐화되고 목적지로 전달된다. 목적지로 전달되는 과정에서 중간 라우터에서 트랜스포트 계층에서 캡슐화된 세그먼트 필드를 검사하지 않는다. 수신 측 트랜스포트 계층에 가서야 네트워크 계층에서 데이터그램으로 부터 세그먼트를 추출하고 트랜스포트 계층으로 세그먼트를 보낸다. 그리고 애플리케이션에서 이를 이용할 수 있도록 세그먼트를 처리해서 애플리케이션으로 보낸다.

< 3.1.1 트랜스포트 계층과 네트워크 계층 사이의 관계 >

트랜스포트 계층 프로토콜은 각기 다른 호스트에서 동작하는 프로세스들 사이의 논리적 통신을 제공한다.
네트워크 계층 프로토콜호스트들 사이의 논리적 통신을 제공한다.
호스트에서 호스트로의 데이터 전달은 네트워크 계층의 프로토콜이 책임지고, 그 다음 프로세스까지는 트랜스포트 계층 프로토콜이 책임지는 것이다.

네트워크 계층 프로토콜이 호스트 사이에서 전송되는 트랜스포트 계층 세그먼트에 대한 지연 보장이나 대역폭 보장을 제공할 수 없다면, 트랜스포트 계층 프로토콜은 프로세스끼리 정송하는 메시지에 대한 지연 보장이나 대역폭 보장을 제공할 수 없다.
그럼에도 불구하고 트랜스포트 계층이 하위 네트워크 프로토콜이 비신뢰적일 때 신뢰적인 데이터 전송 서비스를 제공하거나 네트워크 계층이 트래스포트 계층 세그먼트의 기밀성을 보장할 수 없을 때도 침입자가 애플리케이션 메시지를 읽지 못하도록 암호화 하는 등의 트랜스포트 프로토콜의 서비스가 제공될 수 있다.

< 3.1.2 인터넷 트랜스포트 계층의 개요 >

인터넷의 트랜스포트 계층 프로토콜은 UDP(User Datagram Protocol)TCP(Transmission Control Protocol) 두 가지가 있다.
UDP에 대한 패킷을 데이터그램으로 표현하기도 하지만, 여기서는 UDP와 TCP와 같이 트랜스포트 계층에 대한 패킷을 세그먼트로 통일한다.

인터넷의 네트워크 계층 프로토콜은 인터넷 프로토콜(Internet Protocol, IP)이라는 이름을 갖는다. 그리고 모든 호스트는 적어도 하나 이상의 IP 주소를 갖는다.
IP 서비스 모델은 호스트들 간에 논리적 통신을 제공하는 최선형 전달 서비스(best-effort delivery service)이다. 즉, IP는 통신하는 호스트들 간에 세그먼트를 전달하기 위해 최대한 노력하지만, 어떠한 보장도 하지 않는다. IP는 세그먼트의 전달을 보장하지 않고, 전달 순서도 보장하지 않으며, 세그먼트 내부 데이터의 무결성(integrity)도 보장하지 않는다. 그래서 IP는 비신뢰적인 서비스(unreliable service)이다.

그래서 UDP와 TCP의 가장 기본적인 기능은 호스트(종단 시스템)간의 전달을 프로세스 간의 전달로 확장해주는 것이다. 이를 트랜스포트 계층 다중화(transprot-layer multiplexing)역다중화(demultiplexing)이라고 한다. 그리고 UDP와 TCP는 헤더에 오류 검출 필드를 포햄시켜서 무결성 검사를 제공한다.

  • UDP와 TCP가 모두 제공하는 서비스 (= UDP가 제공하는 유일한 두 가지 서비스)
    1. 다중화와 역다중화
    2. 오류 검출 필드로 무결성 검사

UDP는 IP와 마찬가지로 비신뢰적인 서비스(unreliable service)이다. 반면 TCP는 신뢰적인 데이터 전송(reliable data transfer)을 제공한다.
TCP는 흐름 제어, 순서 번호, 확인 응답, 타이머를 사용해서 수신측 프로세스에게 데이터를 순서대로 정확하게 전달한다. 이 외에도 혼잡 제어(congestion control)를 통해 과도한 양의 트래픽을 조절하는 기능도 제공한다.

3.2 다중화와 역다중화

트랜스포트 계층은 네트워크 계층으로부터 데이터를 수신해서 프로세스에게 전달해야 한다. 이때 네트워크 애플리케이션 프로세스는 여러 개 있을 수 있고, 이 중에서 하나에 정확히 전달해야 한다.
트랜스포트 계층과 애플리케이션의 프로세스가 데이터를 주고 받을 때는 소켓(socket)을 통해서 주고 받는다. 그리고 각각의 소켓은 하나의 유일한 식별자를 가지고, 이 식별자의 포맷은 UDP 소켓인지, TCP 소켓인지에 따라 달라진다.

수신 측 트랜스포트 계층은 세그먼트의 필드 집합을 검사해서 세그먼트를 해당 소켓으로 보낸다. 트랜스포트 계층 세그먼트의 데이터를 올바른 소켓으로 전달하는 작업을 역다중화(demultiplexing)라고 한다. 그리고 출발지 호스트에서 소켓으로부터 데이터를 모으고, 이에 대한 세그먼트를 생성하기 위해 각 데이터에 헤더 정보(나중에 역다중화에 사용된다.)로 캡슐화하고, 그 세그먼트들을 네트워크 계층으로 전달하는 작업을 다중화(multiplexing)라고 한다.
다중화와 역다중화는 트랜스포트 계층 외에도 한 프로토콜이 그 상위 계층의 프로토콜에 의해 사용될 때마다 관련되는 것이다.

  • 다중화(multiplexing)
    상위 계층의 데이터를 모아서 헤더 정보로 캡슐화하고 하위 계층으로 전달하는 작업을 말한다.

  • 역다중화(demultiplexing)
    하위 계층에서 받은 데이터를 올바른 상위 계층 프로토콜이나 소켓으로 전달하는 작업을 말한다.

  • 트랜스포트 계층 다중화의 두 가지 요구사항

    1. 소켓은 유일한 식별자를 갖는다.
    2. 각 세그먼트는 세그먼트가 전달될 적절한 소켓을 가리키는 특별한 필드를 갖는다.

이 두가지 요구사항에 따라 트랜스포트 계층 UDP와 TCP의 세그먼트 헤더에는 다음과 같은 데이터가 들어간다.


소켓을 가리키는 특별한 필드는 출발지 포트 번호 필드(source port number field)목적지 포트 번호 필드(destination port number field)이다. 각각의 포트 번호는 0~65535의 16비트 정수이다. 0~1023의 포트번호는 잘 알려진 포트 번호(well-known port number)로 이미 예약되어 있다. (RFC 1700에 명시됨)

즉, 역다중화(demultiplexing)는 세그먼트 헤더의 목적지 포트 번호를 검사하고 상응하는 소켓으로 세그먼트를 보내는 것이다. 소켓을 통해 해당 데이터는 프로세스로 전달된다.
UDP의 기본 동작은 이와 같고, TCP는 다중화/역다중화에 좀 더 많은 의미를 담고 있다.

< 비연결형 다중화와 역다중화 >

UDP 소켓이 생성될 때, 트랜스포트 계층은 현재 호스트에서 UDP 포트로 사용하지 않는 1024~65535 사이의 포트 번호를 할당한다. 아니면 생성 후에 특정 포트 번호를 UDP 소켓에 할당할 수도 있다.
일반적으로 애플리케이션의 서버 측은 특정 포트 번호를 할당하고, 클라이언트 측은 트랜스포트 계층이 포트 번호를 자동으로 할당한다.

이제 비연결형 UDP 다중화/역다중화를 설명하겠다.


UDP 소켓 19157 포트 번호를 가진 호스트 A의 프로세스와 UDP 소켓 46428 포트 번호를 가진 호스트 B가 있다. 호스트 A는 호스트 B에게 애플리케이션 데이터 전송을 요청한다. 이때 다음 작업이 일어난다.

  1. 트랜스포트 계층 세그먼트 생성
    호스트 A의 트랜스포트 계층은 애플리케이션 데이터와 출발지 포트 번호(19157), 목적지 포트 번호(46428), 그리고 2개의 추가적인 값을 포함하는 트랜스포트 계층 세그먼트를 생성한다.
  2. 네트워크 계층에서 IP 데이터그램으로 캡슐화
    트랜스포트 계층은 만들어진 세그먼트를 네트워크 계층으로 전달하고, 네트워크 계층은 세그먼트를 IP 데이터그램으로 캡슐화하고 최선형 전달 서비스(best-effort delivery service) 전달한다.
  3. 수신 후 목적지 포트 번호 검사
    수신 호스트는 세그먼트 안의 목적지 포트 번호(46428)를 검사하고 그에 맞는 소켓(socker)으로 전달한다.
  4. 호스트 B의 응답
    호스트 B는 세그먼트 안의 출발지 포트 번호(19157)를 확인하고 그 포트 번호를 목적지 포트 번호로 해서 트랜스포트 계층 세그먼트를 생성해서 호스트 A로 보낸다.

이를 통해 UDP 소켓은 목적지 IP 주소와 목적지 포트 번호로 구성된다는 것을 알 수 있다. 이 2개가 모두 있어야 원하는 목적지로 데이터를 전달할 수 있다.
그리고 트랜스포트 계층 세그먼트에 출발지 포트 번호도 포함되는 이유도 알 수 있다. 데이터를 보내기 위해서는 목적지 IP 주소와 목적지 포트 번호가 필요하기 때문이다.
또한 UDP 소켓은 (목적지 IP 주소, 목적지 포트 번호) 쌍으로 식별된다. 이 두 가지가 같으면 출발지 IP 주소와 포트 번호가 다르더라도 같은 소켓으로 전달된다.

< 연결지향형 다중화와 역다중화 >

(목적지 IP 주소, 목적지 포트 번호) 두 가지로 식별되는 UDP 소켓과 다르게 TCP 소켓은 (출발지 IP 주소, 출발지 포트 번호, 목적지 IP 주소, 목적지 포트 번호) 네 가지로 식별된다.
즉, TCP 세그먼트는 출발지 IP 주소나 출발지 포트 번호가 다르면 다른 소켓으로 전달된다. (초기 연결 설정 요청을 전달하는 TCP는 제외된다.)

TCP 연결지향형 통신은 다음과 같은 과정을 거친다.

  1. TCP 서버의 환영 소켓
    TCP 서버 애플리케이션은 환영 소켓을 가지고 있다. 이 소켓은 특정 포트 번호(예시: 12000)를 가진 TCP 세그먼트를 기다리고 있다.
  2. 클라이언트의 연결 설정 요청
    TCP 클라이언트는 소켓을 생성하고 서버의 특정 포트 번호(예시: 12000)로 연결 설정 요청 세그먼트를 보낸다. 이 연결 설정 요청은 TCP 헤더에 특별한 연결 설정 비트를 설정한 TCP 세그먼트이다.
  3. 서버 프로세스로 연결 요청 세그먼트 전달
    서버 측 컴퓨터의 호스트 운영체제가 목적지 포트(예시: 12000)를 포함하는 연결 요청 세그먼트를 수신하면, 이 세그먼트를 연결 수락을 기다리는 서버 프로세스로 보낸다.
  4. 연결 소켓 생성
    서버는 연결 요청 세그먼트의 (출발지 포트 번호, 출발지 IP 주소, 목적지 포트 번호, 목적지 IP 주소) 네 가지 값에 의해 식별되는 연결 소켓을 생성한다. 이후 이 네 가지 값이 일치하는 세그먼트에 대해서는 이 소켓으로 역다중화된다.


앞서 언급한 4개의 요소 집합(four-tuple)에 의해 각각의 TCP 소켓이 식별된다.
위의 이미지에서 처럼 출발지 포트 번호는 클라이언트에서 결정하기 때문에 각각의 컴퓨터에서 같은 포트 번호로 서버로 연결을 요청할 수 있다. 하지만 출발지 IP 주소가 다르기 때문에 서로 다른 소켓이 생성되고, 각각 다르게 식별될 수 있다. 따라서 올바르게 역다중화할 수 있다.

< 웹 서버와 TCP >

위에서 본 호스트 A, B, C가 있는 이미지를 보면 각 연결 당 연결 소켓이 생성되고, 연결 소켓 하나 당 서버에서 하나의 프로세스가 생성되는 것을 볼 수 있다. 하지만 실제로 모든 연결 소켓에 대해 프로세스가 생성되지는 않는다. 오늘날의 많은 고성능 웹 서버는 하나의 프로세스만 사용한다. 그러면서 새로운 클라이언트 연결을 위해 새로운 연결 소켓과 함께 새로운 스레드를 생성한다. (스레드 풀을 쓰는 경우도 많다.)

HTTP 연결에는 지속적인(persistent) 것과 비지속적인(non-persistent) 것이 있다. 비지속적인 경우 모든 요청에 대해 서버 소켓을 생성하고 프로세스를 생성하고 종료하는 작업을 한다면 웹 서버 성능에 심한 부담을 줄 수 있다.