혼자 정리
[네트워크이론] 3.2 Multiplexing and Demultiplexing 본문
(Computer Networking a top-down Approach 책의 내용입니다)
- 프로세스는 한 개 이상의 소켓을 가질 수 있음
- 네트워크는 이를 통해 프로세스와 데이터를 주고 받음
- 모든 소켓은 유일한 식별자를 가짐
- 식별자 포맷은 UDP인지 TCP인지에 따라 조금 다르다
- 수신 측 트랜스포트 계층은 메시지를 전달해야 하는 수신 소켓을 식별하기 위해 segment의 필드를 확인함
- 트랜스포트 계층 segment 데이터를 적절한 소켓으로 전달하는 작업을 역다중화(demultiplexing) 라고 함
- 송신 측 트랜스포트 계층은 소켓에서 데이터를 모아 각 chunk에 헤더 정보(역다중화에 사용됨)를 붙여서 캡슐화하고 네트워크 계층올 전달
- 다중화(multiplexing) 라고 함
- 각 segment는 출발지 포트 번호 필드(16비트), 목적지 포트 번호 필드(16비트)를 헤더에 가지고 있다.
- 이를 소켓 식별에 활용
- 여기서는 인터넷 트랜스포트 계층의 multiplexing/demultiplexing을 살펴보지만 실질적으로는 모든 계층에서 일어나는 작업
Connectionless Multiplexing and Demultiplexing
파이썬으로 UDP 소켓을 생성하려면 다음과 같이 코드를 작성
이렇게만 하면 트랜스포트 계층에서 1024-65535 중 현재 UDP로 사용되고 있지 않은 포트 번호를 자동 할당clientSocket = socket(AF_INET, SOCK_DGRAM)
만약 명시적으로 포트 번호를 지정하고 싶다면 추가로 다음 코드를 작성(ex. 19157)
clientSocket.bind(('', 19157))
예시를 통해 multiplexing/demultiplexing을 살펴보자
UDP 포트 19157을 가진 호스트 A의 프로세스가 UDP 포트 46428을 가진 호스트 B의 프로세스에 애플리케이션 데이터 chunk 하나를 보내고 싶다고 가정
- 호스트 A의 트랜스포트 계층에서 애플리케이션 데이터, 출발 포트 번호(19157), 목적 포트 번호(46428), 두 개의 다른 값(나중에 배우게 됨)을 포함하고 있는 segment를 생성하여 네트워크 계층으로 전달
- 네트워크 계층은 segment를 IP datagram으로 캡슐화하여 송신 호스트 전달을 위해 "best-effort" 시도를 한다.
- 만약 segment가 호스트 B에 도착한다면 트랜스포트 계층은 segment에서 목적지 포트 번호(46428)를 파악하고 포트 46428로 식별되는 소켓으로 segment를 전달한다.
UDP 소켓은 (destination IP address, destination port number)의 2-tuple로 식별됨
- 두 개의 서로 다른 UDP segment가 source IP address, source port number가 동일하지 않더라도 동일한 destination IP address와 destination port number를 가지고 있으면 동일한 프로세스의 동일한 소켓으로 전달된다.
- source port number는 return 주소의 용도로 사용됨
Connection-Oriented Multiplexing and Demultiplexing
- TCP 서버 애플리케이션은 "welcoming socket"을 통해 bind한 포트에서 TCP 클라이언트로부터의 connection-establishment 요청을 대기
- TCP 클라이언트는 소켓을 생성하고 connection-establishment 요청을 보낸다. 파이썬 코드로 작성하면 다음과 같다.
clientSocket = socket(AF_INET, SOCK_STREAM) clientSocket.connect((serverName, serverPort))
- connection-establishment 요청은 단지 destination port 번호와 특수한 connection-establishment bit가 TCP 헤더에 설정된 TCP segment일 뿐이다. segment는 클라이언트가 선택한 source port 번호도 포함하고 있다.
- 서버 프로세스를 가동 중인 호스트 운영체제가 커넥션 요청 segment를 받으면 segment에 설정된 destination port에서 커넥션 accept를 대기 중인 서버 프로세스를 찾는다. 그러면 해당 서버 프로세스는 새 소켓을 생성한다.
connectionSocket, addr = serverSocket.accept()
- 서버의 트랜스포트 계층은 커넥션 요청 segment에서 (1) segment의 source port, (2) source host의 IP 주소, (3) segment의 destination port, (4) destination IP 주소를 추출하고, 이를 새 소켓의 식별자로 사용한다.
- 앞으로 source port, source IP 주소, destination port, destination IP 주소가 식별자와 일치하는 TCP segment는 이 소켓으로 전달되게 된다.
TCP 소켓은 (source IP address, source port, destination IP address, destination port)를 모두 사용하여 식별됨
- 두 개의 서로 다른 TCP segment가 동일한 destination IP address, destination port number를 가지고 있더라도 source IP address, source destination port number 중 하나라도 다르면 다른 소켓으로 전달된다.
'네트워크' 카테고리의 다른 글
[네트워크이론] 3.4 Principles of Reliable Data Transfer (1) | 2024.01.13 |
---|---|
[네트워크이론] 3.3 Connectionless Transport: UDP (1) | 2024.01.07 |
[네트워크이론] 3.1 트랜스포트 계층 서비스 및 개요 (0) | 2024.01.04 |
[네트워크이론] 2.6 비디오 스트리밍과 컨텐츠 분배 네트워크 (0) | 2024.01.02 |
[네트워크이론] 2.5 P2P 파일 분배 (1) | 2024.01.01 |