소켓의 구분에 활용되는 PORT번호
IP는 컴퓨터를 구분하기 위한 목적이다.
그렇기에, IP만 있다면 목적지 컴퓨터로 데이터를 전송할 순 있다.
하지만
IP만 가지고 데이터를 수신해야 하는 최종 목적지인 응용프로그램(클라이언트)까지 데이터를 전송할 순 없다.
예를 들어,
사용자가 인터넷 강의를 들으면서 인터넷 쇼핑몰에서 옷을 고르고 있다고 가정하면,
인터넷 강의에 필요한 데이터들을 수신할 소켓 하나와
인터넷 쇼핑몰의 데이터들을 수신할 소켓 하나
즉, 최소한 2개의 소켓이 필요로 하다.
그런데 이 두 개의 소켓 중
어느 것이 인터넷 강의의 데이터들을 받는 소켓이고,
인터넷 쇼핑몰의 데이터들을 받는 소켓인지 구분할까
일단, 사용자의 컴퓨터에 장착되어있는 NIC(Network Interface Card)라는 데이터 송수신 장치가 있다.
IP는 데이터를 NIC를 통해 컴퓨터 내부로 전송하는데 사용된다.
그러나 컴퓨터 내부로 전송된 데이터를 소켓에 분배하는 작업은 운영체제가 한다.
이때운영체제는 PORT번호를 활용해서 컴퓨터 내부로 전송된 데이터를 소켓에 분배한다.
즉, NIC를 통해 수신된 데이터 속에는 PORT번호의 정보가 포함되어 있다.
운영체제는 바로 이 정보를 참조해서 일치하는 PORT번호를 가진 소켓에 데이터를 전달한다.
-
이렇든 PORT번호는 하나의 운영체제 안에서 소켓을 구분하는 목적으로 사용되기 때문에 하나의 운영체제 내에서
동일한 PORT번호를 둘 이상의 소켓에 할당할 수 없다.
이유는 동일한 PORT번호를 둘 이상의 소켓이 쓰면 데이터를 어느 소켓으로 보내야 할지 운영체제가 모른다.
그리고 PORT번호는 16비트로 표현된다. 즉, 2바이트로 표현된다.
그래서 할당할 수 있는 PORT번호의 범위는 0 ~ 65535 이하이다.
하지만 0 ~ 1023번까지는 Well-known PORT라 해서
특정 프로그램에 할당하기로 예약되어 있기 때문에
0 ~ 1023번까지의 PORT번호를 제외한 나머지 값을 할당해야 한다.
쉽게 말하면 0 ~ 1023번까지의 PORT번호는 이미 어딘가에 쓰자고 약속되어있는 PORT번호여서
사용하면 안 된다.
그리고 PORT번호는 중복이 가능하지만,
TCP 소켓과 UDP소켓은 PORT번호를 공유하지 않기 때문에 중복되어도 상관없다.
즉, TCP 소켓에서 생성할 때 9999 PORT번호를 할당했다면,
또 다른 TCP 소켓을 생성할 때 9999 PORT번호를 할당하면 안 된다.
하지만
TCP 소켓에서 생성할 때 PORT번호 9999를 할당했을 때
UDP소켓에 생성할 때 사용할 PORT번호로 사용해도 된다.
-
정리하자면
우리가 흔히 말하는 데이터 전송의 목적지 주소에는 IP주소뿐만 아니라 PORT번호도 포함된다.
그래야 최종 목적지에 해당하는 응용프로그램(클라이언트)의 소켓까지 데이터를 전달할 수 있다.
'시작하지 말았어야 했던 것 > (Unix, Linux) C Socket' 카테고리의 다른 글
(리눅스) 구조체 sockaddr_in의 멤버 정의 (0) | 2021.02.02 |
---|---|
(리눅스) IPv4 기반의 주소표현을 위한 구조체 (0) | 2021.02.02 |
(리눅스) 인터넷 주소(Internet Address) (0) | 2021.02.02 |
(리눅스) 소켓의 생성(4-1) TCP 클라이언트(client) 프로그램 구현 (0) | 2021.02.02 |
(리눅스) 소켓의 생성(4) 프로토콜의 마지막 정보 전달 (0) | 2021.02.02 |