Presentation is loading. Please wait.

Presentation is loading. Please wait.

한남대학교 컴퓨터공학과 컴퓨터 네트워크 실험실

Similar presentations


Presentation on theme: "한남대학교 컴퓨터공학과 컴퓨터 네트워크 실험실"— Presentation transcript:

1 한남대학교 컴퓨터공학과 컴퓨터 네트워크 실험실
주소 변환 함수 Network Lab. 김 성 준 한남대학교 컴퓨터공학과 컴퓨터 네트워크 실험실

2 목 차 인터넷 IP 주소 인터넷 주소 클래스 Netmask의 이해 IP 주소 할당 사설 IP 주소 예약된 IP 주소

3 인터넷 IP 주소 보통 점으로 구분된 네 개의 10진수로 구성 4바이트로 구성 10진 표기법

4 인터넷 주소 클래스 인터넷 주소의 구성 네트워크 주소(Netid) 호스트 주소(Hostid)
호스트가 연결되어 있는 네트워크 확인 호스트 주소(Hostid) 네트워크의 호스트 중에 하나의 특정 호스트 확인 Netid Hostid Class type

5 인터넷 주소 클래스 인터넷 주소 클래스

6 인터넷 주소 클래스(계속) 인터넷 주소 클래스 클래스 최소 최대 네트워크 비트 호스트 비트 A 0.0.0.0
7 24 B 14 16 C 21 8 D 28 N/A E 27

7 인터넷 주소 클래스(계속) 10진 표기법을 이용한 클래스

8 Netmask의 이해 Mask 141.14.0.0 141.14.2.21 IP 주소 IP 주소 Netmask (Mask)
IP 주소 IP 주소

9 Netmask의 이해 (계속) netmask를 적용하여 네트워크 주소 산출

10 Netmask의 이해 (계속) A, B, C 클래스 주소를 위한 Netmask 클래스 최소 최대 Netmask A
B C

11 Netmask의 이해 (계속) 예제 3.1 (netmask.c) 예제 IP 초기화 address[] adr_inet 초기화
최상위 바이트 검사 결과 출력

12 Netmask의 이해 (계속) 참고 사항 sockaddr_in 구조체 in_addr 구조체 Address Family
struct sockaddr_in { short sin_family; u_short sin_port; struct in_addr sin_addr; } in_addr 구조체 struct in_addr { u_long s_addr; Address Family #define AF_UNSPEC PF_UNSPEC #define AF_LOCAL PF_LOCAL #define AF_UNIX PF_UNIX #define AF_INET PF_INET Protocol Family #define PF_UNSPEC /* Unspecified. */ #define PF_LOCAL /* Local to host */ #define PF_UNIX PF_LOCAL /* Old BSD name for PF_LOCAL. */ #define PF_INET /* IP protocol family. */

13 Netmask의 이해 (계속) 초기화 각종 변수 및 초기값 설정
int x; /* Index variable */ struct sockaddr_in adr_inet; /* AF_INET */ int len_inet; /* length */ unsigned msb; /* Most significant byte */ char class; char *netmask; static struct { unsigned char ip[4]; } addresses[] = { { { 44,135,86,12 } }, { { 127,0,0,1 } }, { { 172,16,23,95 } }, { { 192,168,9,1 } } };

14 Netmask의 이해 (계속) adr_inet 초기화 adr_inet.sin_family = AF_INET; // 도메인 설정
memset(&adr_inet,0,sizeof adr_inet); // 메모리 초기화 adr_inet.sin_family = AF_INET; // 도메인 설정 adr_inet.sin_port = htons(9000); // 포트 번호 설정 memcpy(&adr_inet.sin_addr.s_addr, addresses[x].ip,4); // addresses[x] -> adr_inet.sin_addr.s_addr 로 복사 len_inet = sizeof adr_inet; // 길이 정보 저장 ※ htonl 함수 : 호스트 순서 주소를 네트워크 순서 주소로 변환

15 Netmask의 이해 (계속) 최상위 바이트 검사 0x80 = 1000 0xC0 = 1100
0xE0 = xF0 = 1111 최상위 바이트 검사 msb = *(unsigned char *) adr_inet.sin_addr.s_addr; // 주소 추출 // 최상위 바이트 검사 if ( (msb & 0x80) == 0x00 ) { // 1비트만 검사 class = 'A'; netmask = " "; // 0000 A 클래스 } else if ( (msb & 0xC0) == 0x80 ) { // 2비트만 검사 class = 'B'; netmask = " "; // 1000 B 클래스 } else if ( (msb & 0xE0) == 0xC0 ) { // 3비트만 검사 class = 'C';netmask = " "; // 1100 C 클래스 } else if ( (msb & 0xF0) == 0xE0 ) { // 4비트만 검사 class = 'D';netmask = " "; // 1110 D 클래스 } else { class = 'E';netmask = " "; // 1111 E 클래스 }

16 Netmask의 이해 (계속) 결과 출력 실행 결과 addresses[x].ip[0], addresses[x].ip[1],
printf("Address %u.%u.%u.%u is class %c netmask %s\n", addresses[x].ip[0], addresses[x].ip[1], addresses[x].ip[2], addresses[x].ip[3], class, netmask); 실행 결과 Chap03]$ ./netmask Address is class A netmask Address is class A netmask Address is class B netmask Address is class C netmask

17 IP 주소 할당 3개의 클래스 (A, B, C) 클래스 신청 가능 Netid를 부여 받아 Hostid 발급 interNIC
한국(

18 사설 IP 주소 보통 IP 주소는 InterNIC에 등록 RFC 1597 -> 사설 IP 할당 방법 기술
클래스 최소 최대 네트워크 마스크 A B C 사설 IP 주소 범위

19 예약된 IP 주소 특정 목적을 위해 미리 예약된 IP 주소 RFC 1166 – INTERNET NUMBERS
AMPRNET(The Amateur Radio Internet) 클래스 최소 최대 네트워크 마스크 A

20 IP 주소 처리 문자열 <-> 숫자 변환 함수 제공 제공되는 함수들 프로그램 작성이 용이 inet_addr 함수
inet_aton 함수 inet_ntoa 함수 inet_network 함수 inet_lnaof함수 inet_netof 함수 inet_makeaddr 함수

21 IP 주소 처리 - inet_addr(3) 함수
unsigned long inet_addr(const char *string); string-> 32비트 IP 주소로 변환할 문자열 변환이 성공하면 올바른 IP 주소 반환 만약 실패 하면 INADDR_NONE 반환 errno에 어떠한 에러 코드도 설정하지 않음

22 IP 주소 처리 - inet_addr(3) 함수 (계속)
예제 3.3 inetaddr.c 초기화 소켓 생성 / 주소 설정 주소 바인드 소켓 주소 출력

23 IP 주소 처리 - inet_addr(3) 함수(계속)
초기화 int z; struct sockaddr_in adr_inet; /* AF_INET */ int len_inet; /* length */ int sck_inet; /* Socket */ 소켓 생성 sck_inet = socket(AF_INET,SOCK_STREAM,0);

24 IP 주소 처리 - inet_addr(3) 함수(계속)
주소 설정 memset(&adr_inet,0,sizeof adr_inet); // 초기화 adr_inet.sin_family = AF_INET; // 도메인 설정 adr_inet.sin_port = htons(9000); // 포트 설정 adr_inet.sin_addr.s_addr = inet_addr(" "); // 주소 설정 주소 바인드 z = bind(sck_inet, (struct ockaddr*)&adr_inet, len_inet); 소켓 주소 출력 system("netstat -pa --tcp 2>/dev/null| grep inetaddr");

25 IP 주소 처리 - inet_addr(3) 함수(계속)
실행 결과 tcp : *:* CLOSE 5381/inetaddr 에러 검출 함수 static void bail(const char *on_what) { fputs(on_what,stderr); // 문자열을 표준 에러로 출력 fputc('\n',stderr); // 표준 에러에 개행문자 출력 exit(1); // 프로그램 종료 }

26 IP 주소 처리 - inet_aton(3) 함수
IP 주소 문자열을 32비트 IP 주소로 변환 int inet_aton(const char *string, struct in_addr *addr); string-> IP주소의 문자열 addr -> 변환된 IP 주소로 갱신된 구조체 실패하면 0이 반환 errno에 에러 코드 설정 하지 않음. 성공하면 addr에 올바른 IP 주소 설정

27 IP 주소 처리 - inet_aton(3) 함수 (계속)
예제 3.4 inetaton.c 초기화 소켓 생성 / 주소 설정 주소 바인드 소켓 주소 출력

28 IP 주소 처리 - inet_aton(3) 함수 (계속)
초기화 int z; struct sockaddr_in adr_inet; /* AF_INET */ int len_inet; /* length */ int sck_inet; /* Socket */ 소켓 생성 sck_inet = socket(AF_INET,SOCK_STREAM,0);

29 IP 주소 처리 - inet_aton(3) 함수 (계속)
주소 설정 memset(&adr_inet,0,sizeof adr_inet); // 초기화 adr_inet.sin_family = AF_INET; // 도메인 설정 adr_inet.sin_port = htons(9000); // 포트 설정 // 주소 변환 실패하면 bail 함수 호출 if ( !inet_aton(" ", &adr_inet.sin_addr) ) bail("bad address."); len_inet = sizeof adr_inet; // 길이 설정

30 IP 주소 처리 - inet_aton(3) 함수 (계속)
주소 바인드 z = bind(sck_inet, (struct sockaddr *)&adr_inet, len_inet); 소켓 주소 출력 system("netstat -pa --tcp 2>/dev/null| grep inetaton"); 실행결과 tcp : *:* CLOSE /inetaton

31 IP 주소 처리 - inet_ntoa(3) 함수
char *inet_ntoa(struct in_addr addr); addr -> 변환할 IP 주소를 저장하고 있는 구조체 성공하면 문자열 IP 주소의 포인터가 반환 내부 변수에 결과를 저장하기 때문에 다음에 호출 되기 전까지만 유효한 결과를 가진다.

32 IP 주소 처리 - inet_ntoa(3) 함수(계속)
예제 3.5 inetntoa.c 초기화 주소 설정 함수 호출 후 결과 출력

33 IP 주소 처리 - inet_ntoa(3) 함수(계속)
초기화 struct sockaddr_in adr_inet; /* AF_INET */ int len_inet; /* length */ 주소 설정 memset(&adr_inet,0,sizeof adr_inet); // 구조체 초기화 adr_inet.sin_family = AF_INET; // Domain 설정 adr_inet.sin_port = htons(9000); // 포트번호 설정 // 주소 설정 “ ” -> adr_inet.sin_addr if ( !inet_aton(" ",&adr_inet.sin_addr)) puts("bad address.");

34 IP 주소 처리 - inet_ntoa(3) 함수(계속)
함수 호출 및 결과 출력 printf("The IP Address is %s\n",inet_ntoa(adr_inet.sin_addr)) 실행 결과 The IP Address is

35 IP 주소 처리 - inet_network(3) 함수
마스크 값을 호스트 비트 혹은 네트워크 비트에 적용 할 때 사용 unsigned long inet_network(const char *addr); addr -> 10진 IP주소를 포함하는 문자열 반환값은 호스트 순서 32비트 IP 주소 실패시 0xFFFFFFFF(모두 1)

36 IP 주소 처리 - inet_network(3) 함수(계속)
net_addr = inet_network(" ") & 0xFFFFFF00; 결과 => 0xC0A80900 (10진수 ) 을 16진수로 변환 -> C0 A C0 A & FF FF FF 00 = C0 A

37 IP 주소 처리 - inet_network(3) 함수(계속)
예제 3.6 network.c 초기화 함수 호출 후 결과 출력

38 IP 주소 처리 - inet_network(3) 함수(계속)
초기화 int x; const char *addr[] = {" ", " ", " ", “ "}; unsigned long net_addr; 함수 호출 후 결과 출력 net_addr = inet_network(addr[x]); printf("%14s = 0x%08lX net 0x%08lX\n", addr[x],net_addr, (unsigned long)htonl(net_addr)) ※ htonl 함수 : 호스트 순서 주소를 네트워크 순서 주소로 변환

39 IP 주소 처리 - inet_network(3) 함수(계속)
실행 결과 = 0x2C87560C net 0x0C56872C = 0x7F net 0x F = 0xAC10175F net 0x5F1710AC = 0xC0A80901 net 0x0109A8C0 C0 09 = 0x C0 A net 0x A8 C0 A8 01

40 IP 주소 처리 - inet_lnaof(3) 함수
IP 주소에서 네트워크 ID 부분을 제외한 호스트 ID 부분만을 반환 unsigned long inet_lnaof(struct in_addr addr); addr -> 네트워크 바이트 순서의 IP 주소 반환값 -> addr의 호스트 ID 부분

41 IP 주소 처리 - inet_lnaof(3) 함수 (계속)
클래스 16진수값 10진표기법 A C B F C (10진수) 2C C (16진수)

42 IP 주소 처리 - inet_netof(3) 함수
Inet_lnaof(3) 함수와 유사 Host ID 대신 네트워크 ID 반환 unsigned long inet_netof(struct in_addr addr); addr -> 네트워크 바이트 순서의 IP 주소 반환값 -> addr의 네트워크 ID 부분

43 IP 주소 처리 - inet_netof(3) 함수 (계속)
클래스 16진수값 10진표기법 A C F B 0000AC10 C 00C0A809 (10진수) 2C C (16진수)

44 IP 주소 처리 - inet_makeaddr(3) 함수
inet_lnaof(3) 함수와 inet_netof(3)함수가 에서 분리한 네트워크 iD와 호스트 ID를 다시 결합하여 원래의 IP 주소를 생성 struct in_addr inet_makeaddr(int net,int host); net -> inet_netof 함수에서 추출한 네트워크 ID host -> inet_lnaof 함수에서 추출한 호스트 ID 반환값 -> 원래의 IP 주소를 저장한 in_addr구조체

45 IP 주소 처리 - inet_makeaddr(3)함수(계속)
예제 3.7 makeaddr.c 초기화 소켓 생성 / 주소 설정 주소 분리(호스트 ID와 네트워크 ID) 및 출력 구조체 재초기화 재결합 및 출력

46 IP 주소 처리 - inet_makeaddr(3)함수(계속)
초기화 int x; // for문의 첨자 struct sockaddr_in adr_inet; /* AF_INET */ // 예제 IP 주소들 const char *addr[] = { " ", " ", " ", " " }; // 네트워크 ID와 호스트 ID를 위한 변수 unsigned long net, hst;

47 IP 주소 처리 - inet_makeaddr(3)함수(계속)
소켓 생성 및 주소 생성 memset(&adr_inet,0,sizeof adr_inet); // 메모리 초기화 adr_inet.sin_family = AF_INET; // 도메인 설정 adr_inet.sin_port = htons(9000); // 포트번호 설정 if ( !inet_aton(addr[x],&adr_inet.sin_addr) ) // 주소 생성 puts("bad address."); ※ htonl 함수 : 호스트 순서 주소를 네트워크 순서 주소로 변환 inet_aton : 문자열을 IP 주소로 변환

48 IP 주소 처리 - inet_makeaddr(3)함수(계속)
주소 분리 및 출력 // 호스트 ID 추출 hst = inet_lnaof(adr_inet.sin_addr); // 네트워크 ID 추출 net = inet_netof(adr_inet.sin_addr); // 추출 내용 출력 (기존의 IP, 네트워크 ID, 호스트 ID) printf("%14s : net=0x%08lX host=0x%08lX\n", inet_ntoa(adr_inet.sin_addr), net, hst);

49 IP 주소 처리 - inet_makeaddr(3)함수(계속)
구조체 재 초기화 재구성할 IP 주소를 보다 명확히 보여주기 위해서 memset(&adr_inet,0,sizeof adr_inet); // 메모리 초기화 adr_inet.sin_family = AF_INET; // 도메인 설정 adr_inet.sin_port = htons(9000); // 포트번호 설정

50 IP 주소 처리 - inet_makeaddr(3)함수(계속)
주소의 재결합 및 출력 재결합 adr_inet.sin_addr = inet_makeaddr(net,hst); 출력 printf("%14s : %s\n\n", "inet_makeaddr", inet_ntoa(adr_inet.sin_addr));

51 IP 주소 처리 - inet_makeaddr(3)함수(계속)
실행 결과 : net=0x C host=0x C inet_makeaddr : : net=0x F host=0x inet_makeaddr : : net=0x0000AC10 host=0x F inet_makeaddr : : net=0x00C0A809 host=0x inet_makeaddr : C0 A : C클래스 주소

52 요약 함 수 명 개요 문자열 IP 주소를 32비트 IP주소로 변환 32비트 IP주소를 문자열 IP 주소로 변환
inet_addr 함수 문자열 IP 주소를 32비트 IP주소로 변환 inet_aton 함수 inet_ntoa 함수 32비트 IP주소를 문자열 IP 주소로 변환 inet_network 함수 IP 주소를 호스트 순서 -> 네트워크 순서로 변환 inet_lnaof 함수 IP 주소에서 호스트 주소 부분 추출 inet_netof 함수 IP 주소에서 네트워크 주소 부분 추출 inet_makeaddr 함수 분리된 호스트 주소와 네트워크 주소를 결합


Download ppt "한남대학교 컴퓨터공학과 컴퓨터 네트워크 실험실"

Similar presentations


Ads by Google