1. 소켓(Socket)의 정의
소켓(Socket)이란 컴퓨터 네트워크/내부 프로세스 끼리의 통신(UDS를 통해 내부 통신이 가능하다)에서 데이터를 송수신되는 데이터들의 엔드포인트를 말한다. 이 엔드포인트는 IP주소와 Port주소의 조합으로 이루어져있다.
컴퓨터의 프로그램은 이러한 소켓을 생성하고, 생성된 소켓을 통해 데이터를 교환하게 된다.
조금 더 쉽게 설명하기 위해 컴퓨터 네트워크를 전화통화에 비유해보자. 통화를 하기위해선 전화가 가능한 전화기나 휴대폰이 필요하다. 소켓은 이러한 전화기/휴대폰과 비슷하며, 고유한 IP주소는 전화번호와 비슷한 개념이다.
[출처]
https://docs.oracle.com/javase/tutorial/networking/sockets/definition.html
https://ko.wikipedia.org/wiki/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC_%EC%86%8C%EC%BC%93
2. 소켓의 생성과 프로토콜
Windows에서는 아래의 소켓구조체를 정의하여 소켓을 생성할 수 있다.
SOCKET WSAAPI socket(
int af,
int type,
int protocol
);
소켓을 구성하기 위한 인자는 다음과 같다.
- 1번째 인자: 소켓이 사용할 주소 체계를 지정한다. 아래의 표는 대표적인 것을 추렸다.
주소체계 이름 |
설명 |
PF_INET / AF_INET |
IPv4 인터넷 주소체계 |
PF_INET6 / AF_INET6 |
IPv6 인터넷 주소체계 |
PF_UNIX /AF_UNIX |
UNIX 방식의 주소체계 |
Winsock라이브러리를 살펴보면 그 이외의 주소체계를 찾아볼 수 있다. 여기서 주의할 점은 OS 버전에 따라 지원받지 못하는 주소 체계가 존재할 수 있고, 주소 체계에 따라 socket의 type(2번째 인자값)이 제한되는 경우도 존재한다.
※ PF방식과 AF방식은 무슨 차이일까?
PF는 Protocol Family의 약자이고, AF는 Address Family의 약자이다. 이렇게 주소 체계와 프로토콜 체계를 따로 지정한 것은, 하나의 주소 체계가 다른 프로토콜 체계를 지원할 것을 기대하고 주소 체계와 프로토콜 체계를 나누었다. 하지만 그 의도대로의 일은 일어나지 않았고 둘의 기능은 구분이 없어졌다.
[출처] https://beej.us/guide/bgnet/html/#system-calls-or-bust
Beej's Guide to Network Programming
beej.us
What is the difference between AF_INET and PF_INET in socket programming?
What is the difference between AF_INET and PF_INET in socket programming? I'm confused between using AF_INET and PF_INET in socket() and bind(). Also, how to give ip-address in sin_addr field?
stackoverflow.com
- 2번째 인자: 소켓에서 전송되는 데이터의 타입을 정의한다. 여기에서 1번째 인자로 지정한 주소체계에 따라, 지원되지 않는 타입도 존재할 수 있다.
소켓의 타입 종류는 아래와 같다.
소켓 타입 이름 |
설명 |
SOCK_STREAM |
- TCP방식의 전송을 하는 소켓을 만든다. |
SOCK_DGRAM |
- UDP방식의 전송을 하는 소켓을 만든다 |
SOCK_RAW |
- 전송 프로토콜(TCP나 UDP)을 지정하지 않은 소켓 |
- Windows Sockets 1.1버전에서는 SOCK_STREAM과 SOCK_DGRAM만 지원하였지만 WindowsSockets 2버전부터는 보다 더 다양한 SOCK_SEQPACKET / SOCK_RDM등 보다 더 다양한 데이터 전송방식을 지원해준다.
- SOCK_STREAM과 SOCK_DGRAM이 대중적으로 많이 쓰인다.
[출처] https://www.quora.com/Whats-the-difference-between-SOCK_RAW-and-SOCK_STREAM
- 3번째 인자: 소켓의 프로토콜을 지정한다.
여기에서 앞서 지정한 주소체계(1번째 인자)와 데이터 전송방식(2번째 인자)에 따라 설정할 수 있는 프로토콜이 제약된다. 예를들어 2번째 인자에서 SOCK_DGRAM을 지정한 상태에서, 3번째 인자에 TCP 프로토콜을 채택하는 IPPROTO_TCP를 지정할 수 없다.
아래는 지정할 수 있는 프로토콜의 종류이다.
프로토콜 이름 |
설명 |
IPPROTO_TCP |
TCP프로토콜을 사용한다. |
IPPROTO_UDP |
UDP프로토콜을 사용한다. |
IPPROTO_ICMP |
ICMP프로토콜을 사용한다. |
IPPROTO_IGMP |
IGMP프로토콜을 사용한다. |
여기서 전송계층에 속하는 통신 규약인 TCP와 UDP는 깊게 파보면 전송되는 데이터 세그먼트 구조나, TCP UDP의 헤더정보의 차이점,
TCP가 신뢰성있는 전송을 위해 지원하는것 등 많은 부분이 있지만 분량이 많아 이후 다루어볼 생각이다.
TCP와 UDP의 간략한 차이점은 위에 SOCK_STREAM타입의 소켓과 SOCK_DGRAM타입의 소켓에 대해 기술한 차이점과 동일하다.
한편 ICMP와 IGMP는 네트워크 계층에 속한다(전송계층보다 하위이다).
ICMP는 통신을 원하는 원격 컴퓨터가 정상적으로 연결되지 않을때, 에러상황을 보고해주는 기능을 가지고 있다. 그래서 다른 IP와 통신이 가능한지와 응답을 측정하는 Ping명령어에 사용된다.
IGMP은 멀티캐스팅(한 출발지에서 하나의 그룹으로의 통신을 지원하는 전송 유형)을 지원하는 프로토콜이다. IP-TV와 같이 한정된 대역폭에서 효율을 위해 사용된다.
우선 이 글을 통해 소켓을 만드는 방법과, 소켓이 사용할 주소체계와 프로토콜에 대해 알아보았다.
이렇게 만든 소켓은 이후 bind-accept-listen과 같은 작업들이 필요하며, 이를 통해 서로 다른 두 컴퓨터끼리도 통신이 가능하게 된다.
'Windows Socket' 카테고리의 다른 글
다중 접속 서버 모델 (0) | 2021.11.16 |
---|---|
Windows TCP서버 소켓 통신 - echoServer 구현하기 (0) | 2021.04.13 |
Windows TCP서버 소켓 통신 - send(), recv() 함수를 사용해 통신하기 (0) | 2021.04.11 |
Windows TCP서버 소켓 통신 - 클라이언트 소켓 (0) | 2021.04.05 |
Windows TCP서버 소켓 통신 시작하기 (0) | 2020.08.09 |