1. 네트워크 프로그래밍 개요1.1 컴퓨터통신 프로토콜컴퓨터 통신 프로토콜컴퓨터 통신 프로토콜: 데이터를 원활이 주고받을 수 있도록 정한 약속통신 프로토콜의 특징: ‘효율적’, ‘안정적’으로 통신할 수 있도록 ‘미리 정한’ 약속OSI 7-Layer물리 – 링크 – 네트워크 – 트랜스포트 – 세션 – 표현 – 응용1.2 네트워크 프로그램 구현 모델연결형과 비연결형 서버연결형 서비스: 종점간 연결 설정/해제, 데이터 송수신. ex) TCP protocol, telnet, ftp비연결형 서비스: 종점간 연결 설정/해제 작업 없이 바로 데이터를 주고 받음. ex) UDP protocolStateful과 Stateless 서버Stateful 서버: 클라이언트로 통신 상태를 계속 추적하여 서비스를 제공Stateless 서버: 상태 정보를 이용하지 않고 독립적인 요청에 의해 서비스를 제공비교: 네트워크가 안정적일 경우 stateful 이 유리 (인터넷 환경은 stateless 가 안정적)Iterative와 Concurrent 서버Iterative 서버: 클라이언트의 요청을 순서대로 처리. concurrent 서버보다 구현이 간단함Concurrent 서버: 클라이언트 요청을 동시에 처리. 각 서비스 처리 시간이 불규칙적이거나 길 때 필요1.3 네트워크 서비스의 성능성능 척도처리 용량, 안정성, 처리율, 지연, 효율(전송된 데이터 중 순수데이터가 차지하는 비율)1.4 유닉스 프로그래밍 환경1.4.1 네트워크 환경ping: 다른 호스트와의 연결 상태를 확인arp: 자신이 호스트가 가지고 있는 arp 캐쉬의 내용을 확인host: DNS서버를 이용하여 임의의 호스트에 대한 정보를 확인ifconfig: LAN카드 등의 네트워크 인터페이스 카드의 설정 내용 확인netstat: 네트워크의 여러 가지 상태를 확인하는 명령어traceroute: 임의의 호스트 어떤 경로를 통하여 연결되었는지 확인2. 소켓 프로그래밍 기초2.1 소켓 개요소켓 정의TCP나 UDP와 같은 트랜스포트 계층(Laye/ 32비트의 IP 주소를 저장할 구조체}struct sockaddr_in {short sin_family; // 주소체계u_short sin_port; // 16비트 포트번호struct in_addr sin_addr; // 32비트 IP주소char sin_zero[8]; // 전체 크기를 16바이트로 맞추기 위한 dummy}sin_familyAF_INET: 인터넷 주소 체계AF_UNIX: 유닉스 파일 주소 체계AF_NS: XEROX 주소 체계소켓 사용 절차2.2 인터넷 주소변환바이트 순서호스트 바이트 순서컴퓨터가 내부 메모리에 숫자를 저장하는 방식80x86: little-endian, MC68000(or sparc system): big-endian네트워크 바이트 순서포트번호나 IP주소와 같은 정보를 바이트 단위로 전송하는 순서high-order(bid-endian)로 전송80x86과 MC68000간의 데이터 전송: 바이트 순서가 바뀜80x86계열에서는 호스트 바이트 순서와 네트워크 바이트 순서가 다름0x0007 (big-endian), 0x0700 (little-endian)바이트 순서를 바꾸는 함수unsigned short integer 변환htons(): host-to-network 바이트 변환ntohs(): network-to-host 바이트 변환unsigned long integer 변환htonl(); host-to-network 바이트 변환ntohl(): network-to-host 바이트 변환바이트 순서 확인 예현재 사용 중인 컴퓨터의 호스트 바이트 순서가 네트워크 바이트 순서와 같은지를 확인struct servent {char *s_name; // 서비스 이름char **s)aliases; // 별명 목록int s_port; // 포트번호char *s_proto; // 사용하는 프로토콜};struct servent *servent = getservbyname(“echo”, “udp”);IP주소 변환IP주소를 도메인 네임과 dotted decim절차connect(), 서버에 연결 요청클라이언트가 connect()를 호출하여 서버에게 연결 요청 (3-way 핸드쉐이크가 시작)문법인자int connect(int s,const struct sockaddr *addr,int addrlen);s서버와 연결시킬 소켓번호addr상대방 서버의 소켓주소 구조체addrlen구조체 *addr의 크기send(), recv(), 데이터 송수신문법인자int send(int s, char *buf,int length, int flags);s소켓번호buf전송할 데이터가 저장된 버퍼lengthbuf 버퍼의 크기flags보통 0int write(int s, cont void *buf,int length);s소켓번호buf전송할 데이터가 저장된 버퍼lengthbuf버퍼의 크기int recv(int s, char *buf,int length, int flags);s소켓번호buf수신 데이터를 저장할 버퍼lengthbuf버퍼의 길이flags보통 0int read(int s, void *buf,int length);s소켓번호buf수신 데이터를 저장할 버퍼lengthbuf버퍼의 길이send() 와 recv() 함수에서는 flags 옵션을 지정. 일반 데이터를 다룰 때에는 0으로 지정최대 세그먼트 크기 (MSS: maximum segment size)IP데이터그램에 실어서 전송할 수 있는 최대 데이터 크기write() 나 send() 로 보낼 경우, 전체 데이터가 MSS 보다 클 경우 분할되어 여러 번 전송TCP에서는 세그먼트의 순서 확인과 데이터그램 분실을 수신측에서 검사하고 재전송을 하는 신뢰할만한 통신을 제공하지만, UDP는 이러한 에러제어를 제공하지 않음write() 나 send() 를 실행하면 데이터는 TCP계층에 있는 송신버퍼(send buffer)에 들어감함수의 리턴은 목적지에 전달이 아닌 송신버퍼에 들어갔다는 것을 의미close(), 소켓 닫기소켓의 사용을 종료close() 를 호출한 시점에서의 송신버퍼아직 전송되지 못한 데이터는 호를 확인클라이언트에서는 특정 포트번호를 배정하지 않고 시스템이 임의로 배정하기 때문2.4 TCP 서버 프로그램TCP 서버 프로그램 작성 절차bind()socket() 으로 생성된 소켓은 응용 프로그램 내에서 유일한 소켓번호를 배정 받음소켓번호는 응용 프로그램만이 알고 있는 번호IP 주소와 포트번호를 연결하기 위해 사용서버에서 bind() 가 필요한 이유임의의 클라이언트가 서버의 특정 소켓으로 접속하기 위해 서버는 자신의 소켓번호와 클라이언트가 알고 있는 자신의 IP 주소 및 포트 번호를 미리 서로 연결시켜두는 것이 필요INADDR_ANY서버가 두 개 이상의 IP 주소를 가지고 있을 때 임의의 서버 IP 주소를 목적지로 하여 들어오는 데이터그램을 받아들이겠다는 의미.즉, 서버에 할당된 IP 주소들로 연결을 받아들이겠다는 의미s = socket(PF_INET, SOCK_STREAM, 0);struct sockaddr_in servaddr;servaddr.sin_family = AF_INET;servaddr.sin_addr.s_addr = htonl(INADDR_ANY);inet_pton(AF_INET, “192.168.0.3”, &servaddr.sin_addr);servaddr.sin_port = htons(SERV_PORT);bind(s, (struct sockaddr *)&servaddr, sizeof(servaddr));listen()능동적 소켓: 요청을 보내는 클라이언트 소켓수동적 소켓: 연결 요청을 받아들이는 서버의 소켓listen() 을 이용하여 수동적 소켓으로 변경socket() 에 의해 생성되는 소켓은 기본적으로 능동적 소켓int listen(int s, int backlog)backlog: 연결을 기다리는 클라이언트의 최대 수accept()클라이언트와 설정된 연결을 실제로 받아들이기 위해 사용int accept(int s, struct sockaddr *addr, int *addrlen)성공 시 접속된 클라이언트와의 통신에 사용할 새로운 소켓 DGRAM, 0);...sendto(s, buf, strlen(buf), 0, (struct sockaddr *)&servaddr, addrlen);recvfrom(s, buf, MAXLINE, 0, (struct sockaddr *)&servaddr, &addrlen);udp_echoserv.c한 쪽이 sendto() 를 호출했으면 상대방은 반드시 recvfrom()을 호출하고 있어야 함s = socket(PF_INET, SOCK_DGRAM, 0);...while (1) {nbyte = recvfrom(s, buf, MAXLINE, 0, (struct sockaddr *)&cliaddr, &addrlen);...sendto(s, buf, nbyte, 0, (struct sockaddr *)&cliaddr, addrlen);}Connected UDPUDP 소켓sendto() 로 데이터를 전송하는 순간 소켓과 커널이 내부적으로 연결UDP 소켓을 통해서 처리속도 향상을 위해 사용 가능커널은 인자로 받은 소켓주소와 UDP소켓을 내부적을 연결해 둠TCP와 같은 3-way 핸드쉐이크 연결설정이 이루어지지 않음connect() 함수를 호출send() 나 recv() 함수를 사용해야 함유의사항잘못된 IP 주소에 의한 연결에도 connect() 함수는 에러가 발생하지 않음read(), recv() 실행 시 에러가 발생연결된 UDP의 고정된 통신 상대를 connect() 로 변경 가능연결된 UDP 사용 종료sin_family = AF_UNSPEC으로 설정하고 connect() 호출3. 유닉스 프로세스3.1 프로세스의 이해프로세스의 정의프로세스: 실행중인 프로그램프로세스의 모드: 사용자 모드, 커널 모드프로세스의 상태: running, waiting, stopped, zombie프로세스의 메모리 배치#include #include extern char **environ;int init_global_var = 3;int uint_global_var;int main(int argcv()
Software Development Life CycleSoftware Development Life Cycle비즈니스 모델링 (Business Modeling): 타당성 조사, 비용 산정, 계획요구사항 (Requirements): 시스템의 기능, 특성분석과 설계 (Analysis & Design): 문제가 무엇인지, 어떻게 문제를 해결하는지구현 (Implementation): 코딩, 유닛 테스트테스트 (Testing) 통합 테스트 (Integration testing), 시스템 테스트 (System testing)배포 (Deployment)Object-Oriented ConceptObject-Oriented Programming (OOP)Functional Design, Object-Oriented Design – 뒤에서 다루어짐OOP의 장점: 복잡한 시스템을 다루는데 용이, 유지보수와 재사용이 용이Object-Oriented Design: A Paradigm복잡한 문제를 풀어내는 기본 원리Divide and Conquer (분할 정복): 시스템을 부분으로 나눔Loose coupling between parts: 낮은 결합도High cohesion within a part: 높은 응집도어떻게 문제를 작은 부분으로 나누는가Structured Design (전통적인 방법)Object-Oriented Design (새로운 방법)Object-Oriented Design (OOD)Object는 업무담당자로 비유할 수 있음. 서로에게 요청(message)하여 문제를 해결장점: 실 세계의 개체를 모델링 하기 쉬움. 유지보수가 용이단점: 변경에 비용이 들어간다 (배우는데도 비용이 들어감)Structured Design한 사람이 단위업무(function)를 정의하여 업무유지보수성이 OOD에 비해 떨어진다.Legacy Software SystemLegacy software system: 기존에 구축되어 있던 시스템기존에 legacy system이 functional langueptsObject, Class, Encapsulation, Infomation hiding, Inheritance, Polymorphism객체, 클래스, 캡슐화, 정보의 숨김(은닉성), 상속, 다형성An Example: Graphic Editor각 도형은 에디터 윈도우에서 객체에 상응하게 표현된다.ObjectState: attributes (member variables) - 속성 (멤버 변수)Behavior: operations (member functions) - 연산 (멤버 함수)Identity: 객체들이 같은 상태를 가지더라도 다름Class비슷한 객체들은 클래스로 분류된다.Object 는 클래스의 인스턴스.클래스의 구성nameattributesoperationsEncapsulation형태상으로 데이터와 연산(operations) 이 하나의 단위로 구성데이터와 구현을 클라이언트로부터 숨김 (은닉성)객체의 캡슐화operation 의 데이터와 구현private 데이터유지보수성이 향상됨 (내부 구현이 변경되더라도 그 객체를 이용하는 객체에는 영향을 끼치지 않는다)객체는 public 인터페이스를 제공객체는 public interface 를 호출함으로써 메세지(Messages) 를 보낼 수 있다.Message객체는 다른 객체에 메세지를 보냄에 의하여 접근한다.Inheritance조금 더 일반적인 클래스(general) 로부터 파생된 조금 더 구체적인 클래스(specific) 를 정의Subclass(specific) 는 superclass(general) 로 부터 모든 속성(attributes), 연산(operations) 과 관계를 상속받는다.자바의 extends 키워드Abstract Class추상 클래스자손 클래스(descendant classes) 에게 일반적인 특성(attributes or operations) 을 상속한다.최소 한개 이상의 구현이 없는 오퍼레이션 (abstract operations) 을 갖는다.인스턴스화 될 수 없음참고) concrete을 정의하고 그들간에 존재하는 정적인 관계(relationship)을 다양한 방법으로 표현클래스의 properties(attributes and associations)와 operations 를 보여주며, 객체들의 연관이 성립되기 위해 만족시켜야할 구현 조건을 제약사항(constraints)으로 정의Attributes & OperationAttributes (속성, 변수, …)Operation (연산, 함수, …): 서비스의 구현체c.f.) method: operation의 구현체Visibility+ (public): 프로그램 내 어디에서도 접근이 가능- (private): 정의된 클래스 내에서만 사용이 가능# (protected): 정의된 클래스와 서브 클래스에서 사용이 가능~ (package): 정의된 클래스와 해당 클래스와 같은 패키지에서만 사용이 가능Attribute & OperationAttributevisibility name : type multiplicity = default-value {property-string}-forecolor : Color = Black-name : String [1] = “Untitled” {readOnly}Operationvisibility name (parameter-list) : return-type {property-string}parameter-listcomma(,)로 구분한다.direction name : type = default-valuedirection: in, out, inout+move(x:Integer, y:Integer) : Boolean+balanceOn(in date : Date) : Money {query}ClassRelationshipsAssociation: (Aggregation, Composition)GeneralizationRealizationDependencyAssociation (연관)Association: 두 클래스의 인스턴스 간의 관계Properties이름role name ( 때 그 클래스는 자신이 원하는 객체를 찾기 위해 특정한 attribute에 의존할 수 밖에 없는데, 이것이 식별자 (=qualifier)에 해당한다.Association Class연관 관계에 놓인 두 클래스 간에 다대다 관계를 형성할 때, 연관 관계 자체에 대해 여러 속성을 가질 경우 해당 속성을 저장하기 위해 별도의 클래스를 두게 되는데, 이 클래스를 association class라 한다.연관 클래스는 각 클래스들과의 1의 multiplicity를 갖는다. (나머지는 화살표를 참조)중복된 정보는 ‘/’ 로 표시한다. (employee, employer)Aggregation & CompositionAggregation (집합): 객체가 특성 클래스의 일부로 속하는 연관Composition (합성): 더 강한 연관관계. 객체가 부모의 일부일 뿐만 아니라 다른 인스턴스에 공유되지 않는다.전체가 소멸할 경우 같이 소멸된다.Generalization클래스들 간의 is-a 관계 (B extends A, B is a A, B는 A이다.)Inheritance: subclass는 superclasses로부터 상속된다. (superclass는 0 or more)Subtyping (서비스 상속): 인터페이스 상속Subclassing (구현 상속)cf) Subclassing 없는 subtyping: 인터페이스(or abstract operation)를 구현하는 경우cf) Subtyping 없는 Subclassing: 외부에 서비스를 제공하지 않는 private 상속Abstract Class한 개 이상의 operation이 추상화일 경우. 직접적으로 인스턴스화 되지 않는다.추상 클래스와 메소드(operation)은 기울임체(이텔릭체)로 기술한다.Interface인터페이스는 구현이 없는 클래스 (Java와 C#의 Interface)클래스와 인터페이스 간의 관계provides an interface인터페이스나 서브타입의 인터페이스를 구현 (realization)requires an표현한다.상속 (Inheritance)Generalization구현 (Interface implementation)RealizationLocal,Global variable / Parameter / Sending messageDependencyTip 1: Common mistake오직 primitive type만을 클래스의 attributes로 쓴다.Association관계의 변수는 association의 role-name으로 정의한다.Tip 2: AssociationAssociation: 관계, 알고 있을 필요가 있는 것Aggregation: 논리적으로 소유Composition: lifetime이 종속적Tip 3: RelationshipsA → B : B가 변경되면 A가 영향을 받을 수 있음을 나타냄Tip 4: Adding Operations생성자 & 소멸자: 일반적으로 추가하지 않음Getter & setter: 추가하지 않을 수도 있음Inherit operations: base class에는 추가를 하고, derived class에는 추가하지 않는다Implementation of abstract operation: abstract operation을 구현한 클래스에 추가한다.Interaction DiagramInteraction Diagram객체들 간의 수행되는 절차를 나타내는 다이어그램Sequence diagram: message의 시간 순서를 강조Communication diagram: 객체들 사이의 구조적 관계를 강조Timing diagram:Sequence DiagramObjectMessage: 객체들 간의 통신, self callObject LifelineFocus of control:Return:Creation:Deletion:Interaction frames:alt (alternative): if-else, switchloop: for, whileopt (option): ifref (reference): 다른 interaction을 참조할 경우662