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

https://stackoverflow.com/questions/6729366/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?

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방식의 전송을 하는 소켓을 만든다.
- 전송되는 데이터의 경계가 없다
- 양방향으로 연결된 상태에서 데이터를 전송한다.
- 전송의 신뢰성을 보장한다(전송되는 데이터가 변조되거나 유실되지 않는다)
- 속도가 UDP방식보다는 느리다

SOCK_DGRAM

- UDP방식의 전송을 하는 소켓을 만든다
- 전송되는 데이터에 경계가 존재한다.
- 연결을 따로 성립하지 않고 출발지와 목적지 정보를 가지고 데이터를 전송한다.
- 전송의 신뢰성이 보장되지 않는다(전송되는 데이터의 변조 및 유실 가능성이 있다)
- 속도가 TCP보다 빠르다

SOCK_RAW

- 전송 프로토콜(TCP나 UDP)을 지정하지 않은 소켓
- 전송계층의 하위인 IP계층까지 접근이 가능하다
- 전송 프로토콜이 지정되지 않았기에, 헤더 정보를 사용자가 자유롭게 지정할 수 있다.

- 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프로토콜을 사용한다.
주소체계가 AF_INET나 AF_INET6이며,
소켓타입이 SOCK_STREAM이여야 가능하다.

IPPROTO_UDP

UDP프로토콜을 사용한다.
주소체계가 AF_INET나 AF_INET6이며,
소켓타입이 SOCK_DGRAM이여야 가능하다.

IPPROTO_ICMP

ICMP프로토콜을 사용한다.
주소체계가 AF_UNSPEC/ AF_INET /AF_INET6 중 하나이며, 소켓타입이 SOCK_RAW나 정의되어있지 않아야 가능하다.

IPPROTO_IGMP

IGMP프로토콜을 사용한다.
주소체계가 AF_UNSPEC/ AF_INET /AF_INET6 중 하나이며, 소켓타입이 SOCK_RAW나 정의되어있지 않아야 가능하다.

여기서 전송계층에 속하는 통신 규약인 TCP와 UDP는 깊게 파보면 전송되는 데이터 세그먼트 구조나, TCP UDP의 헤더정보의 차이점,
TCP가 신뢰성있는 전송을 위해 지원하는것 등 많은 부분이 있지만 분량이 많아 이후 다루어볼 생각이다.

TCP와 UDP의 간략한 차이점은 위에 SOCK_STREAM타입의 소켓과 SOCK_DGRAM타입의 소켓에 대해 기술한 차이점과 동일하다.  

한편 ICMP와 IGMP는 네트워크 계층에 속한다(전송계층보다 하위이다).
ICMP는 통신을 원하는 원격 컴퓨터가 정상적으로 연결되지 않을때,  에러상황을 보고해주는 기능을 가지고 있다. 그래서 다른 IP와 통신이 가능한지와 응답을 측정하는 Ping명령어에 사용된다.

IGMP은 멀티캐스팅(한 출발지에서 하나의 그룹으로의 통신을 지원하는 전송 유형)을 지원하는 프로토콜이다. IP-TV와 같이 한정된 대역폭에서 효율을 위해 사용된다.

 


우선 이 글을 통해 소켓을 만드는 방법과, 소켓이 사용할 주소체계와 프로토콜에 대해 알아보았다.
이렇게 만든 소켓은 이후 bind-accept-listen과 같은 작업들이 필요하며, 이를 통해 서로 다른 두 컴퓨터끼리도 통신이 가능하게 된다.

+ Recent posts