공부중

[TCP/IP 소켓]소켓의 타입과 프로토콜의 설정 본문

Programing/TCP IP 소켓

[TCP/IP 소켓]소켓의 타입과 프로토콜의 설정

곤란 2013. 1. 7. 21:09
반응형

 

∙프로토콜(Protocol)

프로토콜이란 컴퓨터 상호간의 대화에 필요한 통신규약이라고 볼 수 있다.

 

쉽게 말해서 서로 데이터를 주고 받기 위해서 정의해 놓은 약속을 뜻한다.

 

∙소켓의 생성

#include <sys/socket.h>

int socket(int domain, int type, int protocol);

성공 시 파일 디스크립터, 실패 시 -1 반환

  • domain

소켓이 사용할 프로토콜 체계(Protocol Family)정보 전달

  • type

소켓의 데이터 전송방식에 대한 정보 전달

  • protocol

두 컴퓨터간 통신에 사용되는 프로토콜 정보 전달

 

∙프로토콜 체계(Protocol Family)

socket 함수의 첫 번째 인자로 생성되는 소켓이 사용할 프로토콜의 부류정보를 전달해야 한다.

이러한 부류정보를 가리켜 '프로토콜 체계'라 한다.

이름

프로토콜 체계(Protocol Family)

  • PF_INET

IPv4 인터넷 프로토콜 체계

  • PF_INET6

IPv6 인터넷 프로토콜 체계

  • PF_LOCAL

로컬 통신을 위한 UNIX 프로토콜 체계

  • PF_PACKET

Low Level 소켓을 위한 프로토콜 체계

  • PF_IPX

IPX 노벨 프로토콜 체계

 

∙소켓의 타입(Type)

소켓의 타입이란 소켓의 데이터 전송방식을 의미한다.

이 정보를 socket 함수의 두 번째 인자로 전달하여야 한다. 그래야지 생성되는 소켓의 데이터 전송 방식을 결정 할 수 있다.

 

∙소켓의 타입1:연결지향형 소켓(SOCK_STREAM)

socket함수의 두 번째 인자로 SOCK_STREAM을 전달하면 '연결지향형 소켓'이 생성된다.

 

연결지향형 소켓의 특징은 다음과 같다.

  • 중간에 데이터가 소멸되지 않고 목적지로 전송
  • 전송 순서대로 데이터가 수신
  • 전송되는 데이터의 경계(Boundary)가 존재하지 않는다.
  • 소켓 대 소켓의 연결은 반드시 1대 1이어야 한다.

 

소켓을 통해 전송되는 데이터는 버퍼(buffer)에 저장된다.

데이터가 수신된다고 바로 read함수를 호출해야 하는 것은 아니다.

이 버퍼의 용량을 초과하지 않는 한 한번의 함수 호출을 통해서 전부를 읽을 수도 있고

반대로 여러 번의 read함수 호출을 통해서 읽을 수도 있다.

 

즉 read함수와 write함수의 호출 횟수는 연결지향형 소켓의 경우 큰 의미를 갖지 못한다.

이 때문에 연결지향형 소켓은 "데이터의 경계가 존재하지 않는다"고 말한다.

 

연결 지향형 소켓은 신뢰성 있는 순차적인 바이트 기반의 연결지향 데이터 전송 방식의 소켓 이다.

 

∙소켓의 타입 2: 비 연결지향형 소켓(SOCK_DGRAM)

socket 함수의 두 번째 인자로 SOCK_DGRAM을 전달하면 '비 연결 지향형 소켓'이 생성된다.

 

비 연결지향형 소켓의 특징은 다음과 같다.

  • 전송된 순서에 상관없이 가장 빠른 전송을 지향한다.
  • 전송된 데이터는 손실의 우려가 있고, 파손의 우려가 있다.
  • 전송되는 데이터의 경계(Boundary)가 존재한다.
  • 한번에 전송할 수 있는 데이터의 크기가 제한된다.

 

데이터를 세번에 나누어서 보냈을 경우 세번에 나눠서 받아야 되는 전송 특성을 보고 "전송되는 데이터의 경계가 존재한다"고 말한다.

 

비 연결지향형 소켓은 신뢰성과 순차적 데이터 전송을 보장하지 않는, 고속의 데이터 전송을 목적으로 하는 소켓이다.

 

∙프로토콜의 최종선택

socket함수의 세번제 인자는 최종적으로 소켓이 사용하게 될 프로토콜 정보를 전달하는 목적으로 존재한다.

 

socket함수의 첫 번째, 그리고 두 번째 전달인자를 통해서 충분히 원하는 유형의 소켓을 생성할 수 있다.

하지만 다음과 같은 상황 때문에 세 번째 인자는 필요하다.

 

"하나의 프로토콜 체계 안에 데이터의 전송방식이 동일한 프로토콜이 둘 이상 존재할 경우"

 

소켓의 데이터 전송방식은 같으나 그 안에서 프로토콜이 다시 나뉘는 상황이 존재할 수 있다.

이 경우 세 번쨰 인자를 통해서 원하는 프로토콜 정보를 조금 더 구체화 시켜야 한다.

 

 

ex) "IPv4 인터넷 프로토콜 체계에서 동작하는 연결지향형 데이터 전송 소켓"

int tcp_socket=socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

PF_INET IPv4 인터넷 프로토콜 체계를 의미하고, SOCK_STREAM이 연결지향형 데이터 전송을 의미한다.

그러나 이 두 가지 조건을 만족하는 프로토콜은 IPPROTO_TCP 하나이다.

이때 생성되는 소켓을 가리켜 'TCP소켓'이라 한다.

 

ex) "IPv4 인터넷 프로토콜 체계에서 동작하는 비 연결지향형 데이터 전송 소켓"

int udp_socket=socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);

SOCK_DGRAM이 비 연결지향형 데이터 전송을 의미한다.

위의 조건을 만족하는 프로토콜은 IPPROTO_UDP하나이다.

이때 생성되는 소켓을 가리켜 'UDP 소켓'이라 한다.

 

∙윈도우 운영체제의 socket함수

#include <winsock2.h>

SOCKET socket(int af, int type, int protocol);

성공 시 소켓 핸들, 실패 시 INVALID_SOCKET 반환

함수의 이름과 인자로 전달되는 상수의 이름까지도 리눅스와 동일하다.

 

다만 반환형에서 조금 차이가 나는데..

반환형 SOCKET은 정수로 표현되는 소켓의 핸들 값을 저장하기 위해 정의된 자료형의 이름이다.

즉 socket함수가 반환하는 값은 SOCKET형 변수를 하나 선언해서 저장해야 한다.

(반환값이 정수이므로 int형 변수를 하나 선언해서 저장해도 된다.)

 

오류 발생시 반환하는 INVALID_SOCKET의 상수값은 -1이다.

 

 

 

반응형