IP는 Internet Protocol의 약자로 인터넷상에서 데이터를 송수신할 목적으로 컴퓨터에게 부여하는 값입니다. 그리고 PORT 번호는 컴퓨터에게 부여하는 값이 아니라 프로그램상에서 생성되는 소켓을 구분하기 위해 소켓에 부여되는 번호를 의미합니다.
인터넷 주소
인터넷에 컴퓨터를 연결해서 데이터를 주고받기 위해서는 IP 주소를 부여받아야 합니다. IP 주소체계는 다음과 같은 종류로 나뉩니다.
- IPv4(Internet Protocol version 4): 4바이트 주소체계
- IPv6(Internet Protocol version 6): 16바이트 주소체계
IPv6는 2010년을 전후로 IP주소가 모두 고갈될 것을 염려해 만들어진 표준인데, 아직도 IPv4가 주로 사용되고 있습니다. IPv4 기준의 4바이트 IP 주소는 네트워크 주소와 호스트 주소로 나뉘며, 주소의 형태에 따라서 A, B, C, D, E 클래스로 나뉩니다. 다음 그림은 IPv4 주소체계를 보여줍니다(클래스 E는 일반적이지 않은, 예약되어있는 주소체계이므로 생략하였습니다.)
네트워크 주소(네트워크 ID)란 네트워크의 구분을 위한 IP 주소의 일부를 말합니다. 어떤 호스트가 어떤 4바이트 IP주소에 데이터를 전송한다고 한다면, 한번에 4바이트를 모두 참조해서 데이터가 바로 전송되는 것이 아니고, 우선 네트워크 ID를 참조해서 일단 네트워크로 데이터를 전송합니다. 그리고 해당 네트워크가 전송된 데이터의 호스트 주소(호스트 ID)를 참조하여 데이터가 전송되어야 할 컴퓨터에 데이터를 전송해줍니다. 아래 그림은 그런 과정을 보여줍니다.
위 그림에서 라우터라는 것이 나왔습니다. 네트워크를 구성하려면 외부로부터 수신된 데이터를 호스트에 전달하고, 호스트가 전달하는 데이터를 외부로 송신해주는 물리적 장치가 필요합니다. 이를 가리켜 라우터 또는 스위치라 하는데, 이것도 그냥 컴퓨터에 지나지 않지만 특수한 목적을 가지고 설계 및 운영되는 컴퓨터이기때문에 라우터 또는 스위치라는 이름을 붙여준 것 뿐입니다.
Tip: IP주소의 첫 번째 바이트만 보고도 네트워크 주소가 몇 바이트인지 판단이 가능합니다. 왜냐하면 다음과 같이 클래스 별 IP주소의 경계를 나눠놨기 때문입니다.
- 클래스 A의 첫 번째 바이트 범위: 0이상 127이하(첫 비트가 항상 0으로 시작)
- 클래스 B의 첫 번째 바이트 범위: 128이상 191이하(첫 두 비트가 항상 10으로 시작)
- 클래스 C의 첫 번째 바이트 범위: 192이상 223이하(첫 세 비트가 항상 110으로 시작)
소켓의 구분에 활용되는 PORT 번호
우리 컴퓨터에는 NIC(네크워크 인터페이스 카드)라 불리는 데이터 송수신장치가 하나씩 있습니다. IP는 데이터를 NIC를 통해 컴퓨터 내부로 전송하는 데 사용됩니다. 그러나 컴퓨터 내부로 전송된 데이터를 소켓에 적절히 분배하는 작업은 운영체제가 담당하는데, 운영체제는 이 때 PORT 번호를 사용합니다. 즉, NIC를 통해서 수신된 데이터 안에는 PORT 번호가 새겨져 있습니다. 운영체제는 이 정보를 참조해 일치하는 PORT 번호의 소켓에 데이터를 전달합니다.
이렇듯 PORT 번호는 한 운영체제 내에서 소켓을 구분하는 목적으로 사용되기 때문에 하나의 운영체제 내에서 동일한 PORT 번호를 둘 이상의 소켓에 할당할 수 없습니다. 그리고 PORT 번호는 16비트로 표현되어 있어서 할당할 수 있는 포트 번호는 0이상 65535이하입니다. 그러나 0부터 1023번까지의 포트번호는 Well-known PORT 라고 해서 특정 프로그램에 할당하기로 예약되었기 때문에 이를 제외한 다른 값을 할당해야 합니다.
그리고 TCP 소켓과 UDP 소켓은 PORT 번호를 공유하지 않기 때문에 중복되어도 상관이 없습니다.
'네트워크 프로그래밍 > C' 카테고리의 다른 글
[네트워크 프로그래밍/C] 네트워크 바이트 순서와 인터넷 주소 변환 (0) | 2022.02.21 |
---|---|
[네트워크 프로그래밍/C] 주소정보의 표현 (0) | 2022.02.17 |
[네트워크 프로그래밍/C] 소켓의 프로토콜과 그에 따른 데이터 전송 특성 (0) | 2022.02.17 |
[네트워크 프로그래밍/C] 리눅스 기반 파일 조작하기 (0) | 2022.02.16 |
[네트워크 프로그래밍/C] 네트워크 프로그래밍과 소켓의 이해 (0) | 2022.02.16 |