Lectures/CN/2013

From MCLab
Jump to: navigation, search

Contents

컴퓨터네트워크및실습 Class Overview

인터넷을 중심으로 컴퓨터를 네트워킹하고 유용한 정보통신서비스를 제공하여 주는 기본 구조와 인터네트워킹 기술, 프로토콜을 학습하고 내재한 기본 원리를 시스템 관점에서 분석함으로써 네트워크의 실체와 응용 능력을 배양함과 아울러 공학적 측면에서 설계할 수 있는 이론과 분석 능력을 키운다.

화 7, 8교시 (5402), 목 5, 6교시 (5405)
Textbook
Jame F. Kurose, Keith W. Ross, Computer Networking - A Top-Down Approach Featuring the Internet, 6th Ed., Addison Wesley Longman, 2012. 2.
번역판: 최종원, 강현국, 신용태 옮김, 컴퓨터네트워킹 - 하향식 접근, 6판, Pearson Education Korea, 2012. 11.
보조 web site [1]
References
Ying-Dar Lin, Ren-Hung Hwang, and Fred Baker, Computer Networks - An Open Source Approach, MxGraw-Hill, 2012.
Evaluation
시험 4회(80%), 실습 보고서/Homeworks/Assignments(20%)
결석 -1%/회, 지각 -0.5%/회
학과에서 졸업자격을 엄격하게 시행하고 있습니다. 본 과목은 전공필수이기 때문에 이수 자격을 엄격하게 판정합니다. 2012학년도의 경우 46명 수강자 중 중간 포기자 2명 포함하여 총 8명이 이수에 실패했습니다. (이 과목을 이수하지 못하면 졸업이 불가합니다.)
과제물의 제출
PDF로 변환하여 자정(24:00) 이전에 E-class에 제출한다. 단, 조를 구성해서 수행하는 경우 대표 한 사람만 제출한다.
Teaching Assistant
정재경, phone : 010-9139-6298, mail to : jaek1234@nate.com (WLCLAB 공대 304-1호)

공지사항

시험-1

일시: 10/8(화) 8교시 - 7교시 수업 마친후
시험범위: 1장, 2장
시험-1 결과  : 시험1_순위별

시험-2

일시: 11/12(화) 수업시간
시험범위: 3장 Transport Layer

예비군 훈련과 공모전 전시 나가는 학생들을 고려해서 시험일자를 당깁니다. 대신에 Ass-5.3 검증은 11/14(목)에 실시합니다.

시험-2 결과  : 시험2_순위별

시험-3

일시: 12/17(화) 7교시
시험범위: 4, 5, 6장
시험-3 결과  : 시험3_순위별

Lecture Material

실습

실습 준비사항

Install Xshell and WireShark
How to use Xshell and WireShark
java network programming

실습일 및 실습내용

실습자료

Homeworks

HW-1 1장 연습문제 풀기(9/11까지)

복습문제 R21, 연습문제 P6, P7, P18, P25-28에 답하라.

PDF로 변환해서 e-class에 제출하세요.

HW-2 IPv6의 특성(12/2까지)

다음을 읽고 IPv6의 주소체계와 특장점을 10쪽 내외로 요약하라.

비 IT부문의 IPv6기반 서비스 연계방안 연구 보고서 중 2장

Assignments

2인 1조로 과제 수행

Ass-1 HTTP Protocol 분석(9/16까지)

2가지 이상의 web browser로 http://mclab.hufs.ac.kr/test/index.html 의 base page와 image object을 가져오는 방식이 persist or non-persist HTTP 인지, parallel HTTP 인지 알아내고 그 이유를 메시지 주고 받는그림(sequence diagram) 을 그려서 설명하라.

  • 2인 1조로 수행하되, 조당 한 사람만 e-class에 PDF로 제출

Ass-2 Simple HTTP Client - 9/30(월)까지

HTTP 프로토콜 표준을 따라 GET method 만을 지원하는 HTTP client를 구현하라. GET method를 지원하고, page와 이에 포함된 image object들도 download해야 한다.

  • Computer Networks 교재 2장, 보다 자세한 사항은 web에서 찾아 보기 바랍니다.
  • Linux나 Windows에서 C 또는 C++로 프로그래밍 하세요. Java는 허용하지 않습니다.
  • Eclipse IDE에서 C Programming하기 위해 MINGW나 Cygwin을 활용하면 편리합니다.

참고: HTTP Client Procedure Outline

  • HTTP Client Test를 위해 "http://mclab.hufs.ac.kr/test/index.html"를 사용하세요.
  • 2인 1조로 수행하되, 조당 한 사람만 e-class에 PDF로 제출 (source code 및 시험결과 화면 포함)
  • 제출기한 넘겨 하루 지연당 만점이 10%씩 감점됨
Useful sources
아래 참고자료에서 lib/set_address.c, lib/error.c 를 활용하세요.

Ass-3 Multi-Threaded WebServer - 10/9(수)까지

GET method만을 지원하는 Web Server를 Java를 이용하여 Multi-Thread로 구현하여 여러 HTTP client의 요청을 지원하도록 구현하세요

Ass-4 Ubuntu VM, Eclipse, Teamwork 환경 만들기 - 10/18(금)까지

Linux virtual machine을 학교나 여러분 소유의 컴퓨터에 만들고, Eclipse와 필요한 tool들을 설치하여 software project에 이용하자. VM을 일단 만들면, 같은 컴퓨터에 복제하거나, 다른 컴퓨터에서 사용할 수 있게 내보내고(export) 가져올(import)할 수 있다. 즉, USB에 넣어 virtual machine을 통째로 옮길 수 있다는 뜻이다. 한편, 팀으로 프로젝트를 진행하거나, 또는 혼자서 학교와 집에서 다른 컴퓨터로 Eclipse로 code를 개발한다면 버전 관리하면서, 여러명이 공동 작업하는 Source Version Control 하는 환경이 필요하다. 각 조별로 이러한 환경을 구축하고, 개인별로 복제하여 사용하자.

Tools page를 참고하여 아래 순서대로 진행하고, 결과를 제출하세요.

  1. Windows PC에서 Linux Virtual Machine 만들기
  2. Eclipse for Java, C/C++, Android, and Teamwork
  3. VM간 통신
    • 두개의 VM에서 ifconfig를 실행하고, ssh로 상대 mcahine을 연결하고, 이때를 보여주는 두개의 VM의 윈도우를 캡쳐해서 제출
  4. Teamwork with Eclipse + Subversion
    • http://mclab.hufs.ac.kr/svn/np SVN 저장소에 다음 Assignment 수행에 필요한 rdt3.0 project source 파일들이 있다. 이를 Eclipse에서 가져온(checkout) 결과를 보여주는 Eclipse 화면을 캡쳐해서 제출

Assignment-5 Design and Implementation of RDT 3.0 Protocol - 11/4(월)까지

Assignment-5.1 설계까지 제출: 10/28(월)까지
Assignment-5.2 결과까지 전부 제출: 11/4일(월)까지

문제

RDT 3.0 Protocol을 아래의 다음에 따라 설계하고, 최종 구현물을 작성하여, 두 개의 Ununtu VM에서 구동되는 sender와 receiver가 잘 작동함을 검증하고(기능시험), timeout 기간을 달리 설정하면서 성능을 측정하라(성능시험).
  1. 설계
    • 교과서에는 sender나 receiver가 종료하는 event가 없다. Sender는 EoF를 읽으면 END 라는 control packet을 보내고, ACK를 받아야 종료되게 하자. RDT recevier는 END packet을 받으면 ACK packet을 연속하여 3개를 보내고 종료한다. 3개를 보내는 이유는 ACK도 손실될 수 있기 때문에 3개 중 하나라도 sender에게 도착할 가능성을 높이려는 시도다. 물론, 종료하기 전에 receiver는 성능 측정치들을 output해야 할 것이다.
    • sequence number를 저장하는 variable 'seq'를 도입하여 state 갯수를 교과서의 절반으로 줄여보자. 그리고, 교과서와 달리 ACK 번호를 잘 받은 packet 번호가 아니라, 다음에 받을 번호로 하면 구현하기 더 편리한지도 알아보자. (UML state diagram 표준을 따라 그리세요.)
  2. 구현
    Hint: select() 함수를 사용하면, application message가 도착했는지(stdin ready?), 상대편에서 data packet이나 ACK packet이 도착했는지(socket ready?), timeout이 발생했는지를 확인할 수 있다. 물론, timer를 reset할 수도 있다.
  3. 기능 시험: test case들을 이용한 시험 (모든 경우에 잘 작동하는지 검증)
  4. 성능 시험: 기능시험이 통과된 후 Timeout은 1, 10, 100, 1000 msec로 설정하고, receiver는 아래의 통계치를 인쇄하고, 그 결과를 분석하라. - 성능시험에 사용될 Input File : http://www.rfc-editor.org/rfc/rfc793.txt
    • # of DATA packets received (including retransmitted packets)
    • # of duplicated DATA packets received
    • # of DATA packets correctly received
    • # of bytes correctly received
    • Transmit duration (msec) - Receiver가 첫번째 packet을 받은 순간 부터 END packet을 받을 때 까지의 시간. gettimeofday()로 시작 시각과 종료 시각을 얻어서 그 차이를 계산하면 된다.
    • Throughput (byte/second)

참고: RDT 3.0 구현에 제공되는 source list (Eclipse에서 checkout해서 가져오세요) 2013-10-29일 update되었으니 새로운 버전 활용하세요

st_sender project folder
packet.h (packet format)
np.h (Common header for network programming)
error.c (exception handling and diagnostic message)
in_cksum.c (Internet checksum generation and detection)
set_address.c (IP address resolution function)
udt_send.c (Unreliable data transfer function. May cause checksum errors and packet loss)
timer.c (set or reset timout)
getEvent.c (get an event)
packet.c (packet encapsulation, check packet header skeleton) - code를 삽입하여 완성하세요
sender.c (sender skeleton) - code를 삽입하여 완성하세요
st_receiver project folder
receiver.c - code를 삽입하세요.
필요한 function들을 작성하세요. St-sender source들을 같이 사용할 수 있습니다. Copy하거나 object를 linking하거나, 공통되는 object들을 library로 만들어 쓸 수도 있습니다. 쉬운 방법으로 하세요.

제약조건

  1. RDT 3.0 sender는 application data를 test file에서 읽고, <LF>로 구분되는 한 줄(최대 1,400 bytes)을 읽고, packet을 만들어 보낸다. RDT 3.0 receiver는 받은 packet을 file로 출력한다.
  2. Sender는 EoF을 만나면 recever에게 종료를 알려주기 위해 END라는 control packet을 전송하고, 이를 받으면 recevier는 ACK로 응답한다. 물론 END와 ACK control packet도 lost 또는 corrupt될 수 있다.
  3. Packet은 하나도 빠짐없이, 순서에 맞게, 그리고 bit error 없이 정확하게 전달되어야 한다.
  4. 요즘 네트워크에서는 packet loss가 거의 발생하지 않기 때문에, udt_send()로 packet을 전송할 때 1/10 확률로 random하게 packet을 lost 시켜야 한다. (다시 말해, 보내지 않으면 된다.) 또한, Packet error rate (packet 중에 bit error 가 하나 있을 확률)은 1/10로 보내기 전에 bit error를 발생시켜야 한다. (참고: udt_send.c)

보고서 작성 요령

공학설계의 단계에 따라 다음 내용이 포함되어야 한다.

  1. 문제정의
    • 문제기술문(Problem statement)를 명확히 하고
    • 제한조건이 명시되어야 함
  2. 설계
    • 설계 명세를 포함해야 함
    • State diagram, information flow(sequence diagram)은 반드시 포함되어야 함
  3. 시험결과
    • 기능시험 과정과 결과를 캡쳐한 증빙자료
    • 성능시험 결과를 캡쳐한 증빙자료
  4. 결과의 분석
  5. 부록
    1. Project directory와 version을 보여주는 Eclipse C/C++ Perspective 화면
    2. SVN Resource History 화면 (수정한 사람과 이력을 알 수 있음)
      SVN Respository Perspective에서 모든 source file 마다 각각 우 클릭>Show Resource History 한 후 화면 캡쳐
    3. source code (source를 인쇄하는 tool을 사용하여 double column으로 인쇄하여 보고서에 포함)

Assignment-5.3 재설계 및 검증(11/14)

다시 설계하고, 잘 동작하는지 검증한다.

  • 설계문서 제출: 11/14(목) 수업시간 전까지 e-class에 제출
  • 검증: 11/14(목) 13:30 405호 강의실
  • 준비사항: 노트북이나 305호 실험실 또는 4층 논문실 PC에 모든 준비를 갖춰 놓고, 301호 PC에서 원격터미널 접속하여 보여준다.
  • 20점 만점임

검증 과정

  1. 검증용으로 새로운 Eclipse workspace를 만든다.
  2. 이 workspace에서 여러분의 SVN repository(Google coe)에서 checkout해서 가져온다.
  3. Sender project와 Receiver project를 build 한다.
  4. Sender 용, receiver용 terminal을 각각 띄우고, sender와 receiver를 debug mode로 run시켜 잘 동작하는지 확인한다.
  5. Sender의 Debug 폴더에 rfc793.txt를 download한다.
    • ./st_receiver -d -t 1 > rfc793.txt
    • ./st_sender -d < rfc793.txt
    • 두개의 파일이 같은지 비교해 본다: diff rfc793.txt ../../st_receiver/Debug/rfc793.txt
  6. 이를 통과하면 timeout이 1, 10, 100, 1000msec 인 경우를 반복하여 성능 시험을 수행하고 결과를 제출한다.
    • ./st_receiver > rfc793.txt 2> stat_1 # stderr을 stat_1로 redirect ( stat_<timeout> 으로 파일 이름을 지정할 것)
    • ./st_sender -t 1 < rfc793.txt
    • 두개의 파일이 같은지 비교해 본다: diff test.txt ../../st_receiver/Debug/rfc793.txt

Receiver 프로그램 소스를 제공합니다. 아울러 make_pkt() 소스도 올려 놨으니 checkout으로 받아 가세요. 여러분은 sender.c만 작성하면 됩니다. 제공된 receiver와 testing하세요.

Receiver 프로그램 build하기
project folder에서 우클릭>Properies>C/C++Build-Setings 화면에서
  1. Sender project 폴더의 include 파일 이용하기
    • GCC C Compiler-includes 선택>include paths 추가 버튼>workspace 버튼>sender project 폴더 선택
  2. Sender project 폴더의 object 파일 이용하기
    • GCC Linker-Miscellaneous 선택>Other objects 추가 버튼>workspace 버튼>sender project의 Debug 폴더 내의 관련 object 파일들 선택 (error.o in_chksum.o packet.o set_address.o udt_send.o)
  3. 먼저 sender project를 빌드하여 관련되는 object 파일들을 미리 만든 후에 receiver project를 build한다.

st_receiver project의 .project, .cproject 파일도 가져왔다면 위 사항이 이미 반영되어 있을 것임.