2015년 12월 1일 화요일

C 언어 - 네트워크 프로그래밍

네트워크 프로그래밍


네트워크 프로그래밍이란 다른 프로세스 간 통신하는 프로그램을 제작하는 일을 말한다.
자신의 컴퓨터 내 다른 프로세스 간 통신 부터 국가 간 통신도 가능하다는 점이 매력적이다.

소켓


네트워크 연결은 소켓 단위로 관리된다.

IP 주소


컴퓨터의 네트워크 카드에 할당된 임시 주소이다.

IPv4 와 IPv6


IPv4 는 32bits 주소 체계를 갖는다.
수많은 PC, 모바일 등의 IP 기기들이 생겨나면서 IPv4 주소는 이미 고갈되었다.
IPv6 는 128bits 주소 체계를 갖어 IPv4 보다 훨씬 많은 주소를 할당할 수 있다.
주소 체계 이외에도 많은 부분이 개선되어 IPv4 에서 IPv6 로의 이동은 이미 진행 중이고 곧 생활로 다가올 것이다.

Port 번호


컴퓨터 한대로도 여러 연결이 가능한 이유는 port 번호로 여러 연결이 관리되기 때문이다.
소켓 하나당 하나의 port 를 할당 받는다.

서버/클라이언트


서버는 클라이언트의 접속을 기다리고 클라이언트와 대화한다.
클라이언트는 대기하고 있는 서버에 연결하고 대화한다.

대화와 프로토콜


사람이 전화를 걸 때를 연상해 보면 된다.
전화 거는 사람은 우선 상대의 전화 번호를 알고 전화를 건다.
일반적으로 전화 받은 상대가 먼저 '여보세요' 라고 하면 전화 건 사람이 '저는 누구누구입니다' 로 대화를 시작한다.
'여보세요' 라고 물어보면 누군지 이야기하는 대화 형식은 일종의 약속이다.
프로토콜은 이러한 약속을 의미한다.
컴퓨터 간의 대화는 사람 간의 대화보다 융통성이 없기 때문에 대화가 고급화 될 수록 프로토콜이 방대해 지는 면이 있다.

HTTP 프로토콜


웹 서버/웹 브라우저 은 HTTP 프로토콜을 구현한 프로그램이다.
HTTP 프로토콜은 범용이기 때문에 상세한 프로토콜이 공개되어 있다.
이 외 범용 프로토콜은 모두 공개되어 있다.
웹 서버나 웹 브라우저를 만들고 싶다면 HTTP 프로토콜을 참고해서 구현하면 시중의 어떠한 웹 서버나 웹 브라우저와도 통신할 수 있다.

TCP 와 UDP 연결


TCP 는 지속적이고 패킷 유실이 보완된 연결에 적합한 연결이고 UDP 는 단발성 데이터 전송에 적합한 연결이다.
TCP 연결은 서버/클라이언트 간 서로 대화를 주고 받을 필요가 있을 때 주로 사용한다.
UDP 연결은 주로 한 쪽에서 다른 쪽으로 데이터를 전달하는데 집중할 때 주로 사용한다.
플랫폼 측면에서 UDP 를 지원하는 것이 TCP 를 지원하는 것보다 쉬운 면이 있기 때문에 최소한의 성능이 요구되는 시스템에서 유일하게 지원하는 경우도 있다.
UDP 를 이용하면서 TCP 에서 제공하는 보완 기능들을 소프트웨어로 구현하는 경우도 많다.

패킷


음성이나 미디어 데이터들은 실제로는 작은 단위로 나뉘어져 상대방에게 전달된다.
이 작은 단위를 패킷이라고 부른다.
패킷은 단순히 데이터만 담고 있지는 않고 상대방의 주소 및 전송 방식에 따른 부수 정보들이 헤더에 포함된다.

헤더 + 데이터

구조는 프로토콜마다 달라지지만 대부분 비슷하다.

버퍼


네트워크로 전송되는 데이터 량이 디스크가 쓰는 속도보다 빠르게 유입된다면 데이터는 유실 될까?
네트워크로 전송되는 데이터들은 우선 캐시라는 빠른 메모리 영역에 잠시 저장되었다가 소프트웨어에서 읽어 가면 캐시 영역을 비우는 식의 버퍼가 마련되어 있다.
버퍼의 크기는 운영체제에서 관리하는 영역이기 때문에 버퍼 크기를 관리하는 API 를 운영체제에서 지원해줘야 소프트웨어로 제어할 수 있다.
대부분의 운영체제는 지원한다.
버퍼에 대한 개념은 YouTube 동영상 버퍼링하는 모습을 보면서도 익히 친숙한 개념일 것이다.

예제 코드 (리눅스)


tcpserver.c



tcpclient.c



테스트 방법


$ ./tcpserver &
$ ./tcpclient

예제 코드는 9000 번 포트를 사용하려고 하기 때문에 이미 다른 프로세스에서 9000 번을 사용하고 있다면 위 예제 프로그램은 실패한다.


댓글 없음:

댓글 쓰기