- IP(Internet Protocol)이란?
인터넷상에서 데이터를 송수신할 목적으로 컴퓨터에게 부여하는 값을 의미한다.
컴퓨터를 구분하기 위한 목적으로 존재한다.
- IPv4(Internet Protocol version 4) : 4바이트 주소체계
- IPv6(Internet Protocol version 6) : 16바이트 주소체계
- 클래스 A
- 형태 : 네트워크ID - 호스트ID - 호스트ID - 호스트ID
- 1byte가 네트워크 ID, 나머지는 호스트ID
- 비트가 0으로 시작, 네트워크 할당은 0 ~ 127, 최대 호스트 수는 16,777,214개
- 클래스 B
- 형태 : 네트워크ID - 네트워크ID - 호스트ID - 호스트ID
- 2byte가 네트워트 ID, 나머지는 호스트ID
- 비트가 10으로 시작, 네트워크 할당은 128 ~ 191, 최대 호스트 수는 65,534개
- 클래스 C
- 형태 : 네트워크ID - 네트워크ID - 네트워크ID - 호스트ID
- 3byte가 네트워크 ID, 나머지는 호스트ID
- 비트가 110으로 시작, 네트워크 할당은 192 ~ 223, 최대 호스트 수는 254개
- 클래스 D
- 멀티캐스트를 위한 클래스
- 클래스 E
- 미래에 사용하기 위해 남겨둔 클래스
- 네트워크 주소를 참조해서 해당 네트워크(라우터나 스위치)로 데이터를 전송한다.
- 해당 네트워크에서 데이터에 적혀있는 호스트 주소를 이용하여 호스트에 데이터를 전달한다.
- 하나의 운영체제 내에서 소켓을 구분하는 목적으로 사용한다.
- 하나의 운영체제 내에서 동일한 Port번호를 둘 이상의 소켓에 할당할 수 없다.
- sin_family
- 적용할 주소체계 정보를 저장한다.
- AF_INET : IPv4 인터넷 프로토콜에 적용하는 주소체계
- AF_INET6 : IPv6 인터넷 프로토콜에 적용하는 주소체계
- AF_LOCAL : 로컬 통신을 위한 유닉스 프로토콜의 주소체계, 여러 주소체계가 있음을 알림.
- sin_port
- 16비트 PORT번호를 저장한다. (네트워크 바이트 순서로 저장)
- sin_addr
- 32비트 IP주소정보를 저장한다. (네트워크 바이트 순서로 저장)
- sin_zero
- 특별한 의미를 지니지 않는 멤버이다.
- sockaddr_in 크기를 sockaddr와 일치시키기 위해 삽입된 멤버
- sockaddr_in와 sockaddr의 형태
1234567891011121314 struct sockaddr_in{sa_family_t sin_family; // 주소체계uint16_t sin_port; // 16비트 PORT번호struct in_addr sin_addr; // 32비트 IP주소char sin_zero[8] // 사용하지 않음}struct sockaddr{sa_family_t sin_family; // 주소체계char sa_data[14] // 주소정보}// 여기서 알수있는 부분은 sockaddr_in에서 sin_port, sin_addr의 정보를// sockaddr에서 sa_data 배열로 받고 있다는 것이다.cs - bind함수에서 사용
12345678910111213 struct sockaddr_in serv_addr;...if(bind(serv_sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr))==-1)error_handling("bind() error");...// sockaddr_in구조체로 선언, serv_addr을 bind함수 두번째 매개변수로 사용할 때// sockaddr 구조체로 형변환을 하는 것을 알 수 있다. 이 부분은 위에 있는 구조체들의// 형태를 보면 알수있다. sockaddr의 sa_data배열에 IP주소와 PORT번호를 저장하기 불편하여// IP주소와 PORT번호를 따로 저장할 수 있는 sockaddr_in를 사용한 것이다.cs
- 빅 엔디안
- 상위 바이트의 값을 작은 번지수에 저장하는 방식
- 리틀 엔디안
- 상위 바이트의 값을 큰 번지수에 저장하는 방식
- 바이트 순서 변환 함수들
123456 // PORT번호 변환에 사용unsigned short htons(unsigned short);unsigned short ntohs(unsigned short);// IP주소 변환에 사용unsigned long htonl(unsigned long);unsigned long ntohl(unsigned long);cs
- 문자열 정보를 네트워크 바이트 순서의 정수로 변환한다.
- 변환된 값을 sockaddr_in 구조체에 넣는 추가 과정이 있다.
12345 #include<arpa/inet.h>in_addr_t inet_addr(const char* string);// 성공 시 빅 엔디안으로 변환된 32비트 정수 값, 실패시 INADDR_NONE 반환// 유효하지 못한 IP주소에 대한 오류검출cs
- 변환된 IP주소 정보를 sockaddr_in 구조체에 별도 대입과정을 거칠 필요없이 sockaddr_in 구조체에 저장가능하다.
- 기능은 inet_addr과 동일하다.
123456 #include<arpa/inet.h>in_addr_t inet_aton(const char* string, struct in_addr* addr);// 성공 시 1(True), 실패 시 0(False)반환// string : 변환할 IP주소 정보를 담고 있는 문자열의 주소 값 전달.// addr : 변환된 정보를 저장할 in_addr 구조체 변수의 주소 값 전달.cs
- inet_aton함수의 반대기능을 제공하는 함수이다.
- 반환형이 char형 포인터이다.
123456 #include<arpa/inet.h>in_addr_t inet_ntoa(struct in_addr* addr);// 성공 시 문자열의 주소 값, 실패 시 -1 반환// 반환형이 char형 포인터인 이유는 해당 함수가// 호출되면 정에 저장된 문자열 정보가 지워질수 있기 때문cs
- 소켓이 동작하는 컴퓨터의 IP주소가 자동으로 할당되어 직접 입력하는 수고를 덜 수 있다.
- 할당 받은 IP중 어떤주소를 통해서 데이터가 들어오더라도 PORT번호만 일치하면 수신할 수 있게 된다.
- sockaddr_in 구조체를 통해 초기화한 주소정보를 소켓에 할당한다.
12345678 #include<sys/socket.h>int bind(int sockfd, struct sockaddr *myaddr, socklen_t addrlen);// 성공 시 0, 실패 시 -1 반환// sockfd : 주소정보를(IP, PORT정보) 할당할 소켓의 파일 디스크립터.// myaddr : 할당하고자 하는 주소정보를 지니는 구조체 변수의 주소 값.// addrlen : 두 번째 인자로 전달된 구조체 변수의 길이정보.cs