3.2 다중화와 역다중화
- 컴퓨터공학
- 2016. 3. 18. 11:31
3.2 다중화와 역다중화
이번 절에서는 트랜스포트 계층의 다중화와 역다중화를 살펴봅시다.
목적지 호스트에서의 트랜스포트 계층은 바로 아래층인 네트워크 계층으로부터 세그먼트를 수신합니다. 그리고 트랜스포트 계층은 호스트에서 동작하고 있는 애플리케이션 프로세스에게 이 세그먼트의 데이터를 전달할 의무가 있습니다. 네트워크 애플리케이션의 한 부분으로서 프로세스가 소켓(socket)을 가지고 있다는 것을 이미 알고 있을 것 입니다. 소켓은 출입문 역할을 합니다.
아래 슬라이드를 보면 알 수 있듯이 소켓은 애플리케이션 계층과 트랜스포트 계층 사이에 위치합니다. 트랜스포트 계층이 데이터를 프로세스에게 직접 전달하는 것이 아니라 소켓에게 전달합니다. 중간 매개자인 셈이죠. 그런데 이 소켓이라는 것은 반드시 1개만 있는 것이 아니라 여러 개가 존재할 수 있기 때문에 각각의 소켓을 구별하기 위한 식별자를 가집니다. 마치 편지가 기숙사,집(호스트)에 도착을 했는데 이 편지를 바로 수신자에게 다이렉트로 전달하는 것이 아니라 기숙사 방(소켓)으로 배달해주는 셈입니다. 방 안에는 수신자(프로세스)가 있구요. 기숙사 방(소켓)들을 구분하기 위해서 필요한 식별자는 방번호(214호, 307호 등등)가 될 수 있겠네요.
이제 수신 측 호스트가 수신한 트랜스포트 계층 세그먼트를 어떻게 소켓들을 구별해서 적절한 소켓으로 향하게 하는지 생각해 봅시다.
일단, 소켓들을 잘 구별하기 위해 세그먼트의 ‘특별한 필드’를 검사합니다.
이 ‘특별한 필드’는 아래 슬라이드의 세그먼트 포맷을 보면 알 수 있듯이 출발지 포트번호 필드(src port number field)와 목적지 포트번호 필드(dot port number field)입니다.
각각의 포트번호는 0~65535까지 16비트 정수이고, 그 중에서 0~1023까지의 포트번호를 ‘잘 알려진 포트 번호(Well-known port number)라고 하여 사용을 엄격하제 제한하고 있습니다. 가령 HTTP(port: 80), FTP(port: 21)처럼 잘 알려진 애플리케이션 프로토콜에서 사용되도록 예약되어 있습니다.
소켓들은 자신만의 포트번호를 할당받습니다. 그래서 세그먼트가 호스트에 도착하면, 트랜스포트 계층은 세그먼트 안의 목적지 포트번호를 검사하고 이에 상응하는 소켓으로 세그먼트를 잘 보낼 수 있게 됩니다. 그러면 세그먼트의 데이터는 소켓을 통해 해당되는 프로세스로 전달됩니다. 이렇게 트랜스포트 계층 세그먼트의 데이터를 올바른 소켓으로 전달하는 작업을 역다중화(demultiplexing)이라고 합니다. 그리고 출발지 호스트에서 소켓으로터부터 데이터를 전달받아 데이터를 모으고, 이를 세그먼트 단위로 묶어 생성하기 위해 세그먼트 앞에 헤더를 붙여 캡슐화하고, 이 세그먼트들을 네트워크 계층으로 내려보내는 작업을 다중화(multiplexing)이라고 합니다.
지금까지 살펴본 방식이 다중화와 역다중화의 기본적인 동작 방식이었습니다.
이제 UDP소켓과 TCP소켓으로 나누어서 UDP 다중화/역다중화 그리고 TCP 다중화/역다중화에 대해 자세히 알아보겠습니다.
-비연결형 다중화와 역다중화
일반적으로 개발자가 UDP 소켓을 생성할 때, 트랜스포트 계층은 포트번호를 소켓에게 자동으로 할당합니다. 예약되지 않은 1024~65535 사이의 포트번호를 할당합니다. 만약 코드를 작성하는 개발자가 ‘잘 알려진(well-known) 프로토콜’의 서버 측을 구현하고 있다면, 개발자는 상응하는 ‘잘 알려진(well-known) 포트 번호’를 할당해야만 합니다. 일반적으로 애플리케이션 서버 측이 특정한 포트번호를 할당받는 것에 반하여, 애플리케이션의 클라이언트 측은 트랜스포트 계층이 포트번호를 자동을 할당합니다.
아래 슬라이드를 봅시다.
UDP 소켓 9157을 가진 호스트 A의 프로세스가 호스트 B의 UDP 소켓 6428을 가진 프로세스에게 애플리케이션 데이터 전송을 원한다고 가정합시다. 호스트 A의 트랜스포트 계층은 애플리케이션 데이터, 출발지 포트번호(9157), 도착지 포트번호(6428), 그리고 기타값을 포함하는 트랜스포트 계층 세그먼트를 생성합니다. 생성된 세그먼트는 네트워크 계층으로 전달됩니다. —> 다중화 작업
네트워크 계층은 세그먼트를 IP 데이터그램으로 캡슐화하고 ‘최선형’ 전달 서비스로 세그먼트를 수신 호스트로 전달합니다.
이 세그먼트가 수신 호스트 B에 도착하면, 수신 호스트는 세그먼트 안의 목적지 포트번호(6428)을 검사하고, 해당 세그먼트를 포트번호 6428로 식별되는 소켓에 전달합니다. —> 역다중화 작업
동일한 목적지 IP주소와 목적지 포트번호를 가지면 여러 개의 세그먼트라 할지라도 같은 목적지 소켓을 통해 동일한 프로세스로 향할 것 입니다.
세그먼트의 출발지 포트번호는 ‘복귀 주소’로 사용됩니다. 편지를 수신하면 발신인에게 답장할 때 상대방 주소를 알아야 하는 원리와 같습니다.
-연결지향형 다중화와 역다중화
TCP 소켓과 UDP 소켓의 다른 점은 TCP 소켓은 4개의 요소들의 집합(출발지 IP, 출발지 포트번호, 목적지 IP, 목적지 포트번호)에 의해서 식별된다는 것입니다. 그래서 네트워크로부터 호스트에 TCP 세그먼트가 도착하면, 호스트는 해당되는 소켓으로 세그먼트를 전달(역다중화)하기 위해서 4개의 값을 모두 사용합니다. 2개의 세그먼트가 4개의 필드가 동일하다면 2개의 세그먼트는 동일한 소켓으로 향하게 됩니다.
아래 슬라이드를 보면 TCP 다중화와 역다중화 작업을 쉽게 이해할 수 있습니다.
A의 프로세스인 P1이 C의 프로세스 P4에게 데이터를 보낼 때에는 (출발지 IP: A, 출발지 포트번호: 9157, 목적지 IP: C, 목적지 포트번호: 80)으로 보냅니다. B의 프로세스인 P2와 P3도 C에게 데이터를 보내려고 합니다. B의 두 프로세스 P2와 P3인 4개의 필드 중에서 (출발지 IP: A, 목적지 IP: C) 2개의 필드는 동일하지만, 출발지 포트번호와 목적지 포트번호가 다르기 때문에 4개의 필드가 동일하지 않습니다. 그렇기 때문에 P2와 P3의 세그먼트는 C에 도착하더라도 서로 다른 소켓으로 향하게 됩니다.
-웹서버와 TCP
아래 슬라이드는 연결 소켓과 프로세스 사이가 항상 일대일 대응인 것은 아님을 보여 줍니다. 아파치 웹 서버(Apache Web Server)와 같은 웹서버가 포트번호 80 상에서 동작하는 호스트를 고려해보면, 클라이언트(인터넷 브라우저)가 서버로 세그먼트를 보내면, 모든 세그먼트들은 목적지 포트번호 80을 가지고 있을 것 입니다. 그런데 위에서 이미 살펴본 것처럼 서버는 다른 클라이언트가 보낸 세그먼트를 출발지 IP주소와 출발지 포트번호로 구별하기 때문에 세그먼트가 많으면 많을수록 연결 소켓도 많이 생성하며, 각각의 연결에 따라서 새로운 프로세스도 많이 만들 것 입니다. 그러나, 실제로 오늘날의 고성능 웹서버들은 하나의 프로세스만 사용합니다. 그러면서 각각의 새로운 클라이언트 연결을 위해 새로운 연결 소켓과 함께 새로운 스레드(가벼운 서브프로세스)를 생성하는 방식을 이용합니다. 이 연결소켓과 스레드를 통해서 HTTP 요청과 HTTP 응답을 전송합니다.
3.2 단원에서는 트랜스포트 계층의 다중화와 역다중화에 대해서 알아보았습니다.
3.3 단원에서는 인터넷 트랜스포트 프로토콜의 하나인 UDP에 대해 알아보겠습니다.
'컴퓨터공학' 카테고리의 다른 글
7.4 실시간 대화형 애플리케이션을 위한 프로토콜 (0) | 2016.03.21 |
---|---|
3.3 비연결형 트랜스포트 : UDP (0) | 2016.03.21 |
3.1 트랜스포트 계층 서비스 및 개요 (0) | 2016.03.17 |
[트랜스포트 계층] Outline (0) | 2016.03.17 |
유니 캐스팅, 브로드 캐스팅, 멀티 캐스팅 (0) | 2016.02.22 |
이 글을 공유하기