2004년 2월
고친 과정 | |
---|---|
고침 0.1 | 2004-02-16 |
최초 작성 |
초록
이 문서에서는 KENS(KAIST Educational Network System)를 실행하고, 어떻게 실습을 하는가에 대해서 다룬다.
차례
그림 목록
표 목록
현재 대학에서 이루어지고 있는 네트워크 강의가 교과서에 의존하는 경향이 있어, 학생들이 실제 시스템 안에서 TCP/IP가 어떻게 작동되는지에 대해서 충분한 실습을 못하는 실정이다.
KENS는 이와 같은 문제점을 개선하기 위해 운영체제 과목에서 널리 쓰이고 있는 Nachos나 데이터베이스 과목에서 널리 쓰이고 있는 MiniBase 처럼, network 관련 과목의 실습을 돕기 위하여 KAIST Network Computing Lab.에서 자체 개발한 환경이다.
학생들은 KENS를 이용하여 크게 세 가지 부분에 대해서 실습을 할 수 있다.
KENS가 제공하는 표준 socket programming API와 호환되는 API를 이용하여, KENS에서 실행되는 application을 작성해 볼 수 있다.
OSI-7 layer의 transport layer에 해당하는 TCP 프로토콜과 관련된 여러가지 알고리즘들을 직접 구현하여 테스트 해 볼 수 있다.
OSI-7 layer의 network layer에 해당하는 IP 프로토콜과 관련된 여러가지 알고리즘들(라우팅 알고리즘 등)을 직접 구현하여 테스트 해 볼 수 있다.
이 장에서는 KENS의 구조에 대해서 자세하게 알아보도록 한다
아래 그림은 KENS와 KENS library를 이용하여 작성된 KENS 응용 프로그램 사이의 전체적인 관계를 나타내는 그림이다.
위 그림에서는 간단하게 두 개의 KENS 응용 프로그램이 하나의 소켓만을 이용하는 경우를 나타냈지만, 실제로는 한 응용 프로그램에서 여러개의 소켓을 동시에 사용할 수도 있고, 여러 KENS 응용 프로그램이 하나의 KENS 호스트에서 동시에 실행될 수도 있다.
그럼 KENS를 구성하고 있는 각각의 컴포넌트들에 대해서 간단하게 살펴보도록 하자.
KENS 라이브러리는 KENS 호스트 프로그램에서 제공하는 system call simulation을 이용하여 KENS 호스트에 KENS socket을 만들고, 자기 자신 혹은 KENS 호스트들로 이루어진 network 상의 다른 KENS 호스트에서 실행되고 있는 KENS 응용 프로그램과 통신을 하게 해 주는 라이브러리이다.
KENS 라이브러리가 실제 socket 대신 생성하는 KENS socket은 그림 2.1. KENS와 KENS 응용 프로그램의 전체 구조에서 보듯이 실제로는 system call을 시뮬레이션 하기 위한 UDP 소켓과, KENS 응용 프로그램 데이터를 전송하고 전송받기 위한 TCP 소켓이 한 쌍이 되어 하나의 KENS socket이 된다.
KENS 라이브러리에는 표 3.1. KENS library의 API와 대응하는 표준 함수들에 나와 있는 함수들이 구현되어 있으며, 모든 함수들은 POSIX 표준 혹은 BSD socket library 함수들과 호환된다.
따라서, KENS 응용 프로그램을 작성하고 실행하기 위해서는 반드시 KENS 라이브러리와 함께 링크해야만 한다. KENS 응용 프로그램의 작성에 관련된 내용은 3장. KENS 응용 프로그램의 작성를, 각 system call 별 동작 메커니즘은 프로그래밍 가이드를 참조하기 바란다.
KENS Kernel은 KENS 호스트의 초기화와 “KENS Library”에서 들어오는 system call을 받아서 처리해 주거나, “Transport Layer”와 “Datalink Layer”를 차례대로 호출하여, KENS 응용 프로그램에서 보내는 데이터와 다른 KENS 호스트로부터 전달 받는 데이터를 처리하는 일을 한다.
KENS kernel이 하는 일 중의 가장 중요한 부분 중의 하나가 바로 dispatch이다. KENS kernel은 system call 처리 부분, datalink 처리 부분, network 처리 부분을 계속 순차적으로 호출하여 KENS 호스트가 계속해서 실행되도록 하는 역할을 한다.
KENS의 transport layer에서는 현재 TCP만을 지원하고 있다.
KENS에 기본적으로 구현되어 있는 TCP는 상위 KENS kernel의 dispatch loop에서 호출하는 인터페이스(함수)와, “System Call” 처리 부분에서 호출하는 인터페이스들, 그리고 프로토콜 스택 중 바로 하위 레이어인 “Network Layer”에서 KENS 응용 프로그램으로 데이터를 전달하기 위해 호출하는 인터페이스들과 TCP 자체의 메커니즘들을 구현하고 있다.
각 system call 별 동작 메커니즘과 구체적인 인터페이스들은 프로그래밍 가이드를 참조하기 바란다.
KENS의 network layer에서는 현재 IP만을 지원하고 있다.
Network layer에서는 Transport layer에서 내려오는 패킷들과 KENS 호스트를 거쳐 다른 네트워크로 전송되어야 하는 패킷들을 어떤 경로로 전송해야 하는지 결정하는 라우팅(routing)이 일어 나며, 기본적으로 정적 라우팅(static routing)이 구현되어 있다.
KENS에 기본적으로 구현되어 있는 IP는 “Transport Layer”와 마찬가지로 상위 레이어에서 패킷을 전송하기 위해 호출하는 인터페이스와, 하위 레이어인 “Datalink Layer”에서 네트워크를 통해 전송받은 패킷을 처리하기 위해 호출하는 인터페이스, 그리고 각종 라우팅 알고리즘들을 구현하기 위한 인터페이스들과, IP 패킷을 처리하기 위한 기본적은 메커니즘들을 구현하고 있다.
IP 패킷 처리와 라우팅의 동작 메커니즘들, 그리고 구체적인 인터페이스들은 프로그래밍 가이드를 참조하기 바란다.
datalink layer는 ???에서 내려온 패킷을 네트워크를 통해 전송하거나, 네트워크로부터 전송받은 패킷을 ???에 올려주는 일을 한다.
KENS의 datalink layer는 UDP를 그대로 이용하여 가장 널리 쓰이는 Ethernet을 시뮬레이션 하였다. 그림 2.1. KENS와 KENS 응용 프로그램의 전체 구조의 맨 오른쪽의 bound UDP socket들은 KENS 호스트에 설치된 VNIC(Virtual Network Interface Card)들에 해당하며, Ethernet의 address인 MAC address는 그대로 bound UDP socket의 IP 주소와 port 번호로 대응된다.
datalink layer에 관련된 자세한 사항들은 프로그래밍 가이드를 참조하기 바란다.
이 장에서는 KENS의 구조에 대해서 자세하게 알아보도록 한다
KENS는 표준 소켓 인터페이스에 대응하는 API를 제공하며, 학생들은 이 API를 이용하여 실제 네트워크 프로그램을 작성하는 것과 동일하게 KENS 응용 프로그램을 작성할 수 있다.
KENS에서 제공하는 API들은 표준 함수들의 이름 앞에 'k'를 접두사로 사용한 이름들을 가지고 있다. 아래의 표는 KENS library에서 제공하고 있는 함수들과 대응하는 표준 함수들을 나타낸 것이다.
차례
이 장에서는 KENS와 KENS 응용 프로그램을 실행하는데 필요한 사항들을 알아본다.
하나의 KENS를 실행시키기 위해서는 다음의 환경설정 파일들이 반드시 KENS가 실행되는 디렉토리와 같은 디렉토리에 있어야만 한다.
KENS의 환경 설정 파일 : KENS의 전체적인 설정을 위해 필요
MAC 주소 목록 파일 : KENS가 시뮬레이션하는 호스트에 설치된 각각의 NIC들과 물리적으로 같은 네트워크에 연결되어 있다고 할 NIC 주소들의 목록
라우팅 규칙 목록 파일 : KENS가 시뮬레이션하는 호스트의 IP 패킷을 라우팅하는 규칙을 기술한 파일. 실제 호스트의 라우팅 테이블 정보에 해당한다.
KENS의 환경설정 파일은 KENS의 실행에 가장 핵심이 되는 정보들을 기술하고 있다. 이 정보들에는 KENS 호스트의 이름, KENS가 시스템 콜의 인터페이스로 사용할 UDP, TCP 포트 번호, 디버깅을 위한 로깅 정보 그리고 KENS 호스트에 설치된 VNIC(Virtual Network Interface Card)들의 정보와 기본 게이트웨이에 대한 정보 등이 있다.
KENS의 환경 설정 파일은 Windows에서 사용되는 INI 파일 형식을 따르고 있다. 이 INI 파일에는 KENS 호스트의 전체적인 환경을 기술하는 KENS 섹션과, 각각의 VNIC마다 정보를 기술하는 섹션들로 나뉘어 있다.
환경설정 파일 중 KENS 섹션은 반드시 있어야하며, VNIC에 관련된 섹션은 설치된 VNIC 갯수만큼 있어야 한다. 다음은 설정 파일의 예시이다.
[KENS] server_name=sample udp_port=9998 tcp_port=9999 log_level=ip,tcp_layer,sock,link_layer unreliable=false default_route=192.168.0.1 [seth0] address=192.168.0.1 netmask=255.255.255.0 [seth1] address=192.168.1.1 netmask=255.255.255.0
INI 파일에서 '[', ']'로 둘러 쌓인 부분이 섹션이름이고, 섹션 다음에는 '이름' = '값'의 형식으로 파라메터들이 기술된다.
KENS 섹션에는 KENS 프로그램 자체가 실행하는데 필요한 정보들을 기술하고 있다. 실제 상황에서는 호스트 자체 에 대한 설정들이라고 보면 될 것이다.
KENS 섹션에서 기술할 수 있는 것들에 대해서 알아보자.
표 4.3. 환경 설정 : log_level
필요 유무 |
생략 가능 |
기본 값 |
로그를 남기지 않음 |
설명 |
KENS에서 남길 디버깅 로그의 종류를 정의한다. 사용할 수 있는 로그의 종류는 다음과 같다.
|
KENS 호스트 각각의 로그는 KENS가 실행되고 있는 현재 디렉토리에 서버이름.log라는 파일에 저장된다. KENS의 디버깅을 할 때에는 log level을 설정하여 로그 파일을 참조하면 편리하다.
KENS 호스트 프로그램에 설치되는 각각의 VNIC들에 대한 가상 IP 주소와 local network mask를 설정한다. 각 섹션의 이름은 seth_#(#은 VNIC 번호, seth는 simulated ethernet의 약자)여야 한다. VNIC 번호는 0부터 시작하여 1씩 증가한다.
예를 들어, KENS 호스트를 gateway로 설정할 경우 두 개의 VNIC가 설치되어 있어야 하며, 이 경우 반드시 'seth0'와 'seth1'의 두 개의 섹션에서 각 VNIC에 대한 정보를 명시해 주어야 한다.
KENS에서는 datalink를 UDP로 시뮬레이션하고 있다. 따라서 실제로 사용되는 Ethernet의 MAC 주소 대신에 실제 host의 IP 주소와 port번호로 NIC(Network Interface Card)의 하드웨어 주소로 사용한다.
KENS에서는 local network 상에 있는 컴퓨터들의 MAC 주소를 검색하는 ARP와 RARP를 이용하는 대신에, 각각의 NIC와 직접적으로 연결되어 있는 NIC들에 해당하는 IP 주소와 port 번호들의 목록을 별도의 파일에 저장하여 사용한다.
각 NIC 마다 할당되는 이 파일의 이름은 서버이름_seth#('#'은 interface 번호)이며, 한 줄(line)이 다음과 같은 형식을 띠고 있다.
# 가상 IP 주소<공백>실제 IP 주소:포트 번호 192.168.0.1 127.0.0.1:9000 192.168.0.2 127.0.0.1:9002
즉, 매 줄마다 현재 NIC와 물리적으로 같은 local network에 연결되어 있는 NIC들에 할당된 가상 IP 주소와, NIC를 나타내는 실제 IP 주소와 port 번호의 쌍으로 나타난다.
각각의 NIC들은 반드시 1:1로 대응되는 MAC 주소 파일을 가지고 있어야 하며, 이 파일들은 KENS가 실행되는 디렉토리와 같은 디렉토리에 위치하고 있어야 한다.
KENS는 기본적으로 정적 라우팅(static routing)만을 지원하고 있기 때문에, 라우팅 규칙들을 미리 정의해 주어야만 한다. KENS가 로딩될 때 이 라우팅 규칙들을 '서버이름.route'이라는 파일에서 읽어들이게 된다.
이 파일에서는 매 줄마다 라우팅 규칙을 포함하고 있으며, 각 라우팅 규칙은 현재 널리 쓰이고 있는 운영체제들에 포함되어 있는 route 프로그램의 인자들과 거의 흡사하다.
아래는 한 라인의 형식이다.
[host|net] xx.xx.xx.xx [netmask] xx.xx.xx.xx [gw] xx.xx.xx.xx [[dev] if]
'[',']' 안의 부분은 생략이 가능한 인자들이며, 'xx.xx.xx.xx'는 IP 주소 혹은 network mask를 나타낸다. 아래의 표에 각 인자들에 대한 설명이 나와있다.
표 4.8. 라우팅 규칙 설명
인자 |
생략 가능 |
설명 |
예 |
host or net |
X |
host 또는 net 인자는 이 라우팅 규칙이 적용될 host 혹은 network를 지정한다. host나 net이 오면 그 바로 다음에는 IP 주소 내지 network id가 지정되어야 한다. |
host 143.248.119.1 net 143.248.119.0 |
netmask |
O |
만약 이 라우팅 규칙이 적용될 대상이 network일 경우 해당 network의 network mask를 지정한다. host 일 경우에는 생략이 가능하다. |
netmask 255.255.255.0 |
gw |
O |
이 라우팅 규칙이 적용되었을 때 다음 hop(gateway)의 IP 주소를 지정한다. |
gw 192.168.0.1 |
dev |
O |
어떤 VNIC를 통해서 라우팅할 패킷을 보낼지를 지정한다. 생략할 경우에는 기본 VNIC(seth0)를 통해서 내 보낸다. |
dev seth1 |
다음은 라우팅 규칙 파일의 예제이다
# '#'이후로는 주석 # destination mask gateway interface #[host|net] xx.xx.xx.xx [netmask] xx.xx.xx.xx [gw] xx.xx.xx.xx [[dev] if] net 127.0.0.0 netmask 255.0.0.0 gw 127.0.0.1 dev seth0 host 127.0.0.1 dev seth0 host 128.32.33.5 dev seth0 net 140.252.13.32 netmask 255.255.255.224 gw 192.168.0.1 seth0 host 140.252.13.33 host 140.252.13.34 host 140.252.13.35 host 140.252.13.65 net 224.0.0.0 netmask 255.0.0.0 gw 192.168.0.1 seth0 host 224.0.0.1
위의 설정 파일들을 모두 하나의 디렉토리에 모아 놓고, KENS를 그 디렉토리에서 다음과 같이 실행하면 된다.
$ kens KENS환경설정파일
그럼 KENS는 먼저 KENS 환경 설정 파일을 읽어들여 전체적인 초기화를 한 다음, 그 정보를 바탕으로 각각 datalink layer(MAC 주소 목록), network layer(라우팅 규칙 목록) 그리고 transport layer에서 필요한 정보들을 읽어들여 각각의 layer를 초기화하고 KENS 응용 프로그램의 실행이나, 다른 KENS 호스트로부터 전송되는 패킷을 기다리게 된다.
KENS는 초기화가 완료됨과 동시에 KENS 응용프로그램을 위하여 몇 가지 환경변수들을 '서버이름.sh', '서버이름.csh'라는 파일들에 써 넣는다. 각각 shell, c shell용이며, KENS 응용 프로그램을 실행하기 위해서 반드시 필요한 환경 변수들이 저장되어 있다.
KENS 응용 프로그램을 실행하기 위해서는 KENS가 초기화를 마치고 작성한 환경 변수들을 실행하는 쉘 상에 설정해야만 한다. 만약, bourne shell(sh) 계열을 사용한다면,
# source 서버이름.sh
c shell(csh) 계열을 사용한다면,
$ source 서버이름.csh
와 같이 하여 환경변수를 현재 쉘에 설정한 다음 KENS 응용프로그램을 일반 프로그램을 실행하듯이 실행하면 된다.
주의할 점은 모든 IP 주소와 Port 번호는 가상의 것을 사용해야만 한다는 것이다.
호스트마다 매번 다른 프로그램을 실행하기 불편하다면 다음의 쉘 스크립트를 이용하는 것도 괜찮다.
$ cat kensapp #!/bin/sh if [ $# -lt 2 ] ; then echo "usage: kensapp kenshostname application ..." exit 0 fi ENV_FILE="$1.sh" if ! test -r $ENV_FILE ; then echo "can't read environment variable file : $ENV_FILE" exit 0 fi shift if ! test -x $1 ; then echo "can't find kens application executable file : $1" exit 0 fi source $ENV_FILE exec $*
이 스크립트를 이용해서 실행하는 예를 보도록 하자. client라는 KENS 호스트에서 echocli라는 프로그램을, server라는 KENS 호스트에서 echosvr 라는 프로그램을 실행하고 싶다고 하면,
$ ./kensapp client echocli 192.168.0.2:8080 $ ./kensapp server echosvr -p 8080
즉, 다른 KENS 호스트에서 프로그램을 실행하기 위하여 매번 새로운 쉘을 띄울 필요가 없어지는 것이다.
여기까지 KENS를 어떻게 실행하고, 어떻게 KENS 응용 프로그램을 작성하여 KENS와 함께 실행하는가를 알아보았다.
남은 것은 프로그래밍 가이드를 참고하여, 이 문서를 읽는 독자여러분들이 KENS에 직접 TCP나 IP 라우팅 같은 메커니즘을 구현해 보는 것 뿐이다. :-)
KENS와 함께 즐거운 네트워크 프로그래밍의 세계로 떠나보도록 하자.
차례
[KENS] server_name=cli udp_port=9000 tcp_port=9001 log_level=ip_layer,tcp_layer,sock,link_layer default_route=192.168.0.1 [seth0] address=192.168.0.2 netmask=255.255.255.0
[KENS] server_name=svr udp_port=9150 tcp_port=9151 log_level=ip_layer,tcp_layer,sock,link_layer default_route=10.0.0.1 [seth0] address=10.0.0.2 netmask=255.255.255.0
[KENS] server_name=gw1 udp_port=9050 tcp_port=9051 log_level=ip_layer,tcp_layer,sock,link_layer default_route=10.10.0.2 [seth0] address=192.168.0.1 netmask=255.255.255.0 [seth1] address=10.10.0.1 netmask=255.255.255.0
[KENS] server_name=gw2 udp_port=9100 tcp_port=9101 log_level=ip_layer,tcp_layer,sock,link_layer default_route=10.10.0.1 [seth0] address=10.10.0.2 netmask=255.255.255.0 [seth1] address=10.0.0.1 netmask=255.255.255.0