TCP/IP Network Experimental Programming [IPv6에 의한 통신 실험] 이 직 수 네트워크 실험실
목차 IPv6 등장 배경 IPv6란 IPv6의 헤더 구조 IPv6를 위해 추가된 구조체 IPv6를 위해 추가된 함수
IPv6 등장 배경 현재 사용되고 있는 IPv4는 IP 어드레스 32bit로 표현
IPv6란 IPv6 IPv4 차세대 IP 모델 어드레스가 128bit로 표현되는 막대한 수의 호스트를 지원 예 : 2001:0230:abcd:ffff:0000:0000:ffff:1111 차세대 인터넷은 모든 전자 제품이 네트워크에 통합되는 방향이므로 현재보다 엄청난 IP 어드레스를 요구하는데 이를 해결하기 위해 등장
IPv6란 IPv6 특징 128bit 주소 체계로 무한대의 IP 개수 지원 다른 대역폭에서도 전송되는 패킷을 특수 처리 가능 실시간 multimedia 지원 보안 기능 추가 Ipsec을 프로토콜에 포함 IPv4와 호환 문제로 점진적으로 적용시키고 있음
IPv6의 헤더 구조 IPv6 헤더
IPv6의 헤더 구조 IPv6 헤더 구조체 Struct ip6_hdr{ union { u_int32_t ip6_unl_flow; // 4 bits version // 8 bits traffic class // 20 bits flow-ID u_int16_t ip6_un1_plen; // payload length u_int8_t ip6_un1_nxt; // netx header u_int8_t ip6_un1_hlim; // hop limit } ip6_unl; u_int8_t ip6_un2_vfc; // 4 bits version // top 4 bits traffic class } ip6_ctlun; struct in6_addr ip6_src; // source address struct in6_addr ip6_dst; // destination address };
IPv6의 헤더 구조 Version : 버전을 나타냄(값 6) 4bit Traffic Class : IPv4의 서비스 형태(TOS)를 나타냄 8bit Flow Label : 품질제어 20bit 사용시 – Flow Label을 난수로 결정하고 RSVP(ReSerVation Protocol) 등의 흐름을 설정하는 프로토콜을 이용하여 경로상의 라우터에 품질 제어에 관한 설정을 함 미사용시 – all zero Payload Length: IP 데이터그램의 헤더를 뺀 데이터부 길이 IPv4의 프로토콜 필드에 해당
IPv6의 헤더 구조 Hop Limit : 통과할 수 있는 라우터의 수 제한 IPv4의 TTL과 같은 의미 Source IP 주소 : 발신자 128 bit 주소 Destination IP 주소 : 수신자 128 bit 주소
IPv6를 위해 추가된 구조체 Sockaddr_in6 IP주소와 포트번호를 저장하기 위해 sockaddr_in6구조체 정의 Struct sockaddr_in6{ u_int8_t sin6_len; // length of this struct u_int8_t sin6_family; // AF_INET6 u_int16_t sin6_port; // transport layer port u_int32_t sin6_flowinfo; // IP6 flow information struct in6_addr sin6_addr; // IP6 address u_int32_t sin6_scope_id; // interface scope id };
IPv6 를 위해 추가된 구조체 In6_addr 구조체 : IPv6의 주소 정의 Addrinfo 구조체 : list 구조로 설계 Struct in6_addr{ u_int8_t s6_addr[16]; }; Struct addrinfo{ int ai_flags; // ai_passive, ai_canonname, ai_numerichost int ai_family; // AF_xxx int ai_socktype // sock_xxx int ai_protocol; // 0 or IPPROTO size_t ai_addrlen; // length of ai_addr char ai_canonname; // canonical name for nodename struct sockaddr *ai_addr; // binary address struct addrinfo *ai_next; // next structure in linked list };
IPv6 를 위해 추가된 구조체 ai_flag : 세 개의 비트 설정 ai_family : 어드레스 패밀리 AI_PASSIVE – 임의의 어드레스를 이용할때(ipv4 INADDR_ANY) AI_CANONNAME – 최초의 list 구조에 정식 명칭을 저장할 때 AI_NUMERICHOST – DNS 검색(X), IP 주소(O) 검색 DNS 검색 시간 줄이고자 할 때 ai_family : 어드레스 패밀리 IPv4를 나타내는 AF_INET IPv6를 나타내는 AF_INET6 ai_socktype : 소켓의 타입 SOCK_STREAM : stream 형 소켓 SOCK_DGRAM : datagram 형 소켓 SOCK_RAW : raw IP 형
IPv6 를 위해 추가된 구조체 ai_protocol : 트랜스포트 프로토콜을 나타냄 TCP – IPPROTO_TCP 저장 UDP – IPPROTO_UDP 저장 미사용시 – 0값 저장 ai_addr : ai_addr 길이를 나타냄 ai_canonname : 별명을 나타냄 ai_next : list 다음의 어드레스를 나타냄 List가 끝날 경우 NULL이 저장
IPv6를 위해 추가된 함수 Inet_pton, inet_ntop inet_pton : 문자열 IP 주소를 2진수 IP 주소로 변환 inet_pton : 2진수 IP 주소를 문자열 IP 주소로 변환 #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> Const char *inet_ntop (int af, const void *src, char *dst, size_t size); Int inet_pton(int af, const char *src, void *dst);
IPv6를 사용한 실험 프로그램 개요 클라이언트 : tcpv6c, 서버 : tcpv6s
IPv6를 사용한 실험 프로그램 사용 방법(서버) 서버 실행 => tcpv6s는 IPv6와 IPv4 양쪽 모두의 TCP 커넥션을 받아들임 포트 번호 : 서버가 연결을 받아들이는 포트 번호 지정 Default : 5320 ./tcpv6s [포트 번호]
IPv6를 사용한 실험 프로그램 사용 방법(클라이언트) 서버의 IP 어드레스 => IPv4 주소, IPv6 주소, 도메인명 모두 가능 포트 번호 : 서버측에 열려있는 포트번호 Default : 5320 ./tcpv6c 서버의 IP 어드레스 [포트 번호]
IPv6를 사용한 실험 프로그램 사용 방법(클라이언트) 서버는 IPv6 주소 방식이 아니므로 위 예제와 같이 접근이 불가 ./tcpv6c fe80::250:4ff:fe22:8727% 10
IPv6를 사용한 실험 프로그램 실행 예(서버) ./tcpv6s
IPv6를 사용한 실험 프로그램 실행 예(클라이언트) ./tcpv6c 203.247.39.59
IPv6를 사용한 실험 프로그램 사용 방법(서버 접속후) 다음의 명령어를 입력할 수 있음 Help : 사용할 수 있는 명령어의 표시 Show route : 서버의 라우팅 테이블의 표시 Show nic : 서버의 NIC 정보의 표시 Show arp : 서버의 ARP 테이블의 표시 Show tcp : 서버의 TCP 연결 정보 표시 Quit : 클라이언트 프로그램 종료
IPv6를 사용한 실험 프로그램 실행 예(클라이언트 실행 후) Help 명령어 리스트를 출력
IPv6를 사용한 실험 프로그램 (클라이언트 실행 후) 실행 예 Show route 서버 라우팅 테이블을 출력
IPv6를 사용한 실험 프로그램 (클라이언트 실행 후) 실행 예 Show arp 서버의 arp 테이블 출력
IPv6를 사용한 실험 프로그램 (클라이언트 실행 후) 실행 예 Show nic 서버의 nic 정보 출력
IPv6를 사용한 실험 프로그램 (클라이언트 실행 후) 실행 예 quit 서버 접속 종료
IPv6를 사용한 실험 프로그램 서버측 화면(클라이언트 접속)
IPv6를 사용한 실험 프로그램 tcpv6s 와 tcps 차이점 어드레스 패밀리가 AF_INET6임 sockaddr_in 구조체에서 sockaddr_in6 구조체로 in_addr 구조체에서 in6_addr 구조체로 구조체의 변경에 따라 구조체의 멤버명 변경
IPv6 실험을 위한 리눅스 환경 설정 커널 설정 에러 컴파일까지 완료하고 명령어 ./tcpv6s 실행시 에러발생 해결 : IPv6 모듈을 실행(modprobe 실행)
IPv6 실험을 위한 리눅스 환경 설정 ./sbin/modprobe 리눅스와 커널 버전에 따라 위치 다양
IPv6 실험을 위한 리눅스 환경 설정 IPv6 참고 자료 커널관련 자료 URL http://blog.naver.com/minzkn.do?Redirect=Log&logNo=60012995540 커널관련 자료 URL http://www.joinc.co.kr/modules/moniwiki/wiki.php/kernel_module_programing
Q & A