본 글은 Computer Networking: a Top Down Approach의 전송 계층 챕터를 정리한 글입니다.
Application Layer와 Network Layer사이에서, Transport Layer는 네트워크 구조에서 중추적인 역할을 한다.
여러 호스트들에 의해 실행되는 앱 프로세스들에게 논리적인 통신(communication)을 제공한다.
논리적인 통신이란, 실제로는 수많은 라우터와 링크에 의해 연결 돼있음에도, 앱의 관점에서는 호스트들이 직접적으로 연결된 느낌을 받는다는 것이다.
덕분에 앱 프로세스들은 실제 물리적인 인프라 구조가 어떻게 구성되어 있는지 이해할 필요 없이, 서로 통신 메시지를 주고 받을 수 있다.
Transport Layer는 끝단(end)의 시스템에서 구현되는 것이지, 라우터에 구현되어 있지 않다.
결과적으로 Transport Layer는 Application Layer의 송신 메시지를 Segment(Transport Layer 통신 패킷)로 변환한다.
송신 메시지는 Transport Layer 헤더가 추가된 여러 개의 chunk(segment)로 분해된다.
이후 Transport Layer는 여러 개의 segment를 송신 end system에 존재하는 Network Layer에게 넘기는데, segment는 datagram이라는 Network Layer 패킷으로 캡슐화되고, 목적지로 전송된다.
네트워크 라우터가 오직 datagram의 network-layer 속성에만 작용하고, 캡슐화된 segment의 transport-layer 속성에는 아무 작용도 하지 않는 것에 주목하자.
수신 장소(패킷의 목적지)의 network layer는 datagram을 풀어헤쳐 segment를 추출해내고, transport layer에게 전달한다.
Transport layer는 segment에 담긴 데이터를 어플리케이션에게 전달할 수 있도록 가공한다.
Transport Layer 프로토콜은 네트워크 어플리케이션에 여러 개 존재할 수 있다. 예시로 인터넷은 TCP와 UDP 프로토콜을 가지며, 각 프로토콜은 어플리케이션에게 다른 transport layer를 제공한다.
동부와 서부에 가정이 하나씩 있고, 그곳에는 각각 12명의 아이가 존재한다고 가정
아이들은 매주 타지역 아이들 모두에게 편지를 보냄
그래서 각 집마다 144통의 편지가 발송됨
동부는 철수가 편지를 모으고, 부치는 일을 도맡아서 함.
우체부에게 편지를 받는 것도 철수가 혼자서 하고, 다른 형제들에게 나눠줌.
서부는 짱구가 똑같은 일을 함.
여기서 우체국은 동부 가정과 서부 가정에게 논리적인 통신을 제공했다고 할 수 있음.
그리고 철수와 짱구는 각 집안의 형제들에게 논리적인 통신을 제공했다고 할 수 있음. 그리고 끝단(end) 에 존재함.
이 예제에서 우체국은 네트워크 계층, 철수와 짱구는 전송 계층이라고 볼 수 있다.
어플리케이션의 메시지 = 편지
프로세스 = 형제들
호스트 = 가정
전송 계층 = 철수와 짱구
네트워크 계층 = 우체국(우편 서비스)
이 예제를 통해 더 주목해야 될 사실은, 철수와 짱구는 오직 그들의 가정에서만 할 일을 한다는 것이다. 철수나 짱구가 우체국에 가서 메일을 분류하거나 우편을 운송하지 않는다.
같은 의미로, 전송 계층은 end system에 존재하며 프로세스의 메시지를 받아 네트워크 계층에 넘겨주는 일만 할 뿐이다. 네트워크 상으로 메시지가 어떻게 전달될 지는 신경쓰지 않는다.
실제로 중간 라우터는 전송 계층이 메시지에 추가한 정보에는 어떠한 작업도 하지 않는다.
철수와 짱구가 여행을 가서, 맹구와 훈이가 역할을 도맡게 됐다고 하자.
하지만 맹구와 훈이는 가끔씩 편지를 잃어버리는 실수를 한다.
즉, 철수와 짱구만큼의 서비스를 제공하지 못하는 것이다.
이처럼 네트워크에도 다양한 transport protocol이 존재하며,
어플리케이션에게 각자 다른 서비스 모델을 제공할 수 있다.
만약 우체국에서 우편 배달에 걸리는 시간을 무기한으로 공지했다고 가정해보자.
그럼 철수와 짱구도 무기한으로 기다릴 수 밖에 없다.
이처럼 전송 계층 프로토콜이 제공하는 서비스는 네트워크 계층 프로토콜에 의해 제약을 받는다.
네트워크 계층 프로토콜이 대역폭이나 딜레이에 대한 보장을 해주지 않으면 전송 계층 프로토콜도 프로세스들에게 대역폭이나 딜레이에 대한 보장을 해줄 수 없다.
그럼에도 불구하고 몇몇 서비스는 네트워크 계층 프로토콜이 제공해주지 않아도, 전송 계층에게서 제공받을 수가 있다.
예시로, 전송 프로토콜은 네트워크 프로토콜이 비신뢰적이라도 신뢰적인 데이터 전송 서비스를 제공할 수 있다.
또 다른 예시로는, 전송 프로토콜은 암호화를 사용하여 메시지가 침범당하지 않도록 할 수 있다. (네트워크 프로토콜에 보안 체계가 없더라도)
보통 TCP/UDP의 패킷은 모두 segment라고 부를 수 있다.
하지만 UDP의 패킷을 datagram이라고도 부른다.
하지만 네트워크 계층의 패킷 또한 datagram이라고 부르는 경우가 있기 때문에, 차이를 인지하고 사용해야 한다.
네트워크 앱을 설계할 때 앱 개발자는 두 전송 계층 프로토콜 중 하나를 선택해야 한다. (각 프로토콜에 대한 내용은 다른 글에서 자세히 알아보자)
TCP
: 연결 지향적이며, 신뢰성 있는 데이터 전송을 제공한다. 링크와 라우터에 과도한 트래픽이 몰리는 것을 방지하는 혼잡 제어 기능 또한 제공한다.
UDP
: 낮은 연결 딜레이와 패킷 오버헤드를 강점으로 갖는다.
전송 계층의 가장 기본적인 역할은 두 end system 간의 IP 서비스를 두 프로세스 간의 전송 서비스로 확장하는 것이다.
이것을 멀티플렉싱 및 디멀티플렉싱이라고 한다. (이것도 자세한 내용은 다른 글에서 알아보자)
전송 계층(Transport layer)는 App Layer와 Network Layer 사이에서
서로 다른 end system에서 실행되는 두 프로세스에게 논리적인 통신을 제공한다.
전송 계층은 오직 end system에만 존재하며,
네트워크 상으로 메세지가 어떻게 전달될 지는 신경쓰지 않는다.
전송 계층의 패킷(PDU)는 segment라고 부르며, UDP의 PDU를 datagram이라고 하기도 한다.
그러나 네트워크 계층의 패킷도 datagram이라 부르는 경우가 있어 구분이 필요하다.
본질적으로 전송 계층의 역할은 IP 서비스를 프로세스 간의 전송 서비스로 확장하는 것이고, 이런 확장을 멀티플렉싱과 디멀티플렉싱이라고 한다.