소켓의 프로토콜 및 전송 특성?

heeseok·2024년 12월 7일

TCP/IP

목록 보기
3/4

프로토콜이란 대화에 필요한 통신규약을 의미한다.
"컴퓨터 상호간의 대화에 필요한 통신 규약"
즉, 서로 데이터를 주고 받기 위해서 정의해 놓은 약속이며 소켓을 생성할 때 기본적인 프로토콜을 지정해야 한다.

소켓의 생성

#include <sts/socket.h>

int socket(int domain, int type, int protocol);
-> 성공 시 파일 디스크립터, 실패 시 -1 반환
domain : 소켓이 사용할 프로토콜 체계 정보 전달(도구)
type : 소켓의 데이터 전송방식에 대한 정보 전달.
protocol : 두 컴퓨터간 통신에 사용되는 프로토콜 정보 전달.(세부 방법)

프로토콜의 체계(protocol family)
- PF_INET -> IPv4 인터넷 프로토콜 체계
- pF_INET6 -> IPv6 인터넷 프로토콜 체계

소켓의 타입(type)

  • 소켓의 타입이란 소켓의 데이터 전송방식을 의미하는데, 2가지가 있다 TCP, UDP

  • 연결지향형 소켓(SOCK_STREAM) = TCP 소켓 : 연결 보장O, 속도가 느림

  • 비 연결지향형 소켓(SOCK_DGRAM) = UDP 소켓 : 연결 보장X, 속도가 빠름

    	연결지향형 소켓(SOCK_STREAM)의 특징
    		- 중간에 데이터가 소멸되지 않고 목적지로 전송된다.
    		- 전송 순서대로 데이터가 수신된다.
    		- 전송되는 데이터의 경계가 존재하지 않는다. 
    			-> 데이터를 송수신하는 소켓은 내부적으로 바이트 배열(버퍼)을 지니고 있다. 
    			   그리고 소켓을 통해 전송되는 데이터는 이 배열에 저장되는데, 
    			   데이터가 수신되었다고 해서 바로 read함수를 호출하는 것이 아니고 배열의 용량을 초과하지 않는 한,
    			   데이터가 채워진 후 한번의 read 함수호출을 통해서 데이터를 전부 읽어 들일수도 있고, 반대로 한번의 write 함수호출로 전송된 데이터 전부를 여러 번의 read 함수 호출을 통해서 읽어 들일수도 있다.
    			   즉, red함수의 호출횟수와 write함수의 호출횟수는 연결지향형 소켓의 경우 큰 의미를 갖지 못하며, 
    			   때문에 연결지향형 소켓은 데이터의 경계가 존재하지 않는다고 말하는 것이다.
    		- 소켓 대 소켓의 연결은 1 : 1 구조이다.
    
    		즉, "신뢰성 있는 순차적인 바이트 기반의 연결지향 데이터 전송 방식의 소켓"
    
    	비 연결지향형 소켓(SOCK_DGRAM)의 특징
    		- 전송된 순서에 상관없이 가장 빠른 전송을 지향한다.
    		- 전송된 데이터는 손실의 우려가 있고, 파손의 우려가 있다.
    		- 전송되는 데이터의 경계가 존재한다.
    			-> 비 연결지향형 소켓은 연결지향형 소켓에 비해 데이터의 전송속도는 빠르나, 데이터의 손실 및 훼손이 발생하지 않음을 보장하지 않는다.
    			   그리고 한번에 전송할 수 있는 데이터의 크기가 제한이 되며, 데이터의 경계가 존재한다.
    			   데이터의 경계가 존재한다는 것은 데이터를 전송할 때 두 번의 함수 호출이 수반되었다면, 
    			   데이터를 수신할 때에도 두 번의 함수 호출이 수반되어야 함을 의미한다.
    		- 한번에 전송할 수 있는 데이터의 크기가 제한된다.
    
    		즉, "신뢰성과 순차적 데이터 전송을 보장하지 않는, 고속의 데이터 전송을 목적으로 하는 소켓"

프로토콜의 최종선택!
"하나의 프로토콜 체계 안에 데이터의 전송방식이 동일한 프로토콜이 둘 이상 존재하는 경우"
즉, 소켓의 데이터 전송방식은 같지만, 그 안에서도 프로토콜이 다시 나뉘는 상황이 존재할 수 있다.
그리고 이러한 경우에는 세 번째 인자를 통해서 원하는 프로토콜 정보를 조금 더 구체화해야하기 떄문에 세 번쨰 인자의 값을 0이 아닌 프로토콜을 지정해야 한다.

"IPv4 인터넷 프로토콜 체계에서 동작하는 연결지향형 데이터 전송 소켓"
	- int tcp_socket=socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); // IPPROTO_TCP 가 아닌 0 값을 지정해도 tcp가 지정되는 이유는 프로토콜이 하나이기 때문!
		-> PF_INET이 IPv4 인터넷 프로토콜 체계를 의미하고 SOCK_STREAM이 연결지향형 데이터 전송을 의미한다.
		   그런데 이 두가지 조건을 만족시키는 프로토콜은 IPPROTO_TCP 하나이기 떄문에 socket 하수 호출문을 구성했다. 
		   이떄 생성되는 소켓을 가리켜 "TCP 소켓"이라 한다.

"IPv4 인터넷 프로토콜 체계에서 동작하는 비 연결지향형 데이터 전송 소켓"
	- int udp_socket=socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); // IPPROTO_UDP 가 아닌 0 값을 지정해도 udp가 지정되는 이유는 프로토콜이 하나이기 때문!
		-> SOCK_DGRAM이 비 연결지향형 데이터 전송을 의미하고,
		   위 조건을 만족하는 프로토콜은 IPPROTO_UDP 하나이기 떄문에 다음과 같이 socket 함수 호출문을 구성했다.
		   그리고 이때 생성되는 소켓을 가리켜 "UDP 소켓"이라 한다.

즉, 소켓의 특성은 첫 번째, 두 번째 매개변수의 인자값을 통해 전달된 정보를 통해서 소켓의 프로토콜이 사실상 결정되기 때문에 세 번쨰 매개변수의 인자값으로 0을 전달해도 된다.

TCP가 데이터의 경계가 없다는 이유는 tcp_server.c와 tcp_client.c의 예제를 확인하면 알 수 있듯이,
server는 write를 통해 한번에 보내고 client는 read를 통해 1바이트 씩 읽어들여서 맘대로 읽는다.
즉, 데이터의 경계가 없음을 확인할 수 있다.
profile
서버공부하는 사람

0개의 댓글