컴퓨터끼리 데이터를 주고받기 위한 규약
socket() 함수의 첫 번째 인자 위치에는 '프로토콜 체계'의 종류가 들어간다. 프로토콜 체계의 종류는 아래와 같다.
- PF_INET / IPv4 인터넷 프로토콜 체계
- PF_INET6 / IPv6 인터넷 프로토콜 체계
- PF_LOCAL / 로컬 통신을 위한 UNIX 프로토콜 체계
- PF_PACKET / 저수준 소켓을 위한 프로토콜 체계
- PF_IPX / IPX 노벨 프로토콜 체계
이중 가장 널리 사용되는 것은 PF_INET(IPv4) 체계이다.
- 독립된 전송 라인을 사용하기에 데이터 무결성이 보장된다.
- 먼저 보낸 데이터가 먼저 도착한다.
- 전송되는 데이터 간 경계가 없다.
- 1대1 연결만 가능하다.
전송되는 데이터 간 경계가 없다는 말은 3번의 write 호출로 100Byte의 데이터를 보내고 1번의 read 호출로 100Byte를 읽든지, 1번의 write 호출로 200Byte의 데이터를 보내고 30번의 read 호출로 200Byte를 읽든지 문제가 없다는 의미이다.
각 소켓은 내부에 버퍼를 가지고 있는데, 데이터가 수신되면 이 버퍼에 일단 저장이 된다. 그리고 '일단 저장'된 데이터를 read 함수를 통해 읽어들이는 방식으로 프로그램이 돌아가기 때문에 가능한 것이다.
- 빠른 전송만이 우선시된다.
- 데이터의 순서는 무시된다.
- 데이터 손실의 우려가 있다.
- 전송되는 데이터에 경계가 있다.
- 한 번에 전송할 수 있는 데이터 크기에 제한이 있다.
전송되는 데이터 간 경계가 있다는 말은 3번에 걸쳐서 전송된 데이터는 3번에 걸쳐 받아야 한다는 뜻이다.
세부적인 프로토콜의 종류를 넣어줘야 한다. 예를 들어, socket() 함수의 두 번째 인자로 SOCK_STREAM을 넘겨줬다면 연결지향형 소켓 중 한 종류를, SOCK_DGRAM을 넘겨줬다면 비 연결지향형 소켓 중 한 종류를 택해 그에 해당하는 상수를 넣어주면 된다.
연결지향형 소켓 중 가장 일반적인 선택은 TCP(IPPROTO_TCP),
비 연결지향형 소켓 중 가장 일반적인 선택은 TCP(IPPROTO_UDP)이다.
int tcp_sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
int udp_sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);