수업/Network Programming 13

[Network Programming] MultiTherad 기반 서버

Thread(쓰레드) (예전에 시프 공부할 때도 정리 잘 해뒀으니 이 글초반에 쓰레드 설명하는 부분이랑 같이 보면 좋음.) 쓰레드의 등장 배경 1. 프로세스의 생성은 많은 리소스가 소모된다. 2. process간 context-switching은 오버헤드가 크다.(쓰레드에 비해...) 3. 프로세스들은 메모리 공간이 독립적이라 특별한 경로가 아니면 데이터 공유가 안된다. Thread(쓰레드)는 한 Process내의 또 다른 실행 흐름이다. 구체적으로 말하자면, 쓰레드들은 Stack을 제외한 공간을 공유한다.(+ 다른 실행 흐름이니까 당연히 PC값도 다르겠지..) 한 process 내에 존재하므로 프로세스처럼 아예 다른 메모리 공간을 할당받을 필요도 없고, context-switching이 일어나도 오버헤..

[Network Programming] 소켓과 표준 입출력(standard I/O)

C standard에 정의된 I/O 함수를 사용하면 다음과 같은 장점이 있다. (ex. fprintf) 1. Portability에 좋다. 2. 버퍼링을 통한 성능 향상에 도움이 된다. 소켓을 만들면 기본적으로 kernel에서 버퍼를 만든다. 그게 위 그림의 우측에 보이는 소켓 버퍼이다. TCP 소켓은 오류가 발생하면 데이터 재전송도 해야 되고 하니 이런 버퍼가 꼭 필요하다. 그렇다고 UDP 소켓엔 버퍼가 없는건 아니다. 데이터를 보낼 때도 잠시 담아둬야 할 수도 있고, 받을 때도 application에서 읽기 전까지 잠시 담아둬야 할 수도 있으니 UDP 소켓에서도 버퍼는 필요하다. 그런데 standard I/O 함수는 내부적으로 응용 계층에서 버퍼를 또 사용한다. 즉, 표준 입출력 함수를 사용하면 위 ..

[Network Programming] Multicast & Broadcast

> Multicast Multicast 데이터 전송 방식 - 특정 Multicast 그룹을 대상으로 데이터를 딱 한번 전송 - 그럼 해당 그룹에 속하는 client는 모두 데이터를 수신한다. - Multicast 그룹 수는 IP 주소 범위 내에서 얼마든 추가 가능 - 특정 Multicast 그룹으로 전송되는 데이터를 수신하려면 거기에 가입하면 된다. - Multicast에선 연결의 개념이 없으므로 UDP socket을 기반으로 전송 - 모든 host에 데이터를 전송해야할때 그냥 TCP나 UDP를 쓰는 것보다 트래픽 양 ↓ 앞서 IPv4 주소를 설명할 때, Class D(224.0.0.0~239.255.255.255)의 주소들이 Multicast를 위한 주소라고 했다. 여기서 각 IP 주소가 각 Multi..

[Network Programming] 다양한 IO Functions

send & recv #include ssize_t send(int sockfd, const viod * buf, size_t nbytes, int flags); ssize_t recv(int sockfd, viod * buf, size_t nbytes, int flags); read/write와 달리 send와 recv는 소켓 전용 입출력 함수이다.(TCP 전용! UDP에서 쓰려면 주소 정보관련 인자도 있어야 함, recvfrom()/sendto() 처럼...) read/write랑 마지막 인자로 int flags가 추가된 것 말곤 다를게 없다. 따라서 flags 인자에 사용할 수 있는 옵션과 그 의미에 대해 알아보자. bitwise-or(|) 연산자로 여러 옵션을 선택할 수도 있다. OS에 따라 옵션..

[Network Programming] IO Multiplexing 기반 서버

MultiProcess 서버는 아래와 같은 단점을 가진다. 1. process의 빈번한 생성은 성능 저하로 이어진다. 2. MultiProcess의 흐름을 고려해야하므로 구현이 쉽지 않다. 3. 만약 process간 통신까지 해야한다면 구현이 더 복잡해진다. 따라서 하나의 process가 다수의 client에게 서비스를 제공할 수 있는, 하나의 process가 여러 개의 소켓을 핸들링 할 수 있는 IO MultiPlexing이 그 대안이다. (물론 무거운 작업이면 process 하나가 따로 해주는게 맞다고 교수님께서 말씀하심) 데이터 송수신이 무조건 실시간으로 0의 지연시간을 가져아하는 것은 아니므로 멀티플렉싱이 가능하다. 이를 위한 기능을 하나씩 배워보자. select() 함수를 사용하면 멀티플렉싱 서..

[Network Programming] MultiProcess 기반 서버

앞서 배운 iterative server는 동시 접속을 처리하지 못한다. 동시 접속을 처리하기 위해선 아래 기법들을 사용할 수 있다. 1. MultiProcess 기반 서버 2. MultiPlexing 기반 서버 3. MultiThreading 기반 서버 우린 우선 멀티 프로세스 기반 서버에 대해 배운다. 프로세스란 실행중인 프로그램으로, 그것과 관련된 메모리, 리소스 등을 총칭하는 의미이다. 각 프로세스는 고유의 ID를 가지고 있다. (process id == pid) fork #include pid_t fork(void); fork() 함수를 호출하면 fork 함수의 "return값을 제외한" 해당 프로세스의 모~든 것이 복제되어 새로운 프로세스가 만들어진다. 즉, 변수의 값은 물론이고 source ..

[Network Programming] Socket의 옵션들

이렇게 다양한 option들이 존재하고 이걸 이용해 소켓의 정보를 get 하거나 set 할 수 있다. 표에서 볼 수 있듯이 소켓의 옵션들은 계층별로 분류된다. SOL_SOCKET 레벨의 옵션들은 소켓에 대한 가장 일반적인 옵션들이고, IPPROTO_IP 레벨의 옵션들은 IP protocol에 관련된 사항들이며, IPPROTO_TCP 레벨의 옵션들은 TCP protoocl에 관련된 사항들이다. 우측은 get만 할 수 있는 정보인지 set만 할 수 있는 정보인지 둘 다 할 수 있는지를 보여준다. 예를들어 소켓의 타입을 알 수 있는 SO_TYPE 옵션으로는 Set은 할 수 없고 Get만 할 수 있다. 즉, SO_TYPE은 확인만 가능하고 변경이 불가능한 옵션이다. getsockopt #include int g..

[Network Programming] Domain Name System(DNS)

Domain Name이란? IP 주소를 대신해 사용할 수 있는 주소이다. IP 주소를 사용해 서버에 접속하는 것은 번거롭다. 매번 IP 주소 12자리 숫자를 외울 수도 없고, IP는 꽤 변동이 심하기 때문에 서버의 IP가 변경될 때마다 컴파일을 다시해야할 수도 있다. 따라서 간단하게 www.naver.com 처럼 Domain name을 IP 주소 대신 사용할 수 있게하는 것이다. 물론 이 Domain name이 실제 접속에 사용되는 주소는 아니고, Domain name을 IP로 변환해서 접속한다. DNS Server란? 위에서 말했듯 Domain name을 IP로 변환하는 과정이 있어야하는데, DNS 서버가 바로 Domain Name을 IP로 변환해주는 서버이다. DNS는 일종의 분산 데이터베이스 시스템..

[Network Programming] TCP 기반 Half-close

close() 와 closesocket() 함수의 기능 - socket의 완전 소멸을 의미 - socket이 소멸되므로 더 이상 입출력이 안됨 - 더 이상 입력이 안되므로 상대방 상태에 상관없는 일방적 종료의 형태 - 일방적 종료를 할 경우 상대 host에 송수신이 완료되지 않은 데이터가 있을 때 문제 - 따라서 Half-close 기법을 사용해야 한다. Half-close close()나 closesocket()으로 입출력 스트림을 모두 닫는 것이 아니라, 출력 스트림만 닫는 것이다. 상대방도 보낼 데이터가 없어서 종료를 원하는지 모르기때문에 입력 스트림은 열어둔다. 이렇게 입력 스트림이나 출력 스트림 중 하나를 닫는 것을 Half-close라고 한다. shutdown #include int shutd..

[Network Programming] UDP socket 통신

> UDP 소켓의 특성 (TCP와 비교) - SEQ,ACK number 같은 것을 전달하지 않는다. (Flow Control 없음) - 연결 설정/해제 같은 과정이 없다. - 데이터 분실 및 손실의 위험이 있다. - 확인 과정이 없으므로 데이터 전송이 빠르다. 따라서 안전성보단 성능이 중요할 때 UDP를 사용한다. 예를들어 실시간 스트리밍 서비스... (교수님께선 실제로 해보면 TCP가 그렇게 느리지도 않다고 하심. 이론상 그렇단 것) TCP는 1:1로 연결되기 때문에, socket 하나가 상대방과 연결되면 그 socket은 그 연결된 상대하고만 데이터를 주고 받을 수 있었다.(read()/write()) 하지만 UDP는 연결이라는 개념이 존재하지 않으므로 서버 소켓, 클라이언트 소켓 구분이 없다. 위 ..