이야기박스

네트워크) 기말 시험공부 - 주관식 본문

Computer & Data/Network

네트워크) 기말 시험공부 - 주관식

박스님 2017. 6. 18. 15:03
반응형

 TCP와 UDP의 차이

1. TCP는 연결형 프로토콜 / UDP는 비연결형 프로토콜

: UDP는 연결 설정을 하지 않으므로 connect() 함수를 사용하지 않는다.
( 사용할 수는 있지만, 함수를 호출하더라도 특별한 패킷 교환이 일어나지 않는다. )

2. TCP - 신뢰성 있는 데이터 전송 ; 데이터 재전송 / UDP - 신뢰성 없는 데이터 전송 ; 재전송 하지 않는다

: 프로토콜 수준에서 신뢰성 있는 데이터 전송을 보장하지 않음. 필요하다면 응용 프로그램 수준에서 신뢰성 있는 데이터 전송 기능을 구현해야 한다.

3. TCP - 일대일 통신(unicast) / UDP - 일대일 통신(unicast), 일대다 통신(broadcast, multicast)

: 간단한 소켓 함수 호출 절차만 따르면 다자 간 통신 구현이 간편

4. TCP - 데이터 경계 구분 안함(바이트 스트림) / UDP - 데이터 경계 구분 (데이터그램)

: TCP와 달리 응용 프로그램이 데이터 경계 구분을 위한 작업을 별도로 할 필요가 없다




▣ Unicasting & Broadcassting & Multicasting
1. Unicasting ( one - to - one ) : 한 개체가 다른 한 개체에 데이터를 보내는 모델 
    - IPv4 / IPv6 가능

2. Broadcasting ( one - to - many ) : 한 개체가 특정 네트워크에 속한 모든 개체에 데이터를 보내는 모델
    - IPv4 만 가능

3. Multicasting ( one - to - many ) : 동일 그룹에 가입한 모든 개체 (서로다른 네트워크도 가능)에 데이터를 보내는 모델
    - IPv4 / IPv6 가능




▣ 멀티캐스팅 방식의 채팅 특징

- UDP 소켓에만 적용 가능

- 그룹 가입과 탈퇴가 자유롭고 그룹 구성원 모두가 평등

- 데이터를 받으려면 반드시 그룹에 가입

- 그룹에 가입하지 않는 호스트에서도 그룹에 데이터를 보낼 수 있음


1.  클라이언트 / 서버의 구분이 없는 이유

: 각각의 응용프로그램에서 데이터 전송 / 수신이 모두 가능해야 한다.

멀티매스팅은 서버에 의한 데이터 교환이 아닌, 그룹에 가입한 자들에게 데이터를 전송해주는 방식이므로, 
Sender와 Receiver 두개의 스레드를 구성 후, Receiver 측에서 그룹에 가입하고 데이터의 교환을 하면 된다.


2. 데이터 전송을 위하여 할 일

: 멀티캐스트의 TTL의 기본값은 1이기 때문에, 소켓 옵션을 이용하여 변경 후, 멀티캐스트 IP로 데이터를 전송한다.


3. 데이터 수신을 위하여 할 일

: 우선 SO_REUSEADDR 옵션을 이용하여 다수의 사용자가 바인드 할 수 있도록 설정한다.
이후 바인드를 한 후, 멀티캐스트 그룹에 가입한다. 옵션은 IP_ADD_MEMBERSHIP
데이터를 수신 후, 

통신이 종료되면 멀티캐스트 그룹을 탈퇴한다. 옵션은 IP_DROP_MEMBERSHIP





▣ SO_REUSEADDR

: 현재 사용중인 IP 주소와 포트 번호를 재사용할 수 있게 해준다. 즉 현재 사용중인 값으로 bind() 함수를 성공적으로 호출 할 수 있게 해준다.
TCP와 UDP에서 모두 사용가능하다.
어떤 호스트의 네트워크 응용 프로그램들에서 같은 포트번호를 사용할 경우 바인딩 오류가 생기는것을 막아줄 수 있다.



▣ Nagle 알고리즘
     : 작은 패킷이 불필요하게 많이 생성되는 일을 방지해 네트워크 트래픅을 감소시키는 알고리즘
==> TCP 전송 효율과 네트워크 활용도를 높임 ==> TCP에서는 기본으로 동작

- Nagle 알고리즘의 동작 방식

1) 보낼 데이터가 MSS로 정의된 크기만큼 쌓이면 상대편에 무조건 보낸다

2) ACK가 도착하면 MSS보다 작더라도 상대편에 보낸다.
==> "데이터가 충분히 크면 곧바로 보내고, 그렇지 않으면 데이터가 쌓일 때까지 대기한다. 단, 데이터가 충분히 쌓이지  않더라도 이전에 보낸 데이터를 상대편이 받았다면 다음 데이터를 보낸다."

- 장점 : 작은 패킷이 불필요하게 많이 생성되는 일을 방지해 네트워크 트래픽을 감소시킨다
- 단점 : 데이터가 충분히 쌓일 때까지 또는 ACK가 도달할 때까지 대기 --> 응답 시간이 길어진다



▣ TCP_NODELAY

: Nagle 알고리즘 작동을 중지하는 역할

==> Nagle 알고리즘의 장점을 포기하는 대신, 응용 프로그램의 반응 시간을 빠르게 한다



▣ GUI 소켓 응용프로그램의 구조와 동작원리
: 대화상자 프로시저와 소켓 코드를 별도의 스레드로 분리한다.
공유 데이터가 있을 경우에는 스레드 동기화 함수를 사용하여 보호해야 한다

< 대화상자 >
- 사용자가 편집 컨트롤에 글자를 입력 후 " 보내기 "
- 편집 컨트롤에 입력된 문자열을 응용 프로그램 버퍼에 저장

< 소켓 >
- 응용 프로그램 버퍼에 저장된 데이터를 에코 서버에 보냄
- 에코 서버가 보낸 데이터를 응용 프로그램 버퍼에 읽음
- 응용 프로그램 버퍼에 저장된 데이터를 편집 컨트롤에 출력

* 보내기 버튼 이후에는 동기화 기법과 보내기 버튼의 비활성화 --> 공유 데이터 관리 (응용 프로그램 버퍼)


▣ GUI 소켓 프로그래밍
- 클라이언트 코드를 별도의 스레드로 동작
- 대화상자 프로시저에서 읽기와 쓰기 이벤트를 이용하여, 공유데이터(응용 프로그램 버퍼)에 대한 동기화를 한다.
- 보내기 버튼의 핸들을 이용하여 이 버튼에 대한 접근을 관리한다.
- 클라이언트에서는 쓰기 이벤트의 완료 신호가 오면, 데이터를 전송.
- 데이터를 전송 후에 보내기 버튼을 활성화 한다. / 읽기 이벤트를 신호 상태로 만듬


▣ Select 모델
: 소켓 모드 (블로킹, 넌블로킹)에 관계없이 여러 소켓을 한 스레드로 처리할 수 있다.
- 셀렉트 모델 사용시 -> 소켓 함수 호출이 성공할 수 있는 시점을 미리 알 수 있다.
==>
블로킹 소켓 : 소켓 함수 호출 시 조건이 만족되지 않아 블로킹되는 상황을 막을 수 있다.
넌블로킹 소켓 : 소켓 함수 호출 시 조건이 만족되지 않아 나중에  다시 호출해야 하는 상황을 막을 수 있다.

* 셀렉트 함수 -> 타임아웃  
NULL : 하나라도 만족할때까지 기다림 -> 리턴 값 : 조건을 만족하는 소켓의 개수
{0, 0} : 소켓 셋 모두 검사 후 곧바로 리턴 -> 리턴 값 : 0 또는 조건을 만족하는 소켓의 개수
양수 : 타임아웃으로 지정한 시간이 지나거나, 하나라도 만족하면 리턴    -> 리턴 값 : 0 또는 조건을 만족하는 소켓의 개수 

- 소켓 셋 : 읽기 셋, 쓰기 셋, 예외 셋
- 입출력 절차
1) 소켓 셋을 비운다(초기화)
2) 소켓 셋에 소켓을 넣는다. 넣을 수 있는 최대 개수 FD_SETSIZE (64)
3) select() 함수 호출 --> 타임아웃이 NULL이면, 만족하는 소켓이 있을 때까지 리턴하지 않는다
4) select() 함수 리턴하면 소켓 셋에 남아있는 모든 소켓에 대해 적절한 소켓 함수를 호출하여 처리한다
5) 1~4) 반복

- 소켓 셋 매크로 함수
FD_ZERO(fd_set *set), FD_SET(SOCKET s, fd_set *set), FD_CLR(SOCKET s, fd_set *set), FD_ISSET(SOCKET s, fd_set *set)


▣ IOCP 모델
: 입출력 완료 포트라는 윈도우 운영체제가 제공하는 구조를 이해하고 활용
* 입출력 완료 포트(IOCP) : 비동기 입출력 결과와 이 결과를 처리할 스레드에 관한 정보를 담고 있는 구조

- 입출력 절차
1) CreateIoCompletionPort() -> 완료 포트 생성
2) CPU 개수에 비례하여 작업자 스레드를 생성한다
-> 모든 작업자 스레드 : GetQueuedCompletionStatus() 함수를 호출하여 대기 상태
3) 비동기 입출력을 지원하는 소켓을 생성
-> CreateIoCompletionPort()를 호출하여 소켓과 입출력 완료포트를 연결
4) 비동기 입출력 함수를 호출
5) 비동기 입출력 작업이 완료되면, 운영체제는 입출력 완료 포트에 결과를 저장, 대기 중인 스레드 하나를 깨운다.
    -> 대기 상태에서 깨어난 작업자 스레드는 비동기 입출력 결과를 처리한다.
6) 새로운 소켓을 생성하면 3)~5)단계, 그렇지 않다면 4)~5)단계를 반복


- CreateIoCompletionPort()

1) 입출력 완료 포트를 새로 생성

2) 소켓과 입출력 완료 포트를 연결

- GetQueuedCompletionStatus()

: 작업자 스레드는 입출력 완료 포트에 입출력 완료 패킷이 들어올 때까지 대기한다.



▣ 소켓 입출력 모델 비교

- 장점

1) Select : 이식성이 높다.

2) WSAAsyncSelect : GUI 응용 프로그램과 잘 결합할 수 있다.

3) WSAEventSelect : 비교적 뛰어난 성능 제공하면서 위도우를 필요로 하지 않는다.

4) Overlapped(1) , Overlapped(2) : 비동기 입출력을 통해 뛰어난 성능을 제공

5) Completion Port : 비동기 입출력과 완료포트를 통해 가장 뛰어난 성능 제공


- 단점

1) Select : 여섯 가지 모델 중 가장 낮은 성능, 소켓의 개수 64개로 제한

2) WSAAsyncSelect : 단일 윈도우 프로시저에서 윈도우 메시지와 소켓 메시지를 처리 -> 성능 저하

3) WSAEventSelect : 소켓 개수 64개 제한

4) Overlapped(1) : 소켓의 개수 64개 제한

5) Overlapped(2) : 모든 비동기 소켓 함수에 대해 완료 루틴을 사용할 수 잇는 것은 아니다.

6) Completion Port : 코딩이 복잡하다.


- 이상적인 소켓 입출력 모델

1) 소켓 함수 호출 시 블로킹을 최소화한다

--> 6가지 모델 모두 만족

2) 스레드 개수를 일정 수준으로 유지한다.

--> WSAAsyncSelect, Overlapped(2), Completion Port 모델만 만족, 나머지는 추가 스레드 생성해야 함

3) CPU 명령 수행과 입출력 작업을 병행

--> 비동기 입출력 방식 -> Overlapped(1), Overlapped(2), Completion Port

4) 유저 모드와 커널 모드 전환 횟수를 최소화

--> 비동기 입출력 방식 -> Overlapped(1), Overlapped(2), Completion Port




▣ Ping 프로그램 작성 원리

- ICMP 헤더를 직접 수정해야 하므로 Raw 소켓 사용

- ICMP 메시지 중 에코 요청과 에코 응답 두개를 사용해 구현한다.

- SO_SNDTIMEO, SO_RCVTIMEO 설정을 한다. 리시브 타이머는 무한 블로킹을 방지 할 수 있다

- 포트번호가 없기 때문에 IP 주소만으로 sendto() 에 사용할 소켓 구조체 초기화

- 에코 요청 ICMP 메시지를 초기화 한다. (id -> PID, seq-> 0부터 1씩 증가, 체크섬 -> 맨 마지막)

- 에코 요청 ICMP 메시지 전송 (sendto)

- ICMP 메시지 수신 (recvfrom) - 에코 응답이 아닐 가능성도 있다

- 받은 메시지 분석해 결과 출력



▣ Traceroute 프로그램 작성 원리

; 방법 : IP 헤더의 TTL 필드를 활용해 구현한다.

==> 변경 방법 

1) IP_HDRINCL
2) IP_TTL 소켓 옵션


- Raw 소켓 생성

- SO_SNDTIMEO, SO_RCVTIMEO 설정

- IP 주소를 이용 sendto() 에 사용할 소켓 구조체 초기화

- IP_TTL 소켓 옵션을 이용 TTL 값을 설정 ( TTL 값 증가시키면서 )

- ICMP 메시지 초기화

- 에코 요청 ICMP 메시지 전송 ( sendto )

- ICMP 메시지 받는다. ( recvfrom )

- 받은 ICMP 분석하여 출력, 에코 응답을 받으면 루프를 빠져나감



반응형