2007년 7월 31일 화요일

[Tip] IE7Pro

Windows 상에서 사용하는 Web Browser는 자주 사용하는 순으로 Maxthon 1.6 - Firefox 2 - The World - IE6 이다.
창을 많이 띄우는 것을 싫어하기 때문에 Tabbed Browsing 기능은 필수이다.
가장 좋아하는 Firefox는 초기구동 시간이 가장 느리다.
사전을 포함해서 설치된 Extension이 24개나 된다. 빠른 구동을 위해 Extension의 수를 줄여보기도 했었다. 약간 빨라지긴 했지만 그래도 초기구동이 느린 것은 마찬가지였다. 더군다나 Extension 없는 Firefox라면 "앙꼬없는 찐빵" 아닌가?
초기구동 시간이 가장 빠른 IE6은 알다시피 기능 상 가장 떨어진다. Tabbed Browsing이 불가능하다. 그래서 정식버전이 나온 후에 IE7로 upgrade를 해보았지만 열악한 Tabbed Browsing 기능과 함께, 웹서핑 중 시도 때도 없이 다운되는 경우가 많아서 사용하지 않게 되었다.
자주 들르는 곳에서 다운되는 것은 그다지 상관이 없으나 처음 찾아내서 보고 있던 사이트에서 다운되어 버리는 경우 session restore기능이 없는 IE는 사람을 상당히 번거롭게 만들어 준다. 정말 중요한 내용을 발견한 경우라면 History를 뒤져서라도 다시 찾아내겠지만 보통은 그렇게까지 하지 않는다.
IE7에 session restore의 기능만 있었어도 가끔은 사용했을 텐데, 이것이 안되는 것이 결정적으로 사용하지 않게된 계기가 되었다.
우연히
IE7Pro란 IE7을 위한 Add-on 프로그램을 알게되었다.
다음과 같은 기능을 갖고 있다.
Enhance Internet Explorer's Tabbed Browsing Capabilities
    1. Double click to close tab.
    2. Open new tab from address bar.
    3. Enable/disable tab browse history manager.
    4. Enable/disable crash recovery
    5. Move the IE menu bar above the address bar
    6. Hide search bar.
    7. Modify the maxium number of parallel connections to the web server.
    8. Select the external program to view page source
Super Drag and Drop
Mouse Gesture
Crash Recovery
Save Page to Image
Quick Proxy Switcher

AD Blocker
Greasy monkey alike User Script
Inline Search
Spell Check

이 중 눈길을 끌었던 것은 강화된 Tabbed Browsing 기능도 있지만, 바로 Crash Recovery
기능이다. Firefox의 session restore와 같은 기능을 가능하게 해주는 것이다.
물론 좋은 session restore기능보다는 Browser 자체가 안정적으로 동작하는 것이 중요하다.
그렇지만 IE7Pro와 함께라면 IE7도 그리 나쁘지 않은 선택이 될 수 있을 것 같다.
더욱이 이름은 IE7Pro이지만 FAQ에 따르면 IE6과도 사용할 수 있다고 한다.

개인적인 의견으로는 MS에서 IE7에 이 정도의 기능들은 내장하고서 내보냈어야 하지 않나 생각한다.

Link
 
IE7Pro - The Ultimate Add-On for Internet Explorer 7
 IE7Pro FAQ - IE7Pro WiKi

[추가]
윗 팁은 사용해보기 전에 작성한 것이다.
사용을 해보니 그리 나쁘지 않았다.
그러나 나를 IE7Pro로 인도한 Crash Recovery기능은 좀 문제가 있었다.
Crash가 일어나 IE가 죽은 경우에만 Recovery가 되어야 할텐데 IE를 시작하면
무조건 닫기 전에 열려있던 창을 다시 복원할 것인지 물어온다.
게다가 IE6으로는 Tabbed Browsing 기능이 의미가 없으므로 IE7으로 업데이트를 했다.
내가 기대했던 것은 IE6에서 멀티탭을 사용할 수 있게 해주는 것이었는데 약간은 실망스러웠다.

[Blog] CaN Tips

http://infosys.iptime.org/tt1/

2007년 7월 29일 일요일

SUNO's Networking

http://iorora.web-bi.net/tech/index.html

Ethernet/IEEE 802.3

History

1973년 5월 22일 Xerox PARC(Palo Alto Research Center)에서 Robert Metcalfe 박사에 의해 최초 개발되었다. 당시 ALOHA network에 사용하기 위하여 개발되었는데, 첫 데이타 전송 실험에서의 전송속도는 2.94 Mbps였다고 한다.

Ethernet이라는 이름은 우주에 존재한다고 생각되는 가설의 물질인 에테르("Ether")의 이름을 따서 Robert Metcalfe 박사가 명명하였다. 에테르는 빛이 파동이라고 생각할 때 이를 전달하는 매질이 필요한데, 이 빛을 전달하기 위해 우주에 존재한다고 생각되는 물질이다.

Robert Metcalfe에 의해 1979년 설립된 회사가 3Com이다. 참고로 1976년에 Intel에서 8080 (4.77 MHz)이 처음으로 개발되었다.

1978년 Xerox, Intel, DEC에 의해 최초의 공식적인 Ethernet Spec이 마련되었는데, 이를 DIX(DEC-Intel-Xerox) Standard라고도 한다. 그리고 이어서 1980년 9월 Xerox, Intel, DEC에 의해 Ethernet version 1 표준이 발표되고 1982년 역시 Xerox, Intel, DEC에 의해 Ethernet version 2 표준이 발표된다. 이 Ethernet version 2가 IEEE 802.3의 토대가 되었으며 이 둘은 작은 차이만 있을 뿐 거의 동일하다.

IEEE는 1980년 2월 LAN의 표준 작성을 위한 "802" 그룹을 결성하는데, 이 활동의 결과로 1985년 IEEE에서 IEEE 802.3, CSMA/CD(Carrier Sense Multiple Access with Collision Detection) 표준이 만들어진다.

오늘날 "Ethernet"이라는 용어는 IEEE 802.3을 포함하여 Ethernet Specification을 만족하는 모든 CSMA/CD LAN을 지칭하는 용어로 사용된다.

CSMA/CD (Carrier Sense Multiple Access with Collision Detection)

CSMA/CD의 동작 방식은 아래와 같다. CSMA/CD LAN을 사용하는 장비는 언제든지 network에 접근할 수 있다. 데이타를 보내려는 장비는 먼저 network이 사용 중인지 아닌지 "listen" 한 후에 사용 중이 아니면 자신이 사용한다. network이 사용 중이면 일정시간을 기다린 후 다시 "listen"한다. 사용 중인지는 network 상으로 ethernet frame이 돌아다니는지를 전기적인 신호로 확인할 수 있다. 만약 2 장비가 동시에 "listen"하여 network이 사용 중이지 않다는 것을 확인한 결과 동시에 전송하게 되면 "collision"이 발생한다. 이런 경우를 대비해서 frame을 전송한 장비는 자신의 frame이 깨졌는지를 확인하여 "collision"이면 재전송을 하게 된다. 이때 2 장비의 재전송이 동일한 시간 후에 일어나면 다시 "collision"이 발생하므로 재전송 시간은 일정한 방법에 의해 변경된다.

picture from 후니의 쉽게쓰는 네트워크 이야기

Ethernet/IEEE 802.3 Comparison

Ethernet과 IEEE 802.3은 모두 CSMA/CD 방식을 사용하며, broadcast network이라는 공통점이 있다. broadcast network에서는 network 상의 모든 장비는, network 상 frame의 목적지가 자기가 아니라 하더라도, 모든 frame을 본다. 모든 장비는 이렇게 받은 모든 frame을 검사하여 목적지가 자기이면 이를 처리하고, 그렇지 않으면 frame을 버린다.

Ethernet과 IEEE 802.3의 차이는 매우 작은데, Ethernet은 OSI reference model에서 Layer 1과 Layer 2에 해당하지만, IEEE 802.3은 Layer 1과 Layer 2 중 MAC(Medium Access Control) Layer만 정의하고, Layer 2 중 LLC(Logical Link Control) Layer는 정의하지 않는다. 이 둘 모두는 NIC(Network Interface Card)의 hardware에 구현된다.

Frame Format

Fig1. Ethernet/IEEE 802.3 Frame Formats

Preamble - 7 bytes
Preamble은 ethernet/IEEE 802.3 frame의 시작을 알리는 것으로, 1과 0이 교대로 있다.
SOF(Start Of Frame) - 1 bytes
Frame의 동기화를 위한 것으로 2개의 "1" bit로 끝난다.
Destination Address, Source Address - 6 bytes
Ethernet/IEEE 802.3 frame을 전송한 장비와 받을 장비의 주소이다. Ethernet Address는 6 byte로 구성되는데, 이중 상위 3 byte는 Ethernet NIC의 vendor를 식별하는 번호로 IANA에서 정의하고, 하위 3 byte는 각 vendor가 정의한다. Source Address는 항상 unicast (single node) address인 반면, Destination Address는 unicast, multicast, broadcast address가 모두 가능하다.
Type - 2 bytes
Ethernet frame의 data 영역에 있는 packet이 어떤 프로토콜의 것인지 (ip, ipx 등)를 식별한다.
Length - 2 bytes
IEEE 802.3인 경우 이 2 bytes는 뒤의 IEEE 802.3 header와 data의 크기를 byte 단위로 표시한다.
Data
Ethernet frame에 대한 physical layer와 link layer 처리가 끝나면 이 Data에 해당하는 부분이 상위 layer로 넘겨진다. 이때 Ethernet인 경우는 앞의 Type field에 의해 상위 프로토콜을 파악하지만, IEEE 802.3인 경우에는 이 영역이 64 byte의 header와 data 영역으로 구성되는데, 이 802.3 header에 상위 프로토콜에 대한 정보가 담기게 된다.
FCS(Frame Check Sequence)
Ethernet frame의 전송 중 에러를 검출하기 위한 것으로 이 값은 CRC(Cyclic Redundancy Check) 방법을 사용해서 계산되어 송신측에서 넣어두면 수신측에서 이 값을 통해 Ethernet frame이 깨졌는지를 검사하게 된다.

Link


출처: Sungjean's Technology Resource

2007년 7월 28일 토요일

NS-NAM으로 해보는 네트워크 시뮬레이션

ZDNet Korea
이우영 (KT)   2005/05/26
원본출처

노드와 링크의 조합으로 이루어진 네트워크에는 데이터의 트래픽 조절과 혼잡 제어가 필요합니다.

네트워크 디자이너들은 이러한 네트워크를 실제로 구현하기에 앞서 다룬 수학적인 방법과 ns-nam과 같은 소프트웨어 툴 등을 사용하여 네트워크를 구성하고 평가하여 엔지니어로서의 ‘자원의 효율적인 사용’이란 목적을 달성해야 합니다. 오늘은 이러한 네트워크 디자이너가 되기 위한 연재의 마지막 시간입니다.

네트워크 디자이너와 고속도로 디자이너는 목적지에서 출발지로 의미가 있는 단위를 전송하는 역할을 한다는 점에서 유사하지만 구현의 측면에서는 차이점이 많습니다. 예를 들면 고속도로는 그 구현과 상태가 실생활에서 드러나지만, 네트워크 디자인은 사용자에게 보이지 않고 느껴지지 않도록 구현한다는 점을 들 수 있습니다. 이러한 이론과 현실의 괴리로부터 이론적으로 네트워크를 공부한 사람들이 실제로 장비를 사용하여 네트워크를 구현할 때 어려움을 겪게 됩니다.

만약 실제의 구현에 앞서 신뢰성 높은 소프트웨어로 많은 연습을 해 볼 수 있다면, 그리고 가시적인 구현을 통해 전체적인 네트워크의 그림을 그릴 수 있다면 어떨까요? 분명 네트워크 디자이너들에겐 효과(Effectiveness)와 효율(Efficiency) 높은 무엇보다도 훌륭한 툴이 되어줄 것입니다. 이러한 목적을 가지고 네트워크디자이너들은 소프트웨어 툴을 개발하게 되었고 그 중에 대표적인 것이 바로 지금 소개할 NS-NAM(NS version 2)입니다.

NS-NAM은 Network Simulator-Network AniMator의 약자로 USC(University of Southern California)의 ISI(Information Sciences Institute)와 UCB(University of California at Berkeley), CMU(Carnegie Mellon University) 등에서 연구하는 Network Designer들과 석학들이 함께 모여 만든 소프트웨어 시뮬레이션 툴입니다. NS-NAM은 C++를 사용하여 개발되었습니다.

객체지향 특성의 Otcl(티클)이라는 스크립트를 작성하여 컴파일 후 네트워크의 상태를 애니메이션 효과 등을 통해 볼 수 있는 툴로써, 플랫폼에 상관없는 이식성과 확장성을 가지고 있습니다. 또한 x-graph라는 그래프 분석 툴을 사용하여 네트워크 디자인을 하드웨어의 구현 없이 분석할 수 있습니다.

이러한 NS-NAM은 기존의 수학적인 툴이 부분적인 분석에 제한적으로 사용되는 점을 보완하여 네트워크를 전체적인 그림에서 이해할 수 있는 장점이 있습니다. 또한 객체지향의 특성에서 비롯하여 완성된 네트워크를 하나의 모듈(Module)처럼 사용하여 또 다른 네트워크 디자인이나 협동 작업에 쉽게 사용할 수 있습니다.

이러한 확장성은 NS-NAM이 다양한 네트워크 프로토콜들과 인터넷 라우팅(routing), 다양한 큐잉(queuing) 모델들을 사용할 수 있도록 했습니다. 하지만 NS-NAM도 완벽한 툴이 되지 못하는 단점이 있습니다(물론 계속 발전하고 있습니다). 대표적인 것은 레이어 3 이하에 관한 것들을 무시하고 있는 것과 .tcl로 이루어진 코딩이 처음 사용하는 사람들에게 문법적으로나 표현적으로나 어려울 수도 있다는 것입니다.

그래도 NS-NAM은 현재 세계적으로 가장 많이 사용되고 있으며 앞으로 단계적으로 완성도를 더해갈 것을 기대해 볼 수 있기에 ‘초보자를 위한 네트워크 3회 연재’에서 ‘NS-NAM으로 해본 Network Design Software Simulation’이란 제목으로 간단한 예제로 NS-NAM을 실습하여 소개하는 기회로 삼겠습니다.

네트워크 구성, 토폴로지
본격적인 NS-NAM의 설명에 앞서 NS-NAM을 이용해 다양하게 디자인할 수 있기 위해 네트워크의 기본적인 토폴로지(topology)에 관해 소개하겠습니다. 토폴로지란 네트워크를 이루는 링크에 연결된 노드의 물리적인 배열을 말합니다. 다시 쉽게 말하자면 노드를 물리적으로 잇는 방법이라고 할 수 있겠습니다. 이러한 네트워크 토폴로지에는, <그림 1>과 같이 점대점(point to point), 버스(bus), 트리(tree), 링(ring), 그리고 스타(star) 등의 형태를 가지고 있습니다.

점대점 토폴로지는 가장 단순한 형태의 그것으로 전송 노드와 수신 노드가 단순하게 점대점으로 연결된 상태입니다. 버스 토폴로지(bus topology)는 네트워크 스테이션에서 시작된 전송이 미디어의 길이를 따라 전달돼 다른 모든 스테이션이 수신하게 되는 것입니다. 트리 토폴로지(tree topology)는 다수의 노드가 있는 브랜치를 포함시킬 수 있는 나무가지 형태의 토폴로지입니다. 스테이션에서 보내는 전송은 미디어의 길이 방향으로 전달되며, 다른 모든 스테이션에서 수신하게 됩니다.

링형 토폴로지(ring topology)는 단 방향 전송 링크에 의해 서로 연결돼 하나의 폐쇄 루프를 형성하는 일련의 리피터들로 구성된 네트워크 토폴로지로 네트워크상의 각 스테이션은 리피터에서 네트워크로 연결됩니다. 링형 토폴로지는 폐쇄 루프의 별 모양으로 구성되는 경우도 많습니다. 스타형 토폴로지(star topology)는 네트워크의 엔드 포인트들이 점대점 링크 방식으로 공용 중앙 스위치로 연결돼 있는 LAN 토폴로지입니다.

이러한 토폴로지에 관한 지식은 앞으로 여러분이 네트워크를 물리적으로 디자인할 때 가장 먼저 생각해야 할 단계가 될 것입니다. NS-NAM으로 구현할 수 있는 방법이 되어 줄 것입니다. 이러한 토폴로지는 우리가 앞으로 NS-NAM으로 다루게 될 예제를 통해서 시각적으로 뿐만 아니라 프로그램적으로도 구현될 것입니다.

<그림 1> 여러 가지 모양의 기본 네트워크 토폴로지

NS-NAM 설치하기
NS-NAM은 플랫폼에 상관없이(Platform-regardless) 사용이 가능한 프로그램입니다. 다시 말해서 유닉스, 리눅스, 윈도우 등 어떤 OS에서도 사용이 가능합니다. 하지만 유닉스 계열(Most UNIX and UNIX-like systems) OS에서 사용이 편리합니다. 윈도우 환경에서 사용하기 위해서는 CIGWIN(http://www.cygwin.com/) 이라는 윈도우 환경에서 유닉스 환경을 만들어 줄 수 있는 프로그램을 먼저 설치해야 하는 번거로움이 있으며 이러한 방법은 NS-NAM설치 후 모든 상태를 점검하는 Validation Test가 실행이 안 되는 단점이 있습니다. 때문에 유닉스 환경에서 실습할 수 없는 독자들의 경우 리눅스를 먼저 설치하고 NS-NAM을 실행하기를 추천합니다.

NS-NAM 내려받기
유닉스 환경이 완성되었다면 NS-2 소프트웨어를 다운받아 보겠습니다. NS-2는 NS-NAM 실행을 위한 여러 가지 응용 프로그램들이 들어 있는 NS 버전 2 프로그램입니다. 낯선 유닉스 환경에서 설치가 어려울 수도 있으나 차분한 마음으로 하나씩 함께 시작해 봅시다.

우선 http://www.isi.edu/nsnam/ns/ns-build.html 에서 버전 2.28의 NS-2를 다운받아 보세요. 화면에서 ‘Where to Start’를 찾고 ‘All at Once’를 클릭하여 250MB의 current release 2.28, ns-allinone-2.28.tar.gz(릴리즈 버전은 추후에 업데이트될 수 있습니다)를 여러분의 사용 컴퓨터에 ~/ns 디렉토리를 만들어 다운받습니다. 그 후 다음의 명령어를 순차적으로 입력하여 압축을 풀고 설치합니다.

gunzip ./ns-allinone-2.28.tar.gz ☜ gunzip 압축을 풉니다.
/usr/sbin/tar xvf ./ns-allinone-2.28.tar ☜ tar 압축을 풉니다.
./install ☜ 패키지 안에 있는 자동 인스톨 파일을 실행합니다.

<화면 1> 성공적인 설치 후 나타나는 메시지 화면

./install을 성공적으로 실행시키고 나면 <화면 2>와 같은 메시지가 나타나고 프로그램 설치가 성공적으로 완료되었음을 나타냅니다. 하지만 끝이 아닙니다. 화면에는 성공적으로 설치가 되었다는 메시지가 나오지만 메시지 하반부에는 여러분의 컴퓨팅 환경에 맞게 단계별로 해야 할 일들이 자동으로 나타납니다. 디렉토리는 독자마다 다를 수 있으니 주의하여 살펴보기 바랍니다.

두려워하지 말고 차분차분 환경설정을 메시지에 나온 대로 해나가겠습니다. 환경설정을 마무리했다면, ns-2.28 디렉토리로 옮긴 후 ./validate를 실행해 봅니다. Validate를 성공적으로 실행하면 다양한 예제들이 컴파일된 후 자동적으로 NAM으로 네트워크가 나타납니다. 이제 여러분은 NS-NAM을 성공적으로 설치한 것입니다.

NS-NAM은 어떤 구조로 이루어 졌을까?
Network Simulator, NS는 네트워크 시뮬레이션을 위한 컴퓨터 언어 Object-oriented TcL(OTcl)를 컴파일하는 인터프리터(interpreter)입니다. 다시 말해서 NS-2를 사용하기 위해선 OTcl 언어를 사용하여 프로그램을 짜야 합니다. OTcl 스크립트는 프로그램이 이벤트 스케쥴러를 초기화하고 NS-2 라이브러리에 있는 네트워크 토포롤지들을 준비하여 각각의 네트워크 이벤트에 따른 전송 노드에서 수신 노드까지의 데이터의 흐름을 결정하게 됩니다.

NS-2에서 이벤트는 고급 사용자의 경우 기존의 OTcl 모듈들을 새롭게 작성한 OTcl 스크립트와 함께 컴파일하여 네트워크 컴포넌트로 사용하는데 그러기 위해서 새로 작성한 스크립트와 기존의 스크립트는 함께 컴파일되어야 합니다.

독자들이 작성하게 될 OTcl 파일(.tcl)을 컴파일하면 <그림 2>와 같은 이벤트가 일어납니다. 네트워크를 소프트웨어적으로 시뮬레이션한 후 그 결과를 기록한 파일 두 개가 생성되는데 그것이 out.nam과 out.tr입니다. out.nam은 Network-AniMator인 NAM의 실행을 위한 파일이며 out.tr은 네트워크에서 데이트의 흐름을 모니터링하고 시뮬레이션한 데이터의 각각의 이벤트에 따른 생성된 로그라고 할 수 있습니다.

<그림 2> .tcl 스크립트를 NS에서 실행했을 때의 전체 그림

NS-2를 사용하여 구현할 수 있는 네트워크 기능  

1. Router queue Management Techniques DropTail, RED, CBQ

2. Multicasting

3. Simulation of wireless networks

4. Traffic Source Behaviour- www, CBR, VBR

5. Transport Agents- UDP/TCP

6. Routing

7. Packet flow

8. Network Topology

9. Applications- Telnet, FTP, Ping

10. Tracing Packets on all links/specific links



NAM
NAM은 네트워크 디자인의 특성상 쉽게 눈으로 볼 수 없었던 데이터의 흐름과 구현된 네트워크 토폴로지를 애니메이션 효과를 통해 제공하는 툴입니다. 이러한 기능은 .tcl 스크립트가 컴파일된 후 생성된 out.nam이라는 파일을 이용하여 실행되며 디자인된 네트워크의 시각적인 해석을 가능하게 합니다. 여타의 멀티미디어 플레이어와 같은 손쉬운 동작 방법으로 네트워크를 제어할 수 있으며 각각의 링크에 패킷들의 수나 전체 Throughput 등이 쉽게 마우스 동작으로 나타내 집니다. 또한 각각의 노드는 드래그 앤 드롭으로 생성되거나 이동될 수 있는 기능도 있습니다.

<화면 2> NAM 설명하기

X-Graph
X-Graph는 X-윈도우의 응용 프로그램으로 그래핑(graphing) 과 플로팅(plotting)을 할 수 있는 툴입니다. 이러한 코딩은 .tcl 스크립트가 컴파일된 후 생성된 out.tr 파일을 이용하여 나타나며 .tcl 스크립트에서 다음과 같은 약간의 코딩으로 사용될 수 있습니다.

proc finish{} {
global f0 f1 f2
#Close the output files
close $f0
close $f1
close $f2
#call X-Graph to display the results
exec xgraph out0.tr ?geometry 800x400 &
exit 0
}

<화면 3> X-Graph의 3개의 Trace 분석 화면

점대점 노드와 링크 따라하기
이제부터 NS-2로 네트워크를 구성하기 위한 단계입니다. 간단한 예제를 통해 본격적으로 NS-NAM을 실습해 보도록 하겠습니다. 우선 점대점 토폴로지로 이루어진 두 개의 노드와 한 개의 링크를 NS-2로 구현하고 NAM으로 확인해 보도록 하겠습니다. 우리가 구현할 네트워크의 필요사항(requirement)은 두 개의 노드(노드 ‘0’과 ‘1’)가 있고 그 노드 사이에는 듀플렉스(duplex)로 연결된 링크가 있어야 합니다.

그리고 데이터는 UDP(User Defined Protocol, 사용자가 데이터 전송 크기를 정할 수 있는 프로토콜)를 사용하여 보내지며 CBR(Constant Bit Rate, 데이터 전송의 흐름을 항상 일정한 비율로 하는 것)을 사용하여 5초 동안 데이터를 보내야 합니다. 그리고 마지막에 NAM을 호출하여 우리의 실습 네트워크 토폴로지를 눈으로 볼 수 있고 시뮬레이션하도록 합니다. 그럼 노드를 생성하는 것부터 시작해 보겠습니다.

노드 생성과 연결
NS-2에서도 네트워크는 노드와 링크로 이루어진다. 노드와 링크에 패킷 데이터를 보내기 위해서는 NS가 시작되는 시간, 데이터를 보내기 시작하는 시간, 데이터를 전송 마지막 시간 등의 시간에 대한 전체적인 이벤트의 스케쥴을 지정해야 합니다.

시작 오브젝트 생성 -> set ns [new Simulator]
NS 시작 시간 설정 -> $ns at <time> <event>
NS 시작 -> $ns run

노드를 만들기 위해서는 ‘set’이라는 명령어를 사용합니다.

set n0 [$ns node]
set n1 [$ns node]

각각 ‘n0’와 ‘n1’을 지정하고 두 개의 노드 오브젝트를 생성했습니다. NAM에서 네트워크 흐름을 보기 좋게 나타내기 위해서 데이터 플로우에 색을 집어넣기도 하는데 방법은 다음과 같습니다. 색은 검정, 빨강, 파랑, 바다녹색 등이 있습니다.

$n0 color

생성된 노드를 링크로 연결하는 데에는 단 방향 전송(simplex)과 양 방향 전송(duplex)이 있습니다. 각각은 다음과 같이 설정됩니다.

A Simplex link(단 방향) -> $ns simplex-link $n0 $n1
<bandwidth><delay> <queue_type>
A duplex link(양 방향) -> $ns duplex-link $n0 $n1
<bandwidth> <delay> <queue_type>

밴드위스와 딜레이는 각각 1Mb와 10ms로 설정했으며 지난 호에 설명했던 큐는 먼저 들어온 데이터가 먼저 처리되는 FIFO(First In First Out)으로 설정하겠습니다. 이외에도 RED(Random Early Detection), Drop Tail, FQ(Fair Queuing) 등을 사용할 수 있습니다.

Agent와 애플리케이션
NS-2로 생성된 노드 오브젝트는 2개의 클래스를 사용하여 데이터 트래픽(traffic)을 생성합니다. 그것은 the class Agent and the class Application입니다. 각각의 노드는 데이터를 전송하고 수신하는 기능이 필요한데 이러한 일을 하는 것이 Agent입니다. 또한 Agent 위에 애플리케이션을 수행하게 되는 것입니다. 이러한 애플리케이션은 구현될 네트워크에서 데이터 트래픽의 종류를 결정하게 됩니다. NS-2에는 UDP와 TCP의 두 가지 Agent가 있습니다.

UDP
set udp0 [new Agent/UDP]
set null [new Agent/NULL]
$ns attach-agent $n0 $udp0 # udp Agent를 노드 n0에 붙입니다.
$ns attach-agent $n1 $null
$ns connect $udp $null # 2개의 Agent를 연결합니다.

이 코드는 UDP Agent를 만들어서 n0 노드에 붙이고 Null Agent를 만들어서 데이터가 노드 n1에 붙여서 물이 높은 곳에서 낮은 곳으로 흐르듯이 데이터를 흐르게 만들어 줍니다.

TCP
set tcp [new Agent/TCP]
set tcp_sink [new Agent/TCPSink]
$ns attach-agent $n0 $tcp # tcp Agent를 노드 n0에 붙입니다.
$ns attach-agent $n1 $tcp_sink
$ns connect $tcp $tcp_sink # 2개의 Agent를 연결합니다.

이 TCP 코드는 TCP Agent를 우선 생성하여 노드, n0에 붙이고 n1은 TCPSink agent로 설정한 후 데이터가 n0에서 n1로 트래픽이 전송될 수 있도록 합니다. NS-2에서는 TCP, TCP/Reno, TCP/Vegas, TCP/Sack1, TCP/Fack, TCPSink 등의 다양한 TCP 타입이 지정될 수 있습니다.

NS-2에는 데이터를 전송하는 방법에 따라 다른 4개의 트래픽 애플리케이션이 있습니다. 가장 쉽게 사용되는, 항상 일정한 비율로 데이터를 전송한다는 의미의 CBR(Constant Bit Rate)을 살펴보겠습니다. Agent를 생성한 후 파라미터들을 사용하여 새로운 오브젝트를 하나 만듭니다(다음의 경우, my_cbr). 그리고 다시 agent에 연결하여 애플리케이션을 완성합니다. 완성된 애플리케이션은 시간의 변수와 함께 실질적인 데이터 전송 시간을 결정할 수 있습니다.

set my_cbr [new Application/Traffic/CBR]
$my_cbr attach-agent $udp
$ns at <time> $my_cbr start

결정인자
start : 환경 변수에 기준해 패킷들을 보내기 시작하는 시간을 결정
stop : 패킷 전송을 중단
PacketSize_ : 일정하게 생성되는 패킷들의 크기를 결정하는 인자
rate_ : 전송 비율을 결정하는 인자
interval_ : 전송된 두개의 패킷간의 시간
maxpkts_ : 전송하는 최대 패킷 수

결정인자는 NS-2가 소프트웨어 시뮬레이션이기 때문에 매우 신중하고 수학적으로 계산해야 합니다. 적절한 패킷크기 지정과 전송 비율, 인터벌 설정은 다양하고 정확한 응용을 가능하게 해줍니다.

트레이싱
트레이싱(Tracing)은 시뮬레이션을 통해서 생성된 데이터의 로그를 저장하여 분석할 수 있도록 해줍니다. 트레이싱에는 패킷의 전송 시작 시간, 도착 시간, 전송 실패 패킷의 수와 전송로의 상태 등을 동적으로 기록하고 있습니다.

 set trace_file [open out.tr w]
 $ns trace-all $trace_file
 $ns flush-trace
 close $trace_file

성공적인 컴파일 후에는 out.tr이라는 trace 파일이 생성되어 다음과 같은 데이터를 저장하게 됩니다. 첫 번째 컬럼의 ‘+’는 큐에 들어오는 과정, ‘-’는 큐에서 나가는 시간, ‘r’은 이벤트가 생성되는 시간, ‘d’는 전송받은 패킷을 큐에서 드롭한 시간을 기록합니다. 11개의 각각의 컬럼에 관한 내용은 <표 1>과 같습니다.

+ 1.84375 0 2 cbr 210 ------- 0 0.0 3.1 225 610
- 1.84375 0 2 cbr 210 ------- 0 0.0 3.1 225 610
r 1.84471 2 1 cbr 210 ------- 1 3.0 1.0 195 600
d 1.84566 2 0 ack 40 ------- 2 3.2 0.1 82 602

<표 1> .tr 파일의 데이터 컬럼 종류 설명하기  

1 Operation performed in the simulation
2 Simulation time of event occurrence
3 Node 1 of what is being traced
4 Node 2 of what is being traced
5 Packet type
6 Packet size
7 Flags
8 IP flow identifier
9 Packet source node address
10 Packet destination node address
11 Sequence number



<화면 4>은 이상의 내용을 하나에 묶어 hello-ns.tcl 파일로 저장하고 프롬프트 상태에서 ns hello-ns.tcl이라고 실행한 후에 나타난 out.nam 화면입니다. 컴파일이 성공적으로 수행되면 자동으로 out.tr 파일과 out.nam 파일이 생성됩니다. 이제 독자들은 처음으로 만든 시각적인 네트워크를 다양한 기능키를 상용해서 즐겨 볼 수 있습니다. 자유롭게 여러 가지 기능과 인자들을 바꾸어 가면서 다시 컴파일하고 결과를 실행시켜보면 좀 더 쉽게 NS-NAM을 이해할 수 있을 것입니다. 그리고 세 개, 네 개의 노드로 확대해서 더 많은 경험을 쌓아보기 바랍니다.

<화면 4> 두 개의 노드와 듀플렉스 연결


 <리스트 1> hello-ns.tcl의 소스


10년 전을 떠올리며
NS-NAM은 단순한 유선상의 연결 이외에도 무선 네트워크와 단말의 이동 그리고 유니캐스팅과 멀티캐스팅 등의 구현이 가능합니다. 참고로 필자는 지난 2004년 초 IEEE 802.16/e의 단말 이동시 효과적인 데이터 전송을 위한 인증단계를 최소화에 대한 주제로 NS-2를 이용하여 시뮬레이션을 한 적이 있습니다.

네트워크 디자이너들이 가상 실험 환경 속에서 실제와 최대한으로 유사한 네트워크 구현을 해 나갈 수 있다면 효율 높은 네트워크 구현을 할 수 있을 것입니다. NS-NAM에 관한 짧은 연재였지만 앞으로 많은 관심을 갖고 NS-NAM을 사용하고 지켜본다면 네트워크를 향한 여러분의 목표에 꼭 필요한 툴이 될 것입니다. 여러분의 참고를 위하여 참고자료에 몇 개의 NS-NAM 관련 사이트를 추가합니다.

네트워크는 노드와 노드를 잇고 데이터를 흐르게 하는 것을 말합니다. 새해부터 시작한 세 번의 연재가 독자들의 호기심을 얼마나 만족시켰는지 궁금합니다.

연재를 하면서 10년 전 군대를 제대하고 컴퓨터 공부를 다시 시작하며 마소를 잡았던 기억을 되새겨 봤습니다. 10년 전만 해도 새로운 기술과 모르는 용어들을 보며 스스로에 대한 실망과 신기술에 대한 어려움으로 걱정의 날들을 보내기도 했었습니다.

이 글을 읽어볼 독자가 마소의 주니어 섹션을 보았던 필자의 시절과 비슷하다 생각하고 감히 한말씀드리면, 네트워크는 꼭 컴퓨터와 컴퓨터를 잇는 것만을 말하지 않습니다. 세상으로 나와 노드를 찾고 정의하고 각각의 관계에 맞는 환경 인자를 설정하여 데이터를 전송하고 가치를 생성하는 일이 바로 네트워크 디자이너라는 말을 마지막으로 나누고 싶습니다.

큐잉 이론과 네트워크 모델링

ZDNet Korea
이우영 (KT)   2005/05/09
원본출처

데이터 통신과 네트워크 디자인을 희망하는 사람이라면 누구나 알아야 하는 테크닉이 바로 큐잉 이론입니다. 전산학을 비롯한 거의 모든 컴퓨터 네트워크와 통신 분야의 디자이너들에게 큐잉은 시스템의 행동 특성을 빠르게 분석, 설계, 그리고 평가할 수 있게 해주는 주요한 툴로 사용되고 있습니다.

이번 연재에서는 이러한 큐잉을 대기와 처리의 관점에서 네트워크에 어떻게 적용되는지 설명하고 두 가지 예제를 함께 풀어보겠습니다.

노드와 링크의 조합인 네트워크에는 데이터의 트래픽 조절과 혼잡 제어가 필요합니다. 트래픽 조절이란 고속도로에서의 교통상황처럼 데이터 송신 노드(source node)에서 목적 노드(destination node/sink node)로 데이터가 전송될 때 목적 노드 쪽에서 데이터를 너무 빠르게 처리하거나(자원 낭비) 너무 느리게 처리(낮은 효율)하지 않도록 하는 것을 말합니다.

혼잡 제어는 2개 이상의 노드로부터 링크를 통해 데이터를 전송할 때 데이터 충돌을 피하거나 해결하기 위한 방법입니다. 이상의 방법들은 높은 데이터 전송 효율을 목표로 하는 네트워크엔 꼭 필요한 요소이며 네트워크 디자이너들은 이러한 트래픽 관리를 통해 현 상태와 앞으로의 네트워크 상태를 가늠할 수 있어야 합니다.

이와 같은 데이터 통신과 네트워크 디자인을 희망하는 사람이라면 누구나 알아야 하는 테크닉이 바로 큐잉 이론(Queuing Theory)입니다. 독자들은 아마도 큐(queue)라는 용어를 자료구조 관련 서적에서 대기 행렬이라는 용어로 접해보았을 것입니다.

다시 이해를 돕자면 큐는 먼저 들어온 데이터가 먼저 처리되는(First In First Out) 데이터의 저장 형태라고 할 수 있습니다. 이러한 것은 큐잉의 기본 개념에 불과합니다. 전산학을 비롯한 거의 모든 컴퓨터 네트워크와 통신 분야의 디자이너들에게 큐잉은 시스템의 행동 특성을 빠르게 분석, 설계, 그리고 평가할 수 있게 해주는 주요한 툴로 사용되고 있습니다. 이번 글에서는 이러한 큐잉을 대기(queue)와 처리(serve)의 관점에서 네트워크에 어떻게 적용되는지 설명하고 예제를 풀어 봄으로써 독자 여러분의 이해를 돕겠습니다.

얼마 전에 다이수케 테라사와의 ‘초밥왕’이라는 만화를 보았습니다. 주인공 세키구치 쇼타가 초일류 초밥을 준비하기 위하여 재료들을 배우고 준비하는 마음가짐을 보고 기본기의 중요성을 다시 한번 마음에 되새기는 계기가 되었습니다. 큐잉 이론과 네트워크 모델링에 관한 이야기를 하기에 앞서 독자들이 이미 알고 있을 내용이겠지만 잠시 확률에 관한 기본기를 살펴보며 확률에 대한 기억을 되새겨 보겠습니다.

확률 되돌아보기
세 개의 빨간 구슬과 두 개의 파란 구슬이 담겨있는 항아리에서 빨간 구슬을 뽑을 사건을 시행할 때 사건의 결과가 목적을 만족시킬 확률을 묻던 산수책의 문제 기억납니까? 아마 대부분의 독자들은 이러한 문제들을 초등학교 때부터 지금까지 서적과 수업, 생활 속에서 많이 접해 보았으리라 생각합니다.

확률은 17세기 파스칼과 페르마라는 수학자간의 도박에 관한 이야기 속에서 학문적으로 체계화되었다고 합니다. 또한 확률은 복잡한 통계적 계산에 대한 정확한 처리라는 컴퓨터 발전의 기본 목표이기도 하였습니다. 이러한 확률은 네트워크의 기본 설계에 녹아 있습니다.

예를 들면 대개의 디자이너들이 데이터 전송과 수신시의 성공과 실패를 확률로 구분하고 디자인의 제한 조건으로 둡니다. 여러분이 사용하고 있는 모든 네트워크 장치들은 이러한 것들을 모두 만족시켜 준 것들이라고 할 수 있습니다. 이렇게 네트워크 속에서 확률의 예를 찾자면 몇 권의 책, 며칠의 시간으로도 아마 모자랄 것입니다.

확률의 기본 정의
공리(axioms)라는 것은 수학에서 무증명 명제(無證明 命題)라고 불리는 것으로, 기초를 세우기 위해 받아들이는 수학적 단정(assertion)이라고 할 수 있습니다. 일단 이러한 공리가 받아들여지면 우리는 법칙을 증명할 수 있는 것입니다.

어떠한 사건 Ω는 각각의 실험에서 발생한 사건의 모든 집합을 말하며 표본 공간(Sample Space, 그래서 S로 나타내기도 하지요)라고 합니다. 합집합 A∪B(A union B)는 사건 A와 B가 각각 혹은 동시에 일어날 수 있는 모든 사건의 집합을 말합니다. A∩B(A intersection B)는 사건 A와 B가 동시에 일어나는 사건을 말합니다. 만약에 A∩B={}라고 하면 A와 B는 동시에 일어나는 사건이 없어 서로 배반 관계(mutually exclusive)라고 합니다.

확률은 어떤 사건이 일어나는 확실성의 정도를 수량적으로 나타낸 것입니다. 주사위의 예를 들면 주사위를 던진 후 하늘을 향하는 숫자를 하나의 사건이라고 한다면 모두 6개의 사건이 일어날 수 있습니다. 주사위가 균등하게 모든 이벤트를 발생한다고 가정하면 3보다 작거나 짝수인 사건(1, 2, 4, 6)이 나올 확률은 Pr[{짝수}∪{3보다 작은 수}] = Pr[짝수] + Pr[3보다 작은 수] - Pr[{짝수}∩{3보다 작은 수}] = 1/2 + 1/3 - 1/6 = 2/3가 될 것입니다. 다음과 같이 확률의 공리를 정리해 보았습니다.

      0 ≤ Pr[A] ≤ 1 for 각각의 사건 A     
      Pr[Ω] = 1     
      Pr[A∪B] = Pr[A] + Pr[B] if A와 B가 배반 관계     
      Pr[A∪B] = 0 if 와 B가 배반 관계     
      Pr[A∪B] = Pr[A] + Pr[B] - Pr[A∩B]

확률 변수
확률 변수(random variable)는 쉽게 설명하면 확률을 나타내는 변수를 말합니다. 다시 말해서 표본 공간에서 일어나게 될 모든 이벤트들을 숫자로 나타내는 것입니다. 예를 들면 동전을 세 번 던져서 순서에 상관없이 앞면이 한번이라도 나올 확률은 Pr{뒤,뒤,뒤}=1/8을 제외한 Pr{앞,뒤,뒤}= 3/8, Pr{앞,앞,뒤}=3/8, Pr{앞,앞,앞}=1/8입니다. 여기서 우리가 다시 앞면이 나온 횟수를 X로 나타내면 Pr{X=0}=1/8, Pr{X=1}=3/8, Pr{X=2}=3/8, Pr{X=3}=1/8로 나타낼 수 있습니다.

확률 변수 X는 다음과 같이 밀도 함수(density function)와 분포 함수(distribution function)에 사용될 수 있습니다. 특히 확률 변수가 셀 수 없는 무한한 값에 대해서는 연속적(continuous)이라고 하며 반대의 경우에는 이산형(discrete)이라고 부릅니다.


분포 함수란 일어날 사건의 범위에 대한 확률의 분포를 나타낸 것입니다. 반면 밀도 함수는 이러한 분포 함수를 나타낼 수 있는 함수를 정의하며 밀도 함수를 앞의 식과 같이 모든 범위에 대하여 적분을 하면 1이 됩니다.

기대 값(expected value)이란 확률 변수 X를 사용하여 가 확률 현상의 결과가 수 값으로 나타날 경우 사건 시행의 결과로 기대되는 수 값의 크기를 말합니다. 예를 들면 10번의 데이터 통신을 하여 3번의 에러가 나는 네트워크에서 5번의 통신을 하면 몇 번의 에러가 발생하는가에 대한 기대 값 혹은 평균 값이라고 할 수 있습니다. 이러한 기대 값은 E[X] 혹은 μ(뮤)로 나타냅니다.


포아송 분포
확률 통계에는 정규 분포, 이항 분포, 지수 분포 등과 같이 다양한 분포가 있습니다. 이 중 포아송 분포(Poisson Distribution)는 발생 확률이 작은 사건을 대량적으로 확대하여 그 발생 횟수가 만드는 분포를 확률적으로 정의한 것을 말합니다.

포아송 분포는 전화통화 시간, 전화통신 성공 횟수, 텔넷과 ftp 세션의 연결 등을 예상하여 디자인에 사용하기 적합한 분포입니다. 또한 이번 연재의 주제인 큐잉 이론에 가장 쉽게 사용되는 분포이기도 합니다. <그림 1>은 대표적인 포아송 분포의 그래프입니다. λ는 패킷이 도착하는 비율을 나타내며 다음의 식과 같은 분포 함수를 가지고 있습니다.

    Pr[X=k] = (λk/k!) e-λ, E[X] = Var[X] = λ   
    Pr[시간 인터발 T 뒤에 k 아이템이 도착할 확률] = ((λT)k/k!) e-λT   
    E[시간 인터발 T 이후에 도착하는 아이템의 개수] = λT, 단 λ 도착 시간 비율

<그림 1> 포아송 분포 with parameter λ

네트워크 모델링에서 큐잉 이론
잠시 여러분이 2명의 주문 담당 직원이 있는 패스트푸드 음식점의 사장이라고 가정하겠습니다. 여러분의 음식점에는 오전 11시부터 오후 1시 30분까지는 평상시 2배의 손님이 들어와 주문을 하기까지 평균 15분의 대기 시간을 가져야 합니다. 이 문제를 해결하기 위해서 무엇을 가장 먼저 생각하겠습니까?

우선 고객이 기다려야 하는 15분이라는 문제를 해결해야 겠지요. 그럼 몇 명의 주문담당 직원을 추가적으로 배치해야 효과를 얻을 수 있을까요? 2명? 3명? 이러한 문제에 대한 해답을 주는 것이 큐잉 이론입니다. 앞서 언급한 것처럼 큐잉 이론은 비단 컴퓨터 모델링뿐만 아니라 수많은 산업에서 모델링에 사용되고 있는 툴입니다. 네트워크에서는 데이터를 고객으로 생각하고 주문 담당을 서버로 생각하여 효율적인 디자인을 하는 데 많이 사용되고 있습니다. 큐잉 이론에 기저하여 디자인한 분석적 모델을 프로그래밍하고 실행한다면 아주 훌륭한 네트워크 시뮬레이션 모델이 될 것입니다.

큐잉 모델
<그림 2> 싱글 서버 with parameter λ

<그림 2>는 가장 간단한 큐잉 모델입니다. λ는 큐잉 시스템에 도착하는 패킷의 도착 시간의 비율(패킷/sec)입니다. 예를 들면 라우터에 도착하는 패킷이나 전화 교환기에 도착하는 전화, 그리고 독자들의 패스트푸드 가게에 도착하는 손님들의 시간 비율이 될 것입니다. 만약 어떤 특정한 시간에 패킷이 도착했을 때 대기열에서 서비스를 기다리고 있는 패킷이 없다면 그 손님은 줄을 서지 않고 서비스를 받을 것입니다.

w는 대기열에서 서비스를 기다리고 있는 패킷의 평균 개수입니다. Tw는 대기열에서 기다려야 하는 평균 시간입니다. 여기서 평균이라 함은 패킷이 기다리지 않는 시간까지 함께 포함합니다. Ts는 서버가 패킷에게 서비스를 제공하는 시간을 말합니다.

ρ(로)는 서비스 유틸라이제이션(utilization)입니다. 이것은 서버가 일을 하고 있는 비율입니다. 예를 들어 서버 유틸라이제이션이 1인 경우는 서버가 100% 일을 하고 있다는 의미로 도착한 패킷들은 서버에서 서비스를 제공받을 수 없으며 큐에서 대기해야 합니다.

이러한 경우 디자이너들은 두 가지 선택을 할 수 있습니다. 대기열을 늘리거나 서버를 증설하거나 말이죠(들어오는 손님을 막을 수는 없겠죠?) 대기열을 늘리면 대기열에 들어오지 못하던 패킷들을 기다리게 할 수는 있지만 여전히 기다리는 패킷들의 불평은 해결할 수 없을 것입니다.

서버를 증설한다면 좀 더 원활한 서비스를 제공할 수 있겠지만 기존의 서버 유틸라이제이션이 낮아지면 전체적인 시스템 측면에서 낮은 효율의 원인이 될 수 있을 것입니다. 이러한 점이 엔지니어들이 디자인할 때 항상 고려해야 하는 트레이드 오프(trade-off)라는 것입니다.

독자들의 서버가 100%(ρ=1)로 일을 하고 있다면 큐잉 시스템을 나가는 패킷의 시간 비율은 도착하는 패킷의 시간 비율과 상관없이 항상 일정할 것입니다. 이러한 제한적 환경에서 시스템이 최대로 해결할 수 있는 도착하는 패킷의 시간 비율은 이론적으로 다음과 같이 나타낼 수 있습니다.


하나의 패킷, m이 도착했다고 가정합니다. m의 앞에는 평균적으로 w개의 패킷이 대기열에서 서비스를 받을 순서를 기다리고 있을 것입니다. m이 대기열을 떠나 서비스를 받으러 가면 대기열에는 다시 w개의 패킷이 기다리고 있을 것입니다.

그리고 Tw는 평균 대기 시간이 됩니다. 그렇기 때문에 λ의 비율로 도착한 패킷을 이용하면 w=λTw라는 것을 알 수 있습니다. 비슷한 방법으로 우리는 r=λTr임을 알 수 있습니다. 이것이 바로 리틀의 이론(Little's Formula)입니다. 리틀의 이론을 좀 더 응용하면 ρ=λTs, r=w+ρ을 구해 낼 수 있습니다.

독자들의 상사는 하나 혹은 둘의 제한(패킷 서비스 비율이나 서버 유틸라이제이션)을 주고 네트워크를 디자인하기를 원하고 있습니다. 어떻게 디자인하겠습니까? 자 그럼 이제 가장 효율적인 네트워크 디자인을 위한 연장(tool)을 다시 챙겨보도록 하겠습니다. 일반적인 큐잉 시스템에서 디자이너들에게 다음과 같은 입력(input)이 주어집니다.

[1] 도착 비율(패킷/sec)
[2] 서비스 타임
[3] 서버의 개수

그리고 다음의 결과를 요구합니다.

[1] 대기열 속의 패킷 개수
[2] 대기하는 패킷의 시간
[3] 큐 시스템 전체의 패킷 개수
[4] 전체 시간

가장 중요한 가정은 도착하는 패킷의 비율(arrival packet rate)에 관한 것입니다. 대개의 경우 성공적으로 도착하는 패킷과 패킷 사이의 시간(inter-arrival times)을 exponential하다고 가정하는데 이것은 패킷의 도착 비율 λ가 포아송 분포를 따른다는 말입니다. 이해를 돕자면 패킷이 무작위로 독립적(Independent)으로 도착한다는 말입니다.

또한 서비스 시간은 exponential하다고 합니다. 이러한 가정을 간단하게 켄돌(Kendall)의 표기법을 따서 M/M/1(엠엠원)이라고 합니다(1은 서버의 개수). M/M/1의 경우는 가장 간단한 큐잉 모델이라고 할 수 있습니다. 다음은 이러한 경우의 파라미터에 대한 대응 공식을 나타내고 있습니다.


그럼 실제 예제를 통해 큐잉 이론을 네트워크에 적용해 보도록 하겠습니다.

<예제 1>
여러분이 디자인하게 될 랜은 100명의 사용자가 연결될 것입니다. 그리고 한 개의 서버를 사용해야 합니다. 사용자의 요청에 따른 서버의 평균 서비스 타임은 0.6초입니다. 피크 타임에는 1분에 20명의 사용자가 사용 요청을 할 것입니다. 평균 대응 시간은 얼마입니까?

<풀이 1>
우선 큐잉 모델을 M/M/1로 가정합니다. 그리고 랜 상황에서 일어나는 지연(delay)은 충분히 무시할 만한 수준이라고 가정하고 디자인합니다. 예제로부터 Ts=0.6임을 알아냅니다.


<풀이 1>을 통해서 서버 요청에 따른 평균 응대 시간이 0.75초임을 알게 되었습니다.

<예제 2>
독자의 상사가 다음의 질문을 물어 보았다고 가정합니다. 다른 네트워크로 연결된 랜으로 패킷들이 보내어지고 있습니다. 모든 패킷들은 랜에 연결된 라우터를 지나서 네트워크로 보내져야만 합니다.

패킷들은 평균 5/sec으로 라우터에 도착합니다. 그리고 평균 패킷의 길이는 144옥텟(octets)이며 패킷 길이는 지수 분포를 따릅니다. 라우터로부터 네트워크까지의 라인 스피드는 9600bps입니다. 라우터에 도착한 패킷이 처리되어 나갈 때까지의 평균 시간은 얼마입니까? 또한 대기열에 있는 패킷을 포함하여 얼마나 많은 패킷이 평균적으로 라우터에 머물게 됩니까?

<풀이 2>
큐잉 모델은 M/M/1이기 때문에 우리는 공식을 사용할 수가 있습니다. 문제로부터 우리는 λ=5패킷/sec임을 알고 있습니다.


<풀이 2>를 통해서 우리는 라우터 안에 평균적으로 1.5개의 패킷이 있으며 도착해서 서비스를 받고 라우터를 나가는 평균 시간이 0.3초임을 알 수 있었습니다.

다음엔 NS-NAM을 이용한 시뮬레이션
지금까지 큐잉 이론을 이용하여 간단한 네트워크를 수학적으로 모델링을 해보았습니다. 다음에는 ‘NS-NAM으로 해보는 네트워크 디자인 소프트웨어 시뮬레이션’이란 제목으로 NS-NAM을 사용하여 간단한 예제를 실습하는 기회로 삼겠습니다.

NS-NAM은 Network Simulator-Network AniMator의 약자로 네트워크 디자이너들과 석학들이 함께 모여 만든 소프트웨어 시뮬레이션 툴입니다. TcL(티클)이라는 스크립트를 작성하여 애니메이션 효과 또한 볼 수 있는 툴로써, 플랫폼에 상관없는 이식성과 C++ 클래스로의 확장성을 통해 쉽게 네트워크를 구현할 수 있습니다. 또한 x-graph 사용법을 추가하여 독자들이 만든 네트워크 디자인을 하드웨어의 구현 없이 분석할 수 있는 경험을 할 수 있을 것입니다.

[Link] 시스템 관리자가 꼭 알아야 할「필수 네트워크 명령어 활용」

임보혁 (삼성SDS)  2005/02/18

중소기업의 전산 관리자는 프로그램 개발, 서버, 네트워크, 보안 등의 멀티플레이 업무를 맡고 있다. 이렇게 다양한 업무를 맡고 있다 보니 전문 지식의 부족함에서 비롯되는 관리상의 어려움이 많다. 하지만 효율적으로 네트워크 구성이 됐다면 전산 시스템 통합 관리나 서버 운영에 많은 도움이 된다.

...Details

문서작성의 5가지 口訣

이정규(안랩코코넛 대표이사)   2007/05/17

필자가 22년간 IT 업계에 종사하면서 세 곳의 다른 회사를 다녔지만 개발과 재무관리를 제외하고는 다양한 업무를 경험한 것 같다. 그래서인지 그 동안 나름대로 쌓아왔던 경험의 지식들을 새로 시작하는 분들이나 현재 다양한 고민을 가진 분들에게 조금이라도 도움이 되고 싶다는 생각이 드는 시기인 것도 사실이다.

...Details

훌륭한 컨설턴트가 되기 위한 세 가지 口訣

이정규/안랩코코넛 대표이사   2007/06/20

필자는 한 때 컨설턴트 직업에 대한 지향을 가진 적이 있었다. 10년 전 까지만 해도 IT 컨설턴트는 업계 경험이 적어도 20년은 넘어야 명함을 내밀 수 있다는 것이 일반적인 생각이었다. 그러나 최근에는 젊은 프로페셔널도 컨설턴트의 직함을 새겨 다니는 것을 보면 컨설팅 업무의 모델이 많이 변화된 것 같다.

...Details

2007년 7월 26일 목요일

Struktur des Netzwerkes

www.clever-linux.de

[Mag] 네트워크 전문지 온더넷

http://www.ionthenet.co.kr/

IT Wissen

Das größe Online-Lexikon für Informationstechnologie

http://www.itwissen.info/


  • Abkürzungsverzeichnis

          http://www.itwissen.info/abk-verzeichnis.html?&letter=A


 

Net Sarang

http://www.jikime.co.kr/

Network Summary

http://myhome.shinbiro.com/~hw809/

영남이공대학 컴퓨터정보기술과 - Computer related Links

http://kmh.ync.ac.kr/computer5.htm

네트워크 용어 사전

http://myhome.shinbiro.com/~sarancha

List of device bandwidths

http://en.wikipedia.org/wiki/List_of_device_bandwidths#Local_area_network

MultiNet Technical Information

http://www.multinet.co.kr/techinfo/techinfo.html

Tech-FAQ : Networking

http://www.tech-faq.com/osi-model.shtml

ATM(Asynchronous Transfer Mode)

http://www.kangwon.ac.kr/~center/atm.htm

[scrap] 스크립트 언어

원본출처 : 코리아인터넷닷컴, a 2003년 06월 02일
저자 : 정원석


스크립트 언어의 종류
(1) : 스크립트 언어란?
  • 시작하며

    쉘 스크립트로 프로그램을 만들어서 문제를 해결해 나갈 때, 그 문제가 쉘 스크립트만으로는 해결하기 어렵거나 또는 프로그램의 수행속도를 좀 더 빠르게 하고 싶은데 C나 다른언어를 사용하여 짜면 오랜 시간이 걸리기 때문에 시간 낭비를 하고 싶지 않을 경우가 생길 것이다. 그래서 그런 경우에 알맞은 여러 종류의 스크립트 언어에 대해서 알아보겠다. 광범위한 내용 중 중요하고 기본적인 내용을 다루기 때문에 부족한 부분이나 좀 더 깊이 알고 싶다면 관련 서적이나 사이트를 참고하기 바란다.

  • 스크립트 언어란?

    스크립트 언어는 다른 프로그램에 의해 번역되거나 수행되는 프로그램이나 명령어들의 나열을 말한다. 간단한 매크로나 몇 개의 명령어들을 나열하여 차례로 수행하기 위한 용도로 많이 쓰였다. 스크립트 언어도 문법이 간단한 인터프리터 언어라고 볼 수 있다.

    세대

    특   징

    0

     간단한 명령어 집합

    UUCP Chat, IRC

    1

     제어구문과 간단한 언어적 특징이 도입

    Unix(Linux) Shell, AWK

    2

    프로그래밍 언어와 비슷해져감. 스크립트만으로 각종 작업 해결

    Perl

    3

    프로그래밍 언어의 모든 기능을 구현

    Python, Ruby


    [표1] 스크립트 언어의 구분

    * 인터프리터(Interpreter)는 고급언어로 작성된 원시코드 명령문들을 한번에 한 줄씩 읽어들여서 실행하는 프로그램이다.

  • 스크립트 언어의 종류 (2) : 스크립트 언어의 종류와 사용법 - Tcl/Tk
  • 스크립트 언어의 종류와 사용법

    스크립트 언어를 선택할 때 고려하는 여러가지 요소가 있다. 에러처리, 수행속도, 라이브러리, 안정성등인데 리눅스 시스템에서 사용되어지고 있는 대표적인 스크립트 언어에 대해서 알아보도록 하자.

    1. Tcl/Tk

    소개

    Tcl/Tk 는 John Ousterhout에 의해 개발되었다. 이것은 간단한 도구에서부터 확장 언어를 거쳐서 산업 분야의 제어용 애플리케이션에 이르기까지 다양한 범위에서 사용되고 있다. 복잡한 문자열 처리보다는 툴을 연결하는 언어로서, 주로 네트워크 관련 기능을 설정하는데 쓰였다. Tcl/Tk은 언어적인 측면보다는 사용의 편리함을 더욱 강조하여 문법적인 처리와 에러처리가 약해 복잡한 프로그램 구현에는 적합하지 않다.

    설치

    설치되어 있지 않다면 소스코드를 받아서 설치해야 하며 이때 Tcl/Tk 모두의 소스가 필요하다. compress로 압축된 tar 형식과, gzip으로 압축된 tar 형식이 존재한다.

    여러분들은 tcl8.0.3.tar.gz 나 tcl8.0.3.tar.z 의 압축된 tar 파일을 구할수 있는데 이 두 파일은 압축 방식만 다를뿐 같은 파일이다.(일반적으로 .gz 파일이 .z 보다 용량이 작다) 압축을 풀려면 파일 압축형식에 따라 아래처럼 명령어를 주면 된다.

    gunzip -c tcl8.0.3.tar.gz

    혹은

    tar xf - zcat tcl8.0.3.tar.Z

    혹은

    tar xf - unzip tcl80.3.zip

    예제

    Tcl은 간단한 구조를 가진다. 매 행이 "button"과 같은 명령어와 몇 개의 인수로 구성되어 마치 C 함수의 구조와 비슷하다. 이 함수가 주어진 모든 인수를 다루게 된다.

    매우 기본적인 예로 아래에 Tcl/Tk "Hello World" 프로그램이 있다.

    # This is a comment

    button .b -text "Hello World" -command exit

    pack .b

    이 경우 tclsh이나 wish에서 하나 하나 명령어를 쳐주어야 한다. 이 명령어들을 스크립트 파일로 만들어서 마치 셀 스크립트처럼 실행할 수도 있다. 위의 예를 이처럼 하려면 아래의 파일을 만들어야 한다.

    #! /usr/local/bin wish -f

    button .b -text "Hello World" -command exit

    pack .b

    이 파일을 Hello로 저장하고 wish가 "/usr/local/bin"에 설치되어 있는지 확인한다. 그렇지 않으면 경로를 수정하여야 할 것이다. 아래 명령으로 Hello를 실행 가능하게 한다.

    chmod 775 Hello

    그리고 나서 X에서 실행시키면, 윈도우상에 Hello 버튼이 나타나고 그 버튼을 누르면 윈도우가 사라질 것이다.

    Tk

    John Ousterhout에 의해 개발된 extenede Tcl은 Tk(Tool Kit)이다. 이것은 Tcl에서 그래픽 사용자 인터페이스 오브젝트를 생성하고 관리하는 기능을 제공한다. Tk를 사용하면 정교한 그래픽 프로그램을 쉽게 작성할 수 있다.

    참조사이트

    Tcl/Tk Information


  • 스크립트 언어의 종류 (3) : 스크립트 언어의 종류와 사용법 - perl

    2. perl

    소개

    Larry Wall의 프로그래밍 언어인 Perl은 쉘과 C의 중간에 위치하고 많은 표준 유닉스 도고의 영향을 받았으며, 텍스트 관리, CGI 스크립트와 시스템 운영작업에 이상적으로 적합한 언어이다. perl은 확장성이 매우 뛰어나고 Perl/Tk 확장안을 사용하여 그래픽 사용자 인터페이스를 작성할 수도 있다.

    설치


    1. 압축되어 있는 파일을 푼다.

    gzip -d latest.tar.gz

    2. Tar 화일을 푼다.

    tar xvf perl5.005_02.tar

    3. Perl 디렉토리로 이동.

    cd perl5.005_02

    4. 인스톨 한다.

    sh Configure -des -Dcc=gcc

    특별한 지정 사항이 없고 C 컴파일러는 GCC 를 사용한다면 위와 같이 지정한다. 그러면 Perl Config 프로그램이 얼마나 똑똑한지 여러분은 보게 될것이다. 즉, Configure 프로그램이 자동으로 환경을 맞추게 된다.

    sh Configure

    문답식으로 진행하고 싶다면 위와 같이 실행.

    make

    make test

    make install

    5. Perl 을 확인.

    perl -v


    [그림1] 프롬프트 상에서 perl -v 확인

    예제

    우선 perl 프로그램을 작성하고 실행하는 방법에 대해서 알아보겠다. 다음은 hello.pl 이라는 스크립트이다.

    print "Hello, World\n";


    [그림 2] 명령 라인에서 perl 인터프리터를 실행한 모습

    참조사이트
    한국펄사용자모임


    스크립트 언어의 종류 (4) : 스크립트 언어의 종류와 사용법 - Python

    3. Python

    소개

    Python은 3세대 범용 프로그래밍 언어이다. Python은 많은 분리된 소프트웨어 콤포넌트들을 아주 쉽고 유연한 방법으로 연결하는 접착제 언어라고도 할 수 있다. 또는, 고수준의 Python 제어 모듈들이 다른 언어에 영향을 준 서브루틴 라이브러리에 의해 구현된 저수준의 연산들을 인도해가는 길잡이 언어라고도 이야기 할 수 있다.

    설치

    1. Source를 다운 받는다.

    2. 압축을 푼다.

    tar xzvf py222.tgz

    3. cd Python-2.2.2

    4. 원한다면 Modules/Setup을 편집하여 컴파일할 모듈을 선택한다(comment-out).

    5. ./configure (만일 /usr/local 이 아닌 다른 곳에 설치하려면 ./configure --prefix DIRECTORY경로명을 해주어야 한다. 쓰레드를 이용하려면 --with-threads 옵션을 추가한다)

    6. 만약에 다시 컴파일 하는 것이라면 "make clean" 한다.

    7. make

    6. 설치하기

    su (만일 수퍼유저라면)

    make install

    예제

    [그림3] 파이썬을 실행한 모습

    참조사이트
    파이썬 정보광장


    스크립트 언어의 종류 (5) : 스크립트 언어의 종류와 사용법 - Ruby

    4. Ruby

    소개

    Ruby는 Python과 마찬가지로 3세대 스크립트 언어에 속한다. Ruby는 스크립트 언어이면서도 프로그래밍 언어에 가까운 성능을 낸다. C,Java같은 프로그래밍 언어에서 볼 수 있던 다양한 기능뿐 아니라 스크립트 언어의 특징이기도 한 간결하고 직관적인 문법 구조 때문에 효율적이면서 강력한 소프트웨어를 제작할 수 있다.

    설치

    1.source를 다운받는다.( Ruby )

    2.압축을 푼다.

    tar -xvzf ruby-1.6.8.tar.gz

    3. cd ruby-1.6.8

    4. 다음과 같은 방법으로 컴파일을 한다.

    % ./configure [configure options]

    % make

    % make test

    % make install

    5.configure의 옵션을 정하고 싶다면 ./configure --help 명령어를 쳐서 옵션 리스트를 살펴보기 바란다.

    예제

    Ruby를 사용하는 방법은 두가지가 있다.

    첫 번째 방법은 쉘 프롬프트상에서 입력하는 것이다.

    $ ruby -e "Hello World"

    스크립트 파일을 작성해서 펄과 같이 실행시켜도 된다.

    $ ruby hello.rb

    두 번째 방법은 irb(Interactive Ruby Shell)을 실행시켜 사용하는 방법이다.

    irb를 실행시키면 다음 그림과 같이 루비 명령어를 이용하여 결과를 바로 확인할 수 있다.


    [그림4] irb를 실행한 모습

    참조사이트

    Ruby

  • 마치며..

    다양한 스크립트 언어가 여러분의 작업 능력과 속도를 많이 개선시키는데 도움이 될 것이다. 지금까지 배운 내용은 전부 하나의 언어들이기 때문에 강좌만으로는 부족한 부분이 많았을 것이다. 여러분들이 저중 하나를 마스터하고 싶다면 관련 서적을 사서 공부하셔야 할 것이다.

  • [scrap] 리눅스 쉘 - 쉘 프로그래밍

    출처 : 코리아인터넷닷컴, a 2003년 05월 22일
    저자 : 정원석


    리눅스 쉘 II
    (1) : 쉘 프로그래밍이란?
  • 시작하며

    리눅스의 명령어를 보면 Windows나 예전의 Dos보다 사용법도 까다롭고 명령어도 많아 유용한 기능들을 제대로 활용하기가 어렵다. 그래서 이번에는 쉘 프로그래밍을 배우면서 리눅스의 다양한 기능들을 배워보자.

  • 쉘 프로그래밍이란?

    쉘 프로그래밍은 다른 언어의 프로그래밍보다 어렵지 않다. 예전의 Dos에서 Autoexec.bat 같은 Batch 파일 작성하는 것과 비슷하게 생각하시면 된다. 순차적으로 실행되는 방식이라 프로그래밍이 그리 어렵지 않고 베이직과 같은 Interpreter방식이라 결과값도 빨리 볼 수 있고 디버깅도 쉽다. 그리고 무엇보다 리눅스의 기능들을 다양하게 활용할 수 있다.

    * Interpreter는 고급언어로 작성된 원시코드 명령문들을 한번에 한 줄씩 읽어들여서 실행하는 프로그램이다.

  • 쉘 프로그래밍의 기본 문법

    쉘 프로그램을 작성하는 방법은 두 가지가 있다. 첫번째는 명령을 차례대로 입력하고 쉘이 실행하게 해주는 것이고, 두번째는 프로그램으로 호출할 수 있는 스크립트 파일에 명령을 저장하여 실행하는 것이다. 쉘 프로그램도 프로그래밍 언어이기 때문에 기본 문법을 익혀두어야 한다.

  • 리눅스 쉘 II (2) : 변수 및 조건문

    1. 변수

    변수명=값

    위와 같이 변수의 값을 설정할 때에는 변수명 다음에 '=' 을 사용하여 값을 넣어주면 된다. 한 가지 주의할 점은 '=' 좌우에 공간이 있으면 안된다. 숫자형, 문자형 변수의 구별은 따로 하지 않으며 ""를 사용하면 문자열 변수 로 사용할 수 있다.

    string="Powerful Linux, Easy Linux"

    값이 설정된 변수를 사용할 때는 변수명 앞에 '$'자를 붙여서 쓰면 된다.

    $변수명

    2. 조건문

    ① 문법

    조건문은 어떤 조건을 테스트하고 이런 결졍에 따라 동작을 수행하는 것이다. 쉘 스크립트에서 사용되는 조건문의 구조를 살펴보고 저어구조에 대해서 살펴보자.

    test expressions
    [ expressions ]

    각 expression 사이나 [ 뒤와, ] 앞에는 꼭 공간을 넣어야만 한다.

    ② 수치 조건문

    숫자를 비교하는 조건문이다.

    [ $A -eq $B ] : A와 B의 값이 같은 경우

    [ $A -ne $B ] : A와 B의 값이 다른 경우

    [ $A -gt $B ] : A가 B보다 큰 경우

    [ $A -lt $B ] : A가 B보다 작은 경우

    [ $A -ge $B ] : A가 B보다 크거나 같은 경우

    [ $A -le $B ] : A가 B보다 작거나 같은 경우

    ③ 파일 조건문

    파일의 존재 유무와 읽기 쓰기 가능 여부를 테스트하기 위한 조건문이다.

    [ -s filename ] : file이 존재하면서 크기가 0보다 큰 경우

    [ -f filename ] : directory가 아닌 file인 경우

    [ -d directoryname ] : file이 아닌 directory인 경우

    [ -w filename ] : 쓰기가 가능한 경우

    [ -r filename ] : 읽기가 가능한 경우

    [ ! -option filename ] : option의 조건이 거짓이 되는 경우

    ④ 문자열 조건문

    문자열 검사로서 문자열을 비교할 때는 꼭 ""를 사용하여야 한다.

    [ "string1" = "string2" ] : 두 문자열이 같은 경우

    [ "string1" != "string2" ] : 두 문자열이 다른 경우

    [ -z "string" ] : 문자열의 길이가 0인 경우

    [ -n "string" ] : 문자열의 길이가 0이 아닌 경우


    리눅스 쉘 II (3) : 흐름 제어 - 1

    3. 흐름 제어 - 1

    if / elif / else

    문법

    if condition
    then
    statements
    elif condition
    then
    statements
    else
    statements
    fi

    * if의 개수만큼 fi를 사용해야 한다.

    ex)

    설명: 만약 wacky라는 file이 존재한다면 그 이름을 merong로 바꾸고 wacky가 존재하지 않고 haha라는 파일이 존재하면 haha를 huhu로 바꾼다.

    if [-f wacky]
    then
    cp wacky merong
    elif [-f haha]
    then
    mv haha huhu
    else
    echo "흠흠...예제"
    fi

    if 문을 사용할 때는 주의할 점이 몇가지가 있다. if문을 쓸때는 then과 fi를 항상 같이 써야 하고, 쉘에서 스크립트를 분석할 때는 줄 단위로 하기 때문에 if,then,fi를 다른 줄에 써야 한다. 그리고 then 다음에 아무런 내용이 없으면 오류가 발생한다. 그래서 ':'(true command)를 then 뒤에 붙이던가 아니면 else문을 쓰지 않아야 한다.

    for

    in 뒤의 리스트들을 for 다음에 나오는 변수의 값으로 하나씩 대치시켜 사용한다.

    문법

    for 변수 in list1 list2 list3 ...
    do
    statements
    done

    * list은 공간으로만 구별한다.

    ex)

    설명: list값이 하나씩 ha로 들어가 화면에 출력된다.

    for ha in wacky haha merong
    do
    echo $ha
    done

    While

    조건이 만족하는 한 do done 사이의 statments를 반복하여 실행한다.

    문법

    while condition
    do
    statements
    done

    * 조건문이 항상 True거나 0보다 크게 되면 무한 루프가 되버린다.

    ex)

    설명: ha의 값을 20이 될 때까지 반복하여 찍는다.

    ha=1
    while [ "$ha" -le 20 ]
    do
    echo $ha
    ha=$(($ha+1))
    done

    Until

    while 과는 반대로 조건문이 True이면 루프를 끝낸다.

    문법

    until condition 
    do
    statements
    done

    ex)

    until who | grep "wacky"
    do
    sleep 10
    done

    리눅스 쉘 II (4) : 흐름 제어 - 2

    3. 흐름 제어 - 2

    continue and break 문

    continue와 break문은 다른 언어에서와 비슷하게 사용한다. 둘다 루프문 안에서 사용되고 continue는 루프문 중간에 continue이하를 실행하지 않고 다시 조건 검사를 하는 것이고, break문은 루프문을 강제로 빠져나올때 사용한다.

    ex)

    while :
    do
    read x
    if [ "$x" = "yes" ]
    then
    continue
    else
    break
    fi
    done

    case 문

    case문은 변수 값에 따라서 선택 작업을 할 때 사용한다.

    문법

    case variable in
    pattern1 [| pattern2 ] ... ) statements ;;
    easc

    ex)

    read temp
    case "$temp" in
    x|X)
    echo "Exit"
    exit;;
    list)
    ls -a;;
    easc

    Redirection

    Redirection은 표준입력과 표준출력의 방향을 결정해주는 역활을 한다.

    문법

    > file 또는 1 > file : file로 내용을 출력한다.

    >> file 또는 1 >> file : file에 내용을 덧붙인다.

    < file : file로 부터 내용을 읽어들인다.

    2> file : file로 error 내용을 출력.

    | : '|' 왼쪽의 출력 내용을 '|'오늘쪽의 입력으로 사용한다.

    ex)

    cp temp tmp 2> errorfile
    if [ -s errorfile ]
    then
    echo "Error"
    fi

    리눅스 쉘 II (5) : 함수 만들기

    4. 함수 만들기

    C 언어와 비슷한 형태의 함수를 Shell Script안에 선언하여 사용할 수 있다.

    문법

    function()
    {
    statements
    }

    ex)

    설명: 여러곳의 taget으로 file을 복사하는 함수

    multicopy()
    {
    source=$1
    while[ $# -gt 1 ]
    do
    cp $source $2
    shift
    done
    }
    multicopy temp temp1 temp2 temp3

  • 마치며..

    앞으로 리눅스를 사용하면서 간단한 반복작업을 하는 프로그램을 짜야 하는 경우가 있을것이다. 쉘 프로그래밍은 문법이 다른 언어에 비해 그리 어렵지 않아 배우기가 쉽기 때문에 사용할 줄 안다면 리눅스에서 매우 편하게 작업할 수 있을것이다.