IP 주소 체계
IP 주소 체계란 인터넷상에서 컴퓨터를 식별하기 위해 사용되는 주소 체계를 IP 주소라고 합니다. IP는 'Internet Protocol'의 약자로, 인터넷을 통한 데이터 전송을 가능하게 하는 규칙입니다.
IP 주소는 점이 찍힌 십진수 표현 방식(Dotted-decimal Notation)을 사용하는데 점과 점 사이는 1바이트로 표현이 되고 총 4바이트를 사용해서 표현합니다.
ex) 192.168.1.1과 같은 주소체계를 의미하는 것이다.
IP주소 클래스
IP 주소는 효율적인 관리와 사용을 위해 여러 클래스로 분류됩니다. 이 클래스는 A부터 E까지 있으며, 각각의 클래스는 다른 범위의 IP 주소를 포함하고 있습니다.
class | 1byte | 1byte | 1byte | 1byte |
A | Network ID | Host ID | ||
B | Network ID | Host ID | ||
C | Network ID | Host ID | ||
D | Multicast Address | |||
E | 예약되어 있는 주소 |
- class A : 이 클래스의 IP 주소는 1.0.0.0 ~ 126.255.255.255 사이에서 할당됩니다. 클래스 A 주소의 첫 번째 옥텟(8비트)은 네트워크 주소를 나타내며, 나머지 세 개의 옥텟은 호스트 주소를 나타냅니다.
- class B : 이 클래스의 IP 주소는 128.0.0.0 ~ 191.255.255.255 사이에서 할당됩니다. 클래스 B 주소의 첫 두 개의 옥텟은 네트워크 주소를 나타내며, 나머지 두 개의 옥텟은 호스트 주소를 나타냅니다.
- class C : 이 클래스의 IP 주소는 192.0.0.0 ~ 223.255.255.255 사이에서 할당됩니다. 클래스 C 주소의 첫 세 개의 옥텟은 네트워크 주소를 나타내며, 마지막 옥텟은 호스트 주소를 나타냅니다.
- class D : 이 클래스의 IP 주소는 224.0.0.0 ~ 239.255.255.255 사이에서 할당됩니다. 클래스 D는 멀티캐스트 주소로 예약되어 있습니다.
네트워크 주소란 네트워크를 구분하여 주는 ID를 의미한다
예를 들어(주)틴팔이라는 회사와 (주)틴구라는 회사가 있는데 이중 (주)틴구 라는 회사의 틴 대리에게 데이터를 전송한다고 가정해 보자. (아래 이미지 참고)
틴구 회사의 틴 대리의 컴퓨터에 데이터를 전송하기 위해서는 먼저 틴구의 네트워크로 데이터를 전송해 주는 것이다.
먼저 위의 이미지를 보면 class C 부분에 해당하는 것을 알 수 있고 해당 네트워크 주소인 212.155.155만을 참조해서 (주)틴구의 네트워크를 찾는다
네트워크를 찾았다면 호스트 주소를 참조하여 틴구 대리의 컴퓨터를 최종적으로 찾아내어 데이터를 전송하게 되는 것이다.
Port란
포트는 컴퓨터와 인터넷 간의 통신에서 중요한 역할을 하는 개념입니다. 데이터는 인터넷을 통해 패킷이라는 작은 단위로 전송되며, 이 패킷들이 정확한 목적지에 도착하게 하는 역할을 하는 것이 바로 포트입니다.
포트가 중요한 이유는 일반적으로 개인이 사용하는 컴퓨터는 하나의 물리적 연결 장치를 통해 네트워크에 연결되어 있어 하나의 IP만을 갖게 됩니다.
이 뜻은 프로그램이 메신저, 동영상 등 여러 가지의 프로그램이 실행되고 있어도 데이터를 송 수신하는 길은 하나밖에 없어 송 수신한 데이터 패킷을 어떤 프로그램에 전달할지 구분하지 못한다는 의미입니다.
이를 해결하기 위해 필요한 것이 포트입니다(Port).
32비트의 IP주소는 네트워크에 존재하는 호스트를 구분하고 16비트 포트 정보로는 호스트 내에서 실행되고 있는 프로그램을 구분하게 되는 것입니다.
또한 포트는 16비트(2바이트) 총 65536개(0번부터 65535번까지)가 있는데 이 중 0번부터 1023번까지는 잘 알려진 포트로, 특정한 서비스들이 사용하도록 예약되어 있습니다. 때문에 0 ~ 1023은 개인이 지정하여 사용할 수 없습니다. 예를 들어, 21번 포트는 FTP(File Transfer Protocol)에, 22번 포트는 SSH(Secure Shell)에, 80번 포트는 HTTP(Hypertext Transfer Protocol)에 사용된다고 합니다.
또한 Port는 중복될 수 없으나 TCP소켓과 UDP소켓은 Port를 공유하지 않아 중복되어도 상관없습니다.
프로세스란
프로세스는 메모리상에 올라와 실행되고 있는 프로그램을 의미한다.
주소 정보의 표현
주소 체계를 나타내는 구조체
typedef struct sockaddr_in {
#if ...
short sin_family; // 주소 체계 전송 주소의 주소 패밀리
#else
ADDRESS_FAMILY sin_family; // 주소 체계 전송 주소의 주소 패밀리
#endif
USHORT sin_port; // 16비트 TCP / UDP Port
IN_ADDR sin_addr; // 32비트 IPv4 주소
CHAR sin_zero[8]; // 사용되지 않음
} SOCKADDR_IN, *PSOCKADDR_IN;
typedef struct in_addr {
union { //union을 써서 주소를 1바이트씩, 2바이트씩, 4바이트씩 나눠서 담을 수 있게 선언되
struct { UCHAR s_b1,s_b2,s_b3,s_b4; } S_un_b;
struct { USHORT s_w1,s_w2; } S_un_w;
ULONG S_addr;
} S_un;
sockaddr_in 구조체 정보
- sin_family :주소 체계에 대한 정보
주소체계 | 정의 |
AF_INET | IPv4 인터넷 프로토콜 |
AF_INET6 | IPv6 인터넷 프로토콜 |
AF_LOCAL | Local 통신을 위한 UNIX 프로토콜 |
- sin_port : 16비트 Port 정보를 대입한다.(네트워크 바이트 순서대로 대입해야 함 -> 뒤에 언급)
- sin_addr: 32비트 IP주소 정보를 대입한다. 네트워크 바이트 순서대로 저장
- sin_zero : 특별한 의미 없이 단순한 채워주기 위한 목적(필자도 잘 모르겠음)
네트워크 바이트 순서
SOCKADDR_IN 구조체 변수에 값을 대입할 경우 네트워크 바이트 순서로 값을 변경한 뒤 대입해야 한다고 합니다.
네트워크 바이트 순서(Network Byte Order)는 컴퓨터 네트워킹에서 사용하는 표준 방식으로, 데이터가 바이트 단위로 전송되는 순서를 의미합니다
표현 방식
- Big-Endian
- Little-Endian
Big-Endian 표현 방식
Big-Endian은 상위 바이트(가장 중요한 바이트)를 먼저 전송하는 방식을 의미합니다. 예를 들어 4바이트 정수 '12345678'을 네트워크 바이트 순서로 전송한다면, '12'가 가장 먼저 전송되고, 그다음으로 '34', '56', '78'이 순서대로 전송됩니다.
Little-Endian 표현 방식
Little-Endian은 하위 바이트를 먼저 전송하는 방식을 의미합니다. 예를 들어 4바이트 정수 '12345678'을 네트워크 바이트 순서로 전송한다면, '78'가 가장 먼저 전송되고, 그 다음으로 '56', '34', '12'이 순서대로 전송됩니다.
데이터를 처리하는 데 있어 두 방식의 선택은 시스템 CPU에 따라 달라진다고 합니다.
이를 '호스트 바이트 순서'라고 하는데 이 부분이 왜 중요한지 살펴봅시다
.
1234라는 정수를 Big-Endian방식으로 저장 후 Little-Endian방식의 시스템에게 보내게 되면 Little-Endian은 0x34, 0x12 순으로 저장하여 다른 값으로 해석하게 된다
이러한 문제점 때문에 네트워크를 통해 데이터를 전송할 때는 Big-Endian 방식만을 사용하기로 약속했다고 한다.
따라서 Little-Endian 방식의 시스템이라면 전송하기 전에 Big-Endian 방식으로 데이터를 변경해서 보내야 하고 받을 때도 마찬가지이다.
또한 SOCKADDR_IN 구조체 안에 존재하는 모든 값은 네트워크 바이트 순서로 채워져야 한다.
바이트 순서 변환
위와 같은 이유 때문에 값을 채우기 전 Big-Endian 방식으로 데이터를 변경해야 하는데 이때 필요한 함수들에 대해 설명하겠습니다.
h | host byte order | n | network byte order |
s | short (16bit) | l | long (32bit) |
// Host Byte 순서를 Network Btye 순서로 바꾼다
unsigned short htons(unsigned short);
// Network Byte 순서를 Host Byte 순서로 바꾼다.
unsigned short ntohs(unsigned short);
// 32비트 데이터를 호스트 바이트 순서에서 네트워크 바이트 순서로 바꾼다.
unsigned long htonl(unsigned long);
// 반대
unsigned long ntohl(unsigned long);
인터넷 주소 초기화 방법
SOCKADDR_IN servAddr;
const char* servIP = "123.0.0.1";
const char* servPort = "9191";
memset(&servAddr, 0, sizeof(servAddr));
servAddr.sin_family = AF_INET;
servAddr.sin_port = htons(atoi(servPort));
inet_pton(AF_INET, servIP, &(servAddr.sin_addr.s_addr));
- 인터넷 주소 구조체 생성
- IP와 포트 선언
- memset한수를 이용하여 인자로 전달된 구조체 변수를 0으로 초기화한다
초기화하는 이유는 불필요한 데이터를 쓰레기 값을 남겨둘 경우 문제의 소지가 될 수 있기 때문 - 프로토콜 체계 설정 = AF_INET
- 포트 설정 -> atoi함수를 사용하여 정수 값으로 변경 이후 htons 함수를 통해 네트워크 바이트 순서로 변환
- inet_pton함수를 이용하여 IP주소 설정 IP 주소의 숫자 이진 표현을 저장할 버퍼에 대한 포인터입니다 IP 주소는 네트워크 바이트 순서로 반환됩니다.
주소 정보 할당하기
int WSAAPI bind(
[in] SOCKET s,
[in] const sockaddr *name,
[in] int namelen
);
- s : 주소를 할당하고자 하는 socket()으로 생성된 소켓객체
- name : 소켓객체에 부여할 주소정보를 포함한 구조체 포인터
- namelen : 인자로 전달된 주소 정보 구조체의 길이
해당 게시글은 서적을 통한 개인 공부 목적으로 작성된 글입니다.
출처 : TCP/IP 소켓 프로그래밍 서적
'TCP_IP 소켓 프로그래밍' 카테고리의 다른 글
UDP 기반 서버/클라이언트 (0) | 2023.06.16 |
---|---|
TCP 기반 서버 / 클라이언트에 대한 이해2 (에코 서버, TCP 내부 구조) (0) | 2023.06.14 |
TCP 기반 서버 / 클라이언트에 대한 이해1 (0) | 2023.06.13 |
소켓 프로그래밍에서 프로토콜이란 (1) | 2023.06.09 |
윈도우즈 기반 소켓 프로그래밍 이해하기 (0) | 2023.06.08 |
댓글