I : 네트워크 소켓 프로그래밍
TCP/IP 윈도우 소켓 프로그래밍 을 읽고 정리한 문서입니다 ;)
TCP/IP 프로토콜 개요
호스트는 최종 사용자 응용 프로그램을 수행하는 주체가 되며, 이는 인터넷에 연결된 PC, 노트북, 휴대전화 등이 해당된다.
라우터는 서로 다른 네트워크에 속한 호스트 간에 데이터를 교환할 수 있게 하는 장비다. 이처럼 데이터를 목적지까지 전달하는 일련의 작업을 라우팅이라고 한다.
호스트와 호스트가 통신하려면 정해진 절차와 방법을 따라야 하는데, 이를 통신 프로토콜이라 한다.
인터넷에서 사용하는 핵심 프로토콜은 TCP와 IP로, 이를 TCP/IP 프로토콜이라 한다.
네트워크 접근 계층은 물리적 네트워크를 통한 실제 데이터 송수신을 담당한다. 이는 물리적인 신호를 처리하는 네트워크 하드웨어와 운영체제가 제공하는 장치 드라이버로 구성된다.
이 계층에서는 하드웨어적으로 정의된 물리 주소를 사용해 통신하는데, 이더넷인 경우 48비트의 맥 주소를 사용한다.
인터넷 계층은 데이터를 목적지 호스트까지 전달하는 역할을 한다. 이 계층에서는 논리 주소인 IP주소를 사용한다.
전송 계층은 최종 통신 목적지를 지정하고 오류 없이 데이터를 전송하는 역할을 한다. 이 때 최종 목적지는 호스트가 아닌 호스트의 프로세스이기 때문에, 프로세스를 지정하는 주소를 사용하는데, 이것이 포트이다. 이 계층에는 TCP와 UDP가 존재한다.
응용 계층은 전송 계층을 기반으로 한 HTTP, SMTP 등의 다수의 프로토콜이 존재하며, 이 프로토콜을 사용하는 응용 프로그램을 포함한다.
보내지는 데이터는 다양한 헤더와 트레일러가 붙은 패킷 형태로 송수신되고, 응용 계층에는 이 패킷에서 헤더와 트레일러가 다시 다 떨어진, 본래의 데이터가 전달되므로 응용프로그래머는 주고받을 데이터에만 집중하여 구현하면 된다.
TCP/IP 프로토콜을 사용해 통신할 때는 IP주소와 포트 번호를 사용한다. IP주소는 IPv4와 IPv6 두 종류가 있으며, 각각 32비트와 128비트를 사용한다. TCP와 UDP에서는 포트 번호로 부호 없는 16비트 정수를 사용하므로 065535 범위가 가능하지만, 일반적으로 102449151 범위에서 선택한다.
네트워크 프로그램은 일반적으로 클라이언트-서버 모델로 작성한다. 한 컴퓨터에서 실행되는 두 프로그램에 이를 적용할 경우에는 다양한 프로세스간 통신 (IPC) 기법을 사용해 데이터를 주고받을 수 있다.
소켓의 개념
소켓은 파일 디스크립터 혹은 핸들과 유사한 데이터 타입으로 볼 수 있다. 응용 프로그램이 통신하려면 사용할 프로토콜, 송신측 IP와 포트, 수신측 IP와 포트가 정해져야 한다.
소켓은 응용 프로그램 관점에서 통신의 출발점과 도착점인 통신 종단점이라고 볼 수 있다. 클라이언트에서는 자신의 소켓에 send()
를 호출해 데이터를 보내고, 서버는 자신의 소켓에 recv()
함수를 호출해 데이터를 받을 수 있다.
소켓은 TCP/IP 프로토콜의 관점에서 네트워크 프로그래밍 인터페이스이다. 소켓을 사용하면 전송 계층을 건너뛰고 곧바로 인터넷 계층을 사용할 수도 있다.
윈도우 소켓
소켓은 원래 버클리 유닉스에서 개발한 네트워크 프로그래밍 인터페이스로서, 이를 윈도우 환경에서 사용할 수 있도록 한 것을 윈도우 소켓, 윈속이라고 한다.
따라서 유닉스 소켓에 기반을 두었기에 소스 코드 수준에서 호환성이 높지만, 다른 점 또한 존재한다.
- 윈도우 소켓은 DLL을 통해 대부분의 기능이 제공되므로 DLL 초기화와 종료를 위한 작업이 필요하다.
- 윈도우 프로그램은 대개 GUI를 갖추고 메시지 구동 방식으로 동작하므로 이를 위한 확장 함수 또한 존재한다.
- 윈도우는 운영체제 차원에서 멀티스레드를 지원하므로, 멀티스레드 환경에서 안정적으로 동작하는 구조와 이를 위한 함수가 필요하다.
윈속을 사용함으로서 얻는 다양한 장점 또한 존재한다.
- 유닉스 소켓과 호환성이 높으므로 기존 코드를 이식하여 활용하기 쉽다.
- 가장 널리 사용되는 네트워크 인터페이스이기에 여러 운영체제에서도 지원된다.
- TCP/IP 외의 프로토콜 또한 지원한다.
- 비교적 저수준 프로그래밍 인터페이스이기에 세부 제어가 가능하여 고성능 네트워킹이 가능하다.
단, 응용 프로그램 수준의 프로토콜을 프로그래머가 직접 설계해야 하고, 서로 다른 바이트 정렬 방식을 사용하거나 데이터 처리 단위가 서로 다른 호스트끼리 통신할 경우, 응용 프로그램 수준에서 데이터 변환을 처리해야 한다.
요약
- 인터넷 통신 개체
- 호스트와 라우터 두 종류가 있다
- TCP/IP 프로토콜 구조
- 네트워크 접근 계층 : 물리적 네트워크를 통한 실제 데이터 송수신 담당, 물리 주소 사용
- 인터넷 계층 : 데이터를 목적지 호스트까지 전달, IP주소 사용
- 전송 계층 : 최종 통신 목적지를 지정하고 신뢰도 및 오류 제어, 포트 번호 사용
- 응용 계층 : 이 계층들을 기반으로 한 다수의 프로토콜과 프로그램을 포괄
- TCP와 UDP
- TCP는 연결형, UDP는 비연결형 프로토콜이다.
- TCP는 신뢰성 있는 데이터를 전송하고, UDP는 신뢰성이 없지만 속도가 빠르다.
- TCP는 연결 기반이기에 일대일 통신이고, UDP는 일대일, 브로드캐스트, 멀티캐스트가 가능하다.
- TCP는 데이터의 경계를 구분하지 않지만, UDP는 데이터의 경계를 구분한다.
- 루프백 주소
- 시스템 자신을 나타내는 의미로서 내부적으로만 사용된다.
- IPv4에서는
127.0.0.1
, IPv6에서는0:0:0:0:0:0:0:1
로 정의되었다.
- 소켓의 개념
- 데이터 타입이자 통신의 종단점인, 네트워크 프로그래밍 인터페이스이다.
- 윈속 응용 프로그램
- 대부분의 기능은
WS2_32.DLL
로 제공되며, 응용프로그램 링크 시WS2_32.LIB
이 필요하다.
- 대부분의 기능은
'공부한 이야기 > 윈도우 소켓 프로그래밍' 카테고리의 다른 글
VI : 멀티스레드 (0) | 2023.04.29 |
---|---|
V : 데이터 전송하기 (0) | 2023.04.29 |
IV : TCP 서버-클라이언트 (0) | 2023.04.29 |
III : 소켓 주소 구조체 다루기 (0) | 2023.04.29 |
II : 윈도우 소켓 시작하기 (0) | 2023.04.29 |