160 likes | 400 Views
µ IP TCP/IP Stack. 2003.11.1 이재홍 pyrasis 에 chol.com. uIP 0.9 ?. uIP 0.9 공식 홈페이지 http://www.dunkels.com/adam/uip/ 공개 TCP/IP 스택으로 Swedish Institute of Computer Science 의 Adam Dunkels 이라는 사람이 제작. 1. 목적. 공개 TCP/IP 스택을 실시간 운영체제 , 소형 임베디드 시스템에 활용하여 TCP/IP 통신의 구현
E N D
µIP TCP/IP Stack 2003.11.1 이재홍 pyrasis 에 chol.com
uIP 0.9 ? • uIP 0.9 공식 홈페이지 http://www.dunkels.com/adam/uip/ • 공개 TCP/IP 스택으로 Swedish Institute of Computer Science 의 Adam Dunkels이라는 사람이 제작
1. 목적 • 공개 TCP/IP스택을 실시간 운영체제, 소형 임베디드 시스템에 활용하여 TCP/IP 통신의 구현 • uIP를 이해하기 위해서는 먼저 예제의 이해가 필수적이다. • 예제프로그램을 통한 uIP의 작동방식과 흐름을 이해한다.
2. uIP 0.9의 디렉토리 구성 uip-0.9 apps : uIP TCP/IP 스택을 사용한 응용프로그램들 httpd resolv smtp telnet telnetd webclient doc : uIP의 문서들 html uip : TCP/IP 스택 소스 unix : Unix, Linux에서 실행 가능한 예제 프로그램
3. uIP 0.9의 파일 uip/ uip_arp.h uip_arp.c : ARP 프로토콜 처리 부분 uip_arch.h : 아키텍쳐 의존적 부분 설정 헤더파일 uip.h uip.c : uip의 소스코드 slipdev.h slipdev.c : slip 드라이버 소스코드 unix/ main.c : 예제 프로그램 메인 tapdev.c : Tun/Tap 디바이스 드라이버 소스코드 tapdev.h uip_arch.c : 아키텍쳐 의존적인 부분 uipopt.h : 변수 타입, IP설정, 각종 설정 부분
4. 발표 내용 • 예제 프로그램 분석 : 예제의 동작을 보면서 uIP의 소스를 분석한다. • 리눅스에서 예제를 컴파일 해서 동작시켜본다.
5. 준비과정 • 예제를 동작시키기 위해서 커널 컴파일에서 아래의 옵션을 체크하고 커널을 다시 컴파일 한다. 리눅스 커널 옵션 Network device support ---> <M> Universal TUN/TAP device driver support • 다음 명령을 입력하여 장치를 생성한다. # mkdir /dev/net # mknod /dev/net/tun c 10 200
6. 예제 프로그램 컴파일 및 실행 uip/unix 디렉토리에서 make로 컴파일하고 실행. # make # ./uip 다른 터미널에서 ifconfig를 실행해서 tap0 장치가 만들어졌는지 확인 웹 브라우저로 http://192.168.0.2 로 접속 예제 웹 서버에 접속할 수 있다.
7. 로컬 네트워크 에서의 ARP 통신의 과정 MAC 01:02:03:04:05:06 IP 192.168.0.10 컴퓨터 1 IP 192.168.0.5 나의 MAC 주소는 0A:06:07:04:02:F6 ARP Reply IP 192.168.0.5의 MAC 주소는? ARP Request Broadcast 라우터 1 MAC 67:89:AB:CD:EF:00 IP 192.168.0.254 게이트웨이 컴퓨터 A 컴퓨터 1과 2의 통신 컴퓨터 2 라우터 2 MAC 0A:06:07:04:02:F6 IP 192.168.0.5 컴퓨터 B
8. 일반 네트워크 에서의 ARP 통신의 과정 MAC 01:02:03:04:05:06 IP 192.168.0.10 컴퓨터 1과 B의 통신 컴퓨터 1 게이트웨이 IP 192.168.0.254 나의 MAC 주소는 0A:06:07:04:02:F6 ARP Reply 서로 ARP통신을 주고 받아 MAC 주소를 알고 있다. 라우터 1 MAC 67:89:AB:CD:EF:00 IP 192.168.0.254 게이트웨이 MAC 4F:2C:F6:33:E2:04 IP 211.200.21.254 게이트웨이 컴퓨터 A 컴퓨터B IP 211.200.21.10은 로컬 네트워크가 아니네? 게이트웨이 IP 192.168.0.254의 MAC 주소는? ARP Request Broadcast 라우터 2 컴퓨터 B IP 211.200.21.43 나의 MAC 주소는 17:36:9F:32:90:43 ARP Reply IP 211.200.21.10의 MAC 주소는? ARP Request Broadcast 컴퓨터 B ARP 통신이 끝난 뒤에는 끝과 끝의 MAC주소를 알 수 있게 된다. 최초 발신지 MAC주소는 계속 가지고 간다. 라우터 등을 지날 때는 목적지 MAC주소가 변한다. MAC 17:36:9F:32:90:43 IP 211.200.21.10
9. ARP 통신 이후. • ARP통신 이후에는 각 컴퓨터와 라우터들의 ARP테이블에 MAC주소가 저장되게 된다. • 한번 ARP통신을 이루었으므로 ARP테이블에 지금까지 통신했던 모든 것들이 저장되어 있기 때문에. 다시 ARP통신을 하지 않고 바로 MAC주소를 바꿔서 보낼 수가 있는 것이다. • 이후. TCP, ICMP, UDP통신을 하면 라우터에 의해서 이더넷 헤더의 목적지 MAC주소가 바뀌게 된다. 최초 발신지 MAC주소는 계속 가지고 있다. • 우리가 외부에서 통신한 패킷들은 라우터에서 나온 패킷들이다. 패킷들을 조사해보면 모두 라우터(게이트웨이)와 통신한 것들이다.
10. 예제 프로그램 소스 분석, 초기화 main() tapdev_init() : 네트웍 드라이버 초기화 tap0 네트웍 장치에 192.168.0.1의 IP 설정 uip_init() : uip 초기화 uip_hostaddr에 192.168.0.2의 IP 설정 httpd_init() : http 서버 초기화 fs_init()으로 파일 시스템 초기화 uip_listen(HTONS(80));으로 80번 포트 listen 상태로 만듦
11. 예제 프로그램 소스 분석, 송신 while(1) { }로 무한 루프, 폴링 방식 송신 uip_len = tapdev_read(); 받은 패킷의 길이를 리턴 for(i = 0; i < UIP_UDP_CONNS; i++) { uip_periodic(i); 패킷의 길이가 0이면 TCP연결 처리 루틴을 10번 수행한다. uip_arp_out(); ARP패킷을 생성한다. tapdev_send(); 패킷을 보낸다. }
12. 예제 프로그램 소스 분석, 수신 수신 if(BUF->type == htons(UIP_ETHTYPE_IP)) { uip_arp_ipin(); uip_input(); 패킷의 타입이 IP이면 uip_arp_ipin()함수로 IP프로토콜을 ARP처리한다. uip_input()으로 패킷을 받는다. else if(BUF->type == htons(UIP_ETHTYPE_ARP)) { uip_arp_arpin(); 패킷의 타입이 ARP이면 uip_arp_arpin()으로 ARP프로토콜을 ARP처리한다.
13. httpd 웹서버의 동작 과정 송수신 루틴 uip_arp_arpin(); uip_arp_ipin(); uip_arp_out(); uip_input(); tapdev_read(); tapdev_send(); 초기화 tapdev_init(); uip_init(); httpd_init(); #define uip_periodic(conn) do { uip_conn = &uip_conns[conn]; \ uip_process(UIP_TIMER); } while (0) #define UIP_APPCALL httpd_appcall TCP/IP 처리 루틴 uip_periodic(); -> uip_process(); uip_process(); -> UIP_APPCALL(); UIP_APPCALL(); -> httpd_appcall(); httpd_appcall을 UIP_APPCALL로 정의했다. 이것은 httpd.h에 정의 되어 있다. httpd가 아닌 다른 어플리케이션을 연결 하고 싶다면 telnet_app등을 UIP_APPCALL로 정의한다. 범용적인 스택이 아니기 때문에 리눅스등의 스택과는 다르게 많이 축소된 모습을 볼 수가 있다. 이렇게 매우 축소 되어 있기 때문에 할 수 있는 일이 제한적이다.
14. uC/OS-II에 포팅 • 타겟 시스템 : PC+랜카드, 임베디드 개발 보드+이더넷 칩, 기타 시스템+이더넷 칩 1. uC/OS-II에 포팅하기 위해 필요한 것들. 2. 가장 먼저 해야 할 일. • 포팅 하려고 하는 시스템의 이더넷 카드 혹은 이더넷 칩의 드라이버 구현. 3. 주요 작업 • 사용 하고자 하는 Application을 정하고 거기에 맞추어 uIP를 수정하고 이더넷 드라이버 부분과 uIP부분을 결합. Application + uIP TCP/IP Stack + Ethernet Device Driver