지난 강의에서 소켓 생성과 관련된 함수들에 대해 공부했는데
이번 포스팅에서는 소켓 생성과 관련된 더 깊은 내용에 대해 적어보겠습니다.
소켓의 생성
지난 포스팅에서는 간단한 함수에 대한 역할에 대해서만 소개를 했는데 이번 포스팅 주제인 프로토콜에 대해 설명하기 위해서 socket 함수에 들어가는 인자에 대해 적어보겠습니다.
#include <wwinsock2.h>
int socket(int af, int type, int protocol);
- af (Address Family) : 주소 체계를 지정합니다. 주소 체계는 IP 주소의 형식을 결정하는데 일반적으로 사용되는 값은
AF_INET (IPv4) 또는 AF_INET6 (IPv6)입니다. AF_INET를 지정하면 IPv4 인터넷 주소를 사용하고, AF_INET6을 지정하면 IPv6 인터넷 주소를 사용합니다. - type (Type) : 소켓의 타입을 지정합니다. 이 값은 전송 방식을 결정하는데 일반적으로 사용되는 값은 SOCK_STREAM(연결 지향형 소켓) 또는 SOCK_DGRAM(비연결 소켓)입니다. SOCK_STREAM은 TCP와 같은 연결 지향형 프로토콜에 사용되며, 데이터를 스트림으로 전송합니다. 반면 SOCK_DGRAM은 UDP와 같은 비연결형 프로토콜에 사용되고 데이터를 개별 패킷으로 전송하는 특징이 있습니다.
- protocol (Protocol) : 특정 프로토콜을 지정합니다. 이 값을 af와 type 인자가 지정하는 기본 프로토콜을 덮어쓸때 사용되는데 일반적으로 0으로 설정되고 이 경우 af와 type 인자에 따라 시스템이 알맞은 프로토콜을 선택하게 됩니다.
프로토콜이란
프로토콜이란 원거리 통신장비 상호간의 대화에 필요한 통신 규약을 의미한다.
프로토콜의 기본 요소
- 구문(Syntax) : 데이터의 형식(Format), 부호화(Coding), 신호 레벨(Signal Level) 등을 규정
- 의미(Semantics) : 두 기기 간의 효율적이고 정확한 정보 전송되는 데이터가 어떤 의미를 갖고 있는지 규정
- 시간(Timing) : 데이터 전소으이 순서와 속도, 타이밍을 규정
프로토콜 체계
프로토콜 체계 | 정의 |
PF_INET | IPv4 인터넷 프로토콜 |
PF_INET6 | IPv6 인터넷 프로토콜 |
PF_LOCAL | Local 통신을 위한 UNIX 프로토콜 |
PF_PACKET | Low level socket을 위한 인터페이스 |
PF_IPX | IPX 노벨 프로토콜 |
자 이제 위에서 설명한 프로토콜이 어디에 사용되냐
이전 포스팅에보면 소켓을 생성할 때 socket() 함수를 사용하는데 이때 필요하게 됩니다.
소켓의 타입
소켓의 타입이란 네트워크 통신의 방식을 결정짓는 중요한 요소입니다
다음은 기본적인 두 가지 소켓 타입과, 각 타입의 특징입니다.
SOCK_STREAM
- 에러나 데이터의 손실 없이 무사히 전달된다
- 전송하는 순서대로 데이터가 전달된다
- 전송되는 데이터의 경계가 존재하지 않는다.
SOCK_DGRAM
- 전송되는 순서에 상관없이 가장 빠른 전송을 지향한다.
- 전송되는 데이터는 손실될 수 있고 에러가 발생할 수 있다.
- 전송되는 데이터의 경계가 존재한다.
- 한 번에 전송되는 데이터의 크기는 제한된다.
프로토콜의 선택
소켓 생성함수의 세 번째 인자에는 포스트가 사용할 프로토콜이 들어간다.
우선 소켓 생성함수에 들어가는 프로토콜 체계에 따라 3번 인자의 값이 바뀌게 되는데
대부분의 경우 PF_INET or PF_INET6을 사용하기 때문에 필자도 그에 관련된 내용을 다룰 것이다.
프로토콜 체계가 PF_INET와 PF_INET6가 들어간다면 세 번째 인자의 값으로 다음과 같은 값이 올 수 있다.
- IPPROTO_TCP : TCP를 기반으로 하는 소켓을 생성
- IPPROTO_UDP : UDP를 기반으로 하는 소켓을 생성
TCP란
서버와 클라이언트간에 데이터를 신뢰성 있게 전달하기 위한 연결 지향형 프로토콜이다.
TCP의 특징
- 신뢰성: TCP는 데이터의 정확성과 순서를 보장합니다. 데이터가 손실되거나 순서가 뒤바뀌면, TCP는 해당 데이터를 재전송하고 순서를 재배열합니다.
- 연결 지향적: TCP는 데이터를 전송하기 전에 소스와 목적지 사이에 연결을 설정합니다. 이 연결 설정 과정에서는 패킷의 전송을 위한 경로를 확립하고, 네트워크의 혼잡 상황을 확인하는 등의 작업이 이루어집니다.
- 흐름 제어 및 혼잡 제어: TCP는 송신측과 수신 측의 데이터 처리 속도 차이를 관리하고, 네트워크 혼잡 상태를 피하기 위한 메커니즘이 있습니다.
- 사용처: 웹 브라우징, 이메일 전송, 파일 전송 등 데이터의 신뢰성이 중요한 애플리케이션에서 주로 사용됩니다.
UDP란
반대로 서버와 클라이언트간에 신뢰성이 없는 비연결 지향형 프로토콜이다.
UDP의 특징
- 비신뢰성: UDP는 데이터의 도착 순서나 도착 여부를 보장하지 않습니다. 데이터가 손실되거나 순서가 뒤바뀌더라도 UDP는 재전송이나 재배열을 시도하지 않습니다.
- 비연결성: UDP는 데이터를 전송하기 전에 별도의 연결 설정 과정을 거치지 않습니다. 그래서 TCP에 비해 오버헤드가 적습니다.
- 흐름 제어 및 혼잡 제어 없음: UDP는 이러한 기능을 제공하지 않으므로, 애플리케이션에서 이러한 문제를 처리해야 합니다.
- 사용처: 스트리밍 비디오, 온라인 게임, VoIP(Voice over IP) 등 실시간성이 중요하고 일부 데이터의 손실이 허용되는 애플리케이션에서 주로 사용됩니다.
프로토콜 체계에 따른 인자 전달
Case | Domain | Type | Protocol |
1 | PF_INET | SOCK_STREAM | IPPROTO_TCP(0) |
2 | PF_INET | SOCK_DGRAM | IPPROTO_UDP(0) |
프로토콜 체계가 PF_INET이면 Type에 따라 프로토콜이 정해지게 된다.
이와 같은 특징때문에 기본적으로 3번 인자는 값을 넣지 않고 디폴트 인자값인 0을 사용한다.
해당 게시글은 서적을 통한 개인 공부 목적으로 작성된 글입니다.
출처 : TCP/IP 소켓 프로그래밍 서적
'TCP_IP 소켓 프로그래밍' 카테고리의 다른 글
UDP 기반 서버/클라이언트 (0) | 2023.06.16 |
---|---|
TCP 기반 서버 / 클라이언트에 대한 이해2 (에코 서버, TCP 내부 구조) (0) | 2023.06.14 |
TCP 기반 서버 / 클라이언트에 대한 이해1 (0) | 2023.06.13 |
IP 주소 체계와 데이터 정렬의 이해 (0) | 2023.06.12 |
윈도우즈 기반 소켓 프로그래밍 이해하기 (0) | 2023.06.08 |
댓글