Chapter 3.2 Multiplexing / Demultiplexing
Computer Networking : A Top Down Approach 7th Edition, Global Edition Jim Kurose, Keith Ross
목적지 호스트의 Transport-layer 은 바로 아래의 Network-layer 로부터 Segment를 수신 받는다.
Segment를 받은 Transport-layer은 호스트에서 실행중인 애플리케이션 프로세스에게 이 Segment의
데이터를 전달한다. 이 때, 프로세스는 소켓(socket)에서 이 데이터를 받아들인다.
위 그림에서 볼 수 있듯이 소켓(socket)은 Application-layer 와 Transport-layer의 사이에 위치하여,
데이터를 서로에게 전달해주는 중재자 역할을 한다. 그런데 이 소켓은 꼭 1개만 존재하는 것이 아니라
여러 개가 존재할 수가 있다. 이때, 소켓을 구별하기 위한 식별자를 가지게 된다.
소켓의 갯수가 1개가 아니기 때문에, Transport-layer에서 받은 Segment를 구별하여 각각 지정된 소켓에
보내줄 필요가 있다.
따라서 이를 위해, Segment에 소켓을 구별하기 위한 필드를 추가를 하게 된다.
- 출발지 포트번호 필드(src port number field)
- 목적지 포트번호 필드(dot port number field)
포트번호는 0~65535까지의 16비트 정수이며, 1~1023번까지의 포트는 잘 알려진 포트 번호(Well-Known Port
Number)라고 하여 사용을 제한한다.
<주요 포트 번호>
소켓은 다른 소켓과 구분되는 자신의 포트번호를 할당 받는다. 따라서 Transport-layer에서 Segment 안의 목적지 포트 번호를 확인하고, 이와 맞는 포트 번호를 가진 소켓으로 해당 Segment를 전달한다. Segment를 받은 소켓과 연결된
Application은 해당 데이터를 무사히 받을 수 있게 된다.
여기서 Transport-layer의 Segment를 알맞은 소켓으로 보내는 작업을 Demultiplexing이라고 한다.
최초로 데이터가 출발한 호스트에서 Segment 앞에 Header를 붙혀 캡슐화하고
Network-layer로 내려보내는 작업을 Mutiplexing이라고 한다.
Connectionless demultiplexing
UDP 소켓 9157을 가진 호스트 A의 프로세스 P3에서 UDP 소켓 6428을 가진 호스트 B의 프로세스
P1에게 데이터 전송을 한다고 가정하자.
Multiplexing
이때, 호스트 A에서의 Transport-layer에서는 프로세스 P3 -> 소켓으로부터 전달 받은 데이터와 출발지 포트 번호(9157),
도착지 포트 번호(6428) + α 를 가지고 있는 Segment를 생성한다. 이 Segment를 Network-layer로 전달한다.
Segment를 받은 Network-layer은 이 것을 IP Datagram으로 캡슐화하고 best-effort delivery Service 로 목적지인
호스트B로 전달한다.
Demultiplexing
호스트 B의 Transport-layer에서는 받은 Segment 안의 목적지 포트 번호(6428)를 확인하고, 일치하는 포트 번호를
갖는 소켓에 해당 Segment를 전달한다.
※ 그럼 출발지 포트 번호는 언제 사용하는가?
출발지 포트 번호는 데이터를 준 호스트에게 응답을 보낼 때 사용한다.
편지를 보낼 때 본인의 주소를 적어야지 받은 사람으로부터 답장을 받을 수 있는 것과 비슷한 이치이다.
Connection-oriented demux
TCP 소캣은 4개의 요소(tuple)로 식별된다.
- source IP address
- source port number
- dest IP address
- dest port number
따라서, TCP Segment를 전달 받았다면 알맞은 socket에 전달하는 작업(Demultiplexing)을 위해 4개의 값을 사용한다.
호스트 A의 프로레스 P3가 호스트 B의 프로세스 P4에게 데이터를 보낼 때
P3 : src IP : address A | src Port : 9157 | dest IP : address B | dest Port : 80
호스트 C의 프로세스 P2, P3가 호스트 B의 프로세스 P3에게 데이터를 보낼 때
P2 : src IP : address C | src Port : 5775 | dest IP : address B | dest Port : 80
P3 : src IP : address C | src Port : 9157 | dest IP : address B | dest Port : 80
프로세스 P2, P3는 출발지 포트 번호가 각각 5775, 9157로 다르기 때문에 다른 소켓으로 향한다.
그렇다면 연결이 많이 생긴다면 그만큼 소켓의 개수가 늘어날까?
Server는 Client에서 오는 Segment를 구별하여 많으면 많을수록 연결 소켓을 많이 생성하며,
각 연결을 따라서 새로운 프로세스도 많이 만들 것이다.
하지만, 오늘날의 고성능 Sever들은 하나의 프로세스만을 사용한다.
새로운 Client와의 연결을 위해 새로운 연결 소켓과 함께 Thread를 만들어 사용한다.
아직까지 특별하게 어려운 것은 없는 거 같다.
중학생 시절, Visual basic으로 Winsock을 이용해 멀티 chat 같은 걸 만들어보곤 했는데
그때 찾아봤던 내용인 것 같다. 전공으로 들으니 재밌구만.
_끗
'전공 공부 정리' 카테고리의 다른 글
Computer Network[04] - principle of reliable data transfer(1) (0) | 2020.03.23 |
---|---|
Computer Network[03] - connectionless transport : UDP (0) | 2020.03.22 |
MySQL 기본 쿼리 명령어 (0) | 2020.03.19 |
[Database] Database Management System & SQL (0) | 2020.03.12 |
Computer Network[01] - Transport Layer (0) | 2020.03.12 |