320 likes | 560 Views
TCP/IP Network Experimental Programming [IPv6 에 의한 통신 실험 ]. 이 직 수 네트워크 실험실. 목차. IPv6 등장 배경 IPv6 란 IPv6 의 헤더 구조 IPv6 를 위해 추가된 구조체 IPv6 를 위해 추가된 함수 IPv6 를 사용한 실험 프로그램 IPv6 실험을 위한 리눅스 환경 설정. IPv6 등장 배경. 현재 사용되고 있는 IPv4 는 IP 어드레스 32bit 로 표현 32 비트로 현재 요구되는 IP 어드레스 수를 충족하기에 역부족
E N D
TCP/IP Network Experimental Programming [IPv6에 의한 통신 실험] 이 직 수 네트워크 실험실
목차 • IPv6 등장 배경 • IPv6란 • IPv6의 헤더 구조 • IPv6를 위해 추가된 구조체 • IPv6를 위해 추가된 함수 • IPv6를 사용한 실험 프로그램 • IPv6 실험을 위한 리눅스 환경 설정
IPv6 등장 배경 • 현재 사용되고 있는 IPv4는 • IP 어드레스 32bit로 표현 • 32 비트로 현재 요구되는 IP 어드레스 수를 충족하기에 역부족 • 유비쿼터스 등 첨단 기술에 적용하는데 기존의 IPv4는 무리가 있음
IPv6란 • IPv6 • IPv4 차세대 IP 모델 • 어드레스가 128bit로 표현되는 막대한 수의 호스트를 지원 • IPv4 : 2의 32제곱(43억)개 IP 주소 • IPv6 : 2의 128제곱(43억×43억×43억×43억)개 IP 주소 • 16bit 단위로 16진수로 표현 • 예 : 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_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 주소 방식이 아니므로 위 예제와 같이 접근이 불가 • 서버에 접근하기 위해 IPv4로 접근 ./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 모듈이 올라가지 않은 현상 • 해결 : IPv6 모듈을 실행(modprobe 실행)
IPv6 실험을 위한 리눅스 환경 설정 • ./sbin/modprobe • 리눅스와 커널 버전에 따라 위치 다양
IPv6 실험을 위한 리눅스 환경 설정 • IPv6 참고 자료 • http://blog.naver.com/minzkn.do?Redirect=Log&logNo=60012995540 • 커널관련 자료 URL • http://www.joinc.co.kr/modules/moniwiki/wiki.php/kernel_module_programing