2.소켓의 타입과 프로토콜의 설정

 

#.프로토콜이란 무엇인가? 

프로토콜은 컴퓨터간에 통신(대화)을 하기 위해 필요한 통신 규약, 규칙, 약속이다.

 

#프로토콜 체계(protocol Family)

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

#.소켓 함수

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

 

-반환 값

 정상(fd >0), 실패(-1)

 

-ERR_NO 

  EAFNOSUPPORT : Address Family를 지원하지 않음.

  EMFILE : 프로세스에서 더 이상 fd 생성 불가

  ENFILE : 시스템에서 더 이상 fd 생성 불가

 

-매개변수 

domain : Address Family ( AF_INET, AF_INET6 ...)

type : SOCK_STREAM(TCP), SOCK_DGRAM(UDP)

protocol : IPPROTO_TCP, IPPROTO_UDP

 

#.소켓의 타입

소켓의 타입이란 소켓의 데이터 전송 방식을 의미한다. 위에서 프로토콜 체계가 결정되었다고 해서 데이터의 전송방식 까지 완전히 결정되는 것은 아니다. 즉, socket 함수의 첫 번째 인자로 전달되는 PF_INET에 해당하는 프로토콜 체계에도 둘 이상의 데이터 전송 방식이 존재한다.

 

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

연결지향형 비유

- 중간에 데이터가 소멸되지 않고, 목적지로 전달된다.

- 전송 순서대로 데이터가 수신된다.

- 전송되는 데이터의 경계가 존재하지 않는다.

 

데이터를 송수신하는 소켓은 내부적으로 버퍼(buffer), 쉽게말해 바이트 배열을 지니고 있다. 그리고 소켓을 통해 전송되는 데이터는 일단 이 배열에 저장된다. 때문에 데이터가 수신되었다고 해서 바로 read 함수를 호출해야 하는 것은 아니다. 이 배열의 용량을 초과하지 않는 한, 데이터가 채워진 후에 한번의 read 함수 호출을 통해서 데이터 전부를 읽어 들일 수 있고, 반대로 한버의 write 함수 호출로 전송된 데이터 전부를 여러번의 read 함수로 읽어 들일 수 있다. 즉, read 함수의 호출 횟수와 write 함수의 호출 횟수는 연결지향형 소켓의 경우 큰 의미를 갖지 못한다. 때문에 연결지향형 소켓은 데이터의 경계가 존재하지 않는다고 말하는 것이다.

 

*소켓에 존재하는 버퍼가 꽉 차면 데이터가 소멸되나?

일단 이 버퍼에 수신된 데이터는, read 함수호출일 통해서 데이터가 읽혀지면 읽혀진 만큼 버퍼에서 비워지게 된다. 따라서 버퍼가 마냥 채워진 상태에 놓이진 않는다. 하지만 read 함수 호출로 읽혀지는 데이터의 양보다 많은 양의 데이터가 수신되면 버퍼도 꽉찰 수 있다. 그리고 이상태에 놓인 소켓은 더이상 데이터를 수신할 수 없다. 하지만 이상황에 놓여도 전송되는 데이터가 소멸되는 일은 발생하지 않는다. 데이터를 전송하는 영역의 소켓이 더 이상 데이터를 전송하지 않기 때문이다. 즉, 지금 설명하는 연결지향형 소켓은 자신과 연결된 상대 소켓의 상태를 파악해가면서 데이터를 전송한다. 혹 데이터가 제대로 전송되지 않으면, 데이터를 재전송하기까지 한다. 따라서 연결지향형 소켓의 데이터 손실은 특별한 경우가 아니면 발생하지 않는다.

 

" 소켓대 소켓의 연결은 반드시 1:1 이어야 한다."

 

 

 

*소켓타입2 :비결지향형(SOCK_DGRAM)

비연결지향형 비유

- 전송된 순서에 상관없이 가장 빠른 전송을 지향

- 전송되는 데이터의 손실과 파손의 우려가 있다.

- 전송되는 데이터의 경계가 존재한다.

- 한번에 전송할 수 있는 데이터의 크기가 제한된다.

 

비연결지향형 소켓은 오토바이 택배에 비유할 수 있다. 속도가 생명이다. 따라서 동일한 목적지를 향해 출발한 두개의 물건이 출발순서에 상관없이 최대한 빨리 목적지를 향하게 되며 그 특성상 손실 및 파손의 우려가 있다. 그리고 크기에 제한이 있어 이를 나눠보내면 받는사람도 나눠서 받아야한다. 택배를 통해 수령할 물건이 두개인데 이를 세번에 나눠 수령하거나 한번에 수령할수는 없잖은가? 이를 "전송되는 데이터의 경계가 존재한다" 고 한다.

 

#.socket 함수의 세번째 인자

하나의 프로토코 체계 안에 데이터 전송방식이 동일한 프로토콜이 둘 이상 존재하는 경우 즉 소켓의 데이터 전송방식은 같지만 그 안에서도 프로토콜이 다시 나뉘는 상황이 존재하는데, 그러한 경우는 세번째 인자를 통해서 원하는 프로토콜 정보를 조금 더 구체화한다.

 

예)
IPPROTO_TCP : 연결지향형

IPPROTO_TCP : 비연결 지향형



#.연결지향형 소켓. tcp 소켓의 예.

 

"전송되는 데이터의 경계가 존재하지 않는다."

 

확인을 위해서 write 함수의 호출 회숫와 read 함수의 호출 횟수를 불일치 시켜 본다.

 

 

#.서버 예제

#.클라이언트 예제

#.결과

서버가 전송한 13바이트짜리 데이터를 총 13회의 read 함수로 읽어 들였다. 참고: 원래는 while 문으로 처리를 해야 하는데, 테스트용으로 for 문을 돌렸다. 어쨌든 13번 read 함수를 호출해서 데이터를 읽는것은 증명되었다.

 

 

 

 

 

참고: 윤성우 열혈 tcp/ip 소켓프로그래밍