Transport Layer가 제공하는 서비스
트랜스포트 계층은 어플리케이션 계층과 네트워크 계층 사이에 존재한다.
1장에서 공부했던 레이어 개념을 다시 생각해보면, 트랜스포트 계층은 네트워크 계층이 제공하는 서비스를 이용하여 어플리케이션 계층에 서비스를 제공한다고 볼 수 있다.
그렇다면 트랜스포트 계층은 어떤 서비스를 제공해야 할까?
간단히 말해서 process to process 커뮤니케이션 기능을 제공한다.
프로세스와 프로세스가 통신하기 위해서는 그 프로세스가 실행되는 컴퓨터와 컴퓨터 사이 통신이 제공되어야 하는데, 이 서비스는 네트워크 계층에서 제공한다.
또는 이 서비스를 logical communication 이라고도 한다. 서로 다른 두 호스트 사이에 어플리케이션 프로세스가 존재하는데, 그 프로세스 간에 논리적인 연결을 제공하기 때문이다.
이 그림에서는 모바일 기기와 서버 프로세스 사이에 논리적 연결이 존재한다는 것을 보여주고 있다.
트랜스포트 계층 프로토콜은 이 end-system 에서 동작하는 프로토콜이다.
트랜스포트 계층에서는 크게 sender, receiver 로 역할이 나누어진다.
sender는 어플리케이션 메세지를 segment 라는 단위로 쪼개서 네트워크 계층으로 보낸다.
receiver는 이 segment 를 다시 조립해서 메세지로 만든다음 어플리케이션 계층으로 보낸다.
트랜스포트 계층에서는 TCP, UDP 2가지 프로토콜을 사용한다.
다른 프로토콜 (SCTP) 도 있긴 한데, 거의 사용하지 않는다.
트랜스포트 계층의 동작을 조금 더 자세히 살펴보자.
오른쪽이 데이터를 보내는 sender 이다.
트랜스포트 계층의 sender는 어플리케이션 메세지를 받아서 자신 계층의 헤더 Th 를 붙인다.
헤더에는 목적지 프로세스의 포트번호와 같은 정보가 포함된다.
이렇게 헤더를 붙여서 만든 세그먼트를 아래의 네트워크 계층으로 보낸다.
네트워크 계층은 아랫 계층과 잘 짝짝꿍해서 목적지 컴퓨터로 세그먼트를 보낸다.
그러면 트랜스포트 계층의 receiver는 세그먼트를 받은 뒤, 헤더를 체크한다.
헤더에는 포트번호가 기술되어있으므로, 헤당 포트에서 실행되고 있는 어플리케이션에 메세지를 전달해준다.
이렇게 하나의 IP 주소로 들어온 여러 포트의 세그먼트를 각각의 포트번호에 맞게 보내주는 역할을 demultiplex (역다중화)라고 표현한다.
쉽게말해 다중화는 IP 라는 목적지에 port 라는 표식을 붙이는 것을 말한다. (sender)
역다중화는 IP + port 라는 데이터에서 port 표식을 보고 목적지를 찾는 것을 말한다. (receiver)
TCP 와 UDP
트랜스포트 계층에서 TCP 와 UDP 라는 2가지 프로토콜에 대해 정리할 예정이다.
TCP (Transmission Control Protocol, 전송 제어 프로토콜)
신뢰성있고, 정해진 순서를 지키는 전송을 보장한다.
이를 위해서 데이터 전송에 문제가 발생한 경우, 재전송한다.
혼잡 제어(congestion control)
만약 network core가 혼잡해서 데이터가 원활하게 전달이 되지 않는다면, TCP를 사용하는 데이터들은 모두 보내는 비율을 조절하는, 일종의 신사 협정을 맺는 것을 말한다.
흐름 제어 (flow control)
특정 연결, 즉, 송신자와 수신자 사이에서 발생한다.
만약 수신자가 무슨 이유에서인지 데이터를 제대로 읽고 있찌 못하면, 송신자가 수신자의 버퍼에 빈 공간이 생길 때까지 데이터를 보내지 않는다. 데이터를 보내서 오버플로우가 발생하면 어차피 버려지기 때문이다.
connection setup
TCP는 통신을 하기 전에 반드시 연결을 미리 설정해야 한다.
UDP (User Datagram Protocol)
UDP는 신뢰성있는 연결을 보장하지 않는다.
네트워크 계층의 프로토콜인 IP와 서비스 모델이 동일하다.
UDP의 이름에 Datagram 이라는 네트워크 계층의 전송단위가 들어간 이유도 3계층의 전송 데이터에서 포트말고는 추가된게 없기 때문이다.
그래서 UDP의 전송단위는 segment 라는 이름을 쓰기도 하지만 datagram 이라고 불러도 맞는 이야기다.
TCP와 UDP는 모두 일정 대역폭 이상의 전송량을 보장한다거나, 아무리 늦어도 이 시간 전에는 보내준다거나 하지는 않는다. (delay guarantee, bandwidth guarantee 는 없다)
멀티플렉싱 & 디멀티플렉싱
이 개념은 TCP와 UDP에 공통으로 적용되는 개념이다.
멀티플렉싱은 mux, 다중화라고도 하며, 디멀티플렉싱은 demux, 역다중화라고도 한다.
그림과 같은 상황을 생각해보자.
하나의 HTTP 웹서버에 두 클라이언트가 통신하고 있는 상황이다.
왼쪽 클라이언트가 웹서버에 파이어폭스로 접근하면, 아파치 서버는 왼쪽 파이어폭스 브라우저에 HTTP 메세지를 전송한다.
그러면 서버의 트랜스포트 계층은 메세지를 받아서 헤더를 붙인 뒤, 네트워크 계층으로 내려보낼 것이다.
네트워크 계층도 자신 계층의 헤더를 붙여서 인터넷을 통해 클라이언트로 패킷을 전송한다.
클라이언트는 패킷을 받으면 네트워크 계층에서 자신 계층의 헤더를 통해 정보를 파악한 뒤, 트랜스포트 계층으로 데이터를 올려보낸다.
트랜스포트 계층은 헤더에 있는 포트 정보를 보고 어떤 프로세스에 메세지를 전달해야 할 지 파악해서 HTTP 메세지를 최종 전달해준다.
위 예시라면, 현재 왼쪽 클라이언트 컴퓨터에서는 스카이프, 넷플릭스, 파이어폭스라는 인터넷에 연결된 3개 어플리케이션이 실행중인데, 누구에게 가야하는 정보인지를 포트를 통해 식별해서 보내는 것이다.
여기에서 멀티플렉싱, 디멀티플렉싱 개념이 등장한다.
서버를 보면 P1 밑에 소켓이 하나 있고, P2 밑에도 소켓이 하나 있다.
각각의 소켓은 왼쪽 클라이언트 P3 의 소켓, 오른쪽 클라이언트 P4의 소켓과 연결되어 있다.
p1 - p3, p2- p4 가 각각 하나의 쌍을 이룬 상태인 것이다.
mux는 sender 에서 발생하는 것으로, 센더에서 어떻게 상대를 구분하고, 상대가 나를 구분할 수 있도록 하는지, 그 정보 (헤더)를 집어넣는 과정을 mux, 다중화라고 한다.
서버의 입장에서는 여러개의 소켓으로부터 오는 데이터를 처리하고, 그 결과를 다시 보내기 위해 여기에 transport 계층의 헤더를 추가한다.
트랜스포트 계층의 입장에서 보면, 여러 어플리케이션 프로세스들이 보내는 각종 메세지를 받아다가 트랜스포트 계층의 헤더를 붙여서 네트워크 계층이라는 하나의 IP주소 통로로 내보내는 일을 하기 때문에, 여러 인풋을 받아서 하나의 아웃풋을 내는 멀티플렉서와 동일한 역할을 한다.
반대로, receiver 로서의 트랜스포트 계층의 입장을 보면, 하나의 IP주소로 다양한 어플리케이션들에 대한 요청이 들어올텐데, 이를 받아다가 헤더 정보를 보고 각각의 프로세스들에게 데이터를 흩뿌려주기 때문에, 하나의 인풋으로부터 여러 아웃풋이 나가는 디멀티플렉서와 동일한 역할을 한다.
디멀티플렉싱에 대해 조금 더 자세히 정리하면, 호스트 컴퓨터는 IP 데이터그램(패킷)을 받는다.
데이터그램에는 source IP 와 destination IP 주소가 있고, 데이터그램이 갖고있는 segment 에는 port 번호가 있다.
IP주소는 3계층에서의 식별자 역할, port 번호는 4계층에서의 식별자 역할을 한다.
TCP, UDP 세그먼트는 공통적으로 위와 같이 16bit 의 source port, destination port 넘버를 갖는다.
헤더필드의 경우, TCP는 복잡하고 UDP는 간단하다.
먼저 connectionless demux 를 먼저 살펴보자.
(connectionless 는 결국 UDP를 가리키는 말이다)
UDP소켓에 데이터그램을 보내려고 할 때, 데이터그램을 먼저 만들어야 한다.
데이터그램을 만들 때는 목적기 IP주소와 포트번호를 먼저 지정한다.
수신자가 UDP 세그먼트를 받으면, 포트번호를 보고 이 세그먼트를 해당 포트의 프로그램에게 전달해준다.
그래서 IP/UDP 의 경우, IP는 달라도 되는데, 포트가 같다면 그 동일한 포트번호로 데이터를 전달하도록 설정되어 있다.
예를 들어 A 컴퓨터의 1번 포트 프로세스가 C 컴퓨터 12345포트 프로세스로 데이터를 보내고,
B컴퓨터의 2번 포트 프로세스가 C 컴퓨터 12345 포트 프로세스로 데이터를 보내면
수신하는 C컴퓨터 트랜스포트 계층 입장에서는 서로 다른 곳에서 온 데이터를 12345포트라는 똑같은 목적지의 프로세스로 모아 보내기 때문에 디멀티플렉싱이 된다.
따라서 UDP에서는 목적지의 IP주소와 포트번호만 알면 디멀티플렉싱이 가능하다.
위 그림에서, 데이터를 보내는 B, D 를 보면, 6428 이라는 하나의 source 에서 9157, ? 라는 다른 포트로 데이터를 보내니까 다중화, 멀티플렉싱이 되고,
데이터를 받는 A, C를 보면 6428 이라는 하나의 destination 으로 서로 다른 포트에서 데이터를 보내니까 역다중화, 디멀티플렉싱이 된다.
반면 TCP의 디멀티플렉싱을 하려면 4가지 정보가 필요하다.
source의 IP, port
destination의 IP, port
수신자는 4가지 데이터를 사용해서 적절한 소켓을 선별한다.
왜냐하면 TCP는 source 컴퓨터마다 소켓이 따로따로 달려있기 때문이다.
UDP와 달리 서버컴퓨터의 프로세스를 보면, 연결된 어플리케이션마다 소켓을 따로 달아주기 때문에 같은 포트번호로 보내도 소스컴퓨터의 포트번호에 따라 전달하는 소켓이 달라진다.
지금까지 트랜스포트 계층의 다중화, 역다중화에 대해 정리해보았다.
사실 다중화, 역다중화는 모든 계층에서 발생한다.
내가 전달 받은 데이터를 어디로 보낼지 결정하는 것은 모든 계층에서 발생하기 때문이다.
'CS > 컴퓨터 네트워크' 카테고리의 다른 글
[컴퓨터 네트워크] 17. Transport Layer (3) : rdt의 개념과 발전 (rdt 2.0 ~ rdt 2.2) (0) | 2024.04.21 |
---|---|
[컴퓨터 네트워크] 16. Transport Layer (2) : UDP (0) | 2024.04.20 |
[컴퓨터 네트워크] 14. Application Layer (7) : Socket Programming (0) | 2024.04.19 |
[컴퓨터 네트워크] 13. Application Layer (6) : Video Streaming And CDN (0) | 2024.04.18 |
[컴퓨터 네트워크] 12. Application Layer (5) : DNS (0) | 2024.04.18 |