TCP/IP 소켓 프로그래밍 - 소켓

김재성·2022년 1월 14일
0

소켓 프로그래밍

목록 보기
1/1

프로토콜

  • 상호 통신에 필요한 규약

소켓 생성

# include <sys/socket.h>
int socket(int domain, int type, int protocol);
// 성공 시 fd, 실패 시 -1 반환
  • domain : 소켓이 사용할 프로토콜 체계(Protocol Family) 정보 전달
  • type : 소켓의 데이터 전송 방식. SOCK_STREAM or SOCK_DGRAM
  • protocol : 통신에 사용할 프로토콜. 최종 선정된 프로토콜.

프로토콜 체계

소켓이 통신에 사용하는 프로토콜은 다양하다. 다양한 프로토콜들을 분류하는 정보를 프로토콜 체계라 한다. socket 함수의 첫 번째 인자로 전달한다.

이름프로토콜 체계(Protocol Family)
PF_INETIPv4 인터넷 프로토콜 체계
PF_INET6IPv6 인터넷 프로토콜 체계
PF_LOCAL로컬 통신을 위한 UNIX 프로토콜 체계
PF_PACKETLow Level 소켓을 위한 프로토콜 체계
PF_IPXIPX 노벨 프로토콜 체계

socket 함수의 세 번째 인자가 실제로 사용될 최종 프로토콜이다. 이 값은 첫 번째 인자인 프로토콜 체계의 범위 내에서 결정된다.

소켓의 타입

소켓의 데이터 전송 방식. socket 함수의 두 번째 인자. 한 프로토콜 체계엔 데이터 전송 방식이 여럿일 수 있다.

  • SOCK_STREAM/ 연결지향형 소켓
    • 데이터가 중간에 소멸되지 않는다.
    • 전송 순서대로 수신된다.
    • 전송되는 데이터의 경계가 존재하지 않는다.
    • 소켓은 내부적으로 버퍼를 사용한다. 그렇기 때문에 아래와 같은 시나리오가 가능하다.
      • 송신 측은 3번의 write 함수로 총 100바이트를 보내고, 수신 측은 한 번의 read 함수로 100바이트를 모두 수신한다.
      • 또는 한 번의 write 함수로 보내고, 3번의 read 함수로 수신할 수 도 있다.
  • SOCK_DGRAM/ 비 연결지향형 소켓
    • 전송된 순서와 상관없이 가장 빠른 전송을 지향.
    • 데이터 손실 및 파손 우려
    • 전송된 데이터의 경계가 있다.
      • 두 번에 걸쳐 송신된 데이터는 두 번에 걸쳐 수신되어야한다.
    • 한번에 전송할 수 있는 데이터의 크기가 제한된다.

프로토콜의 최종선택

socket 함수의 세 번째 인자. 하나의 프로토콜 체계(첫 번째 인자) 안에 데이터 전송방식(두 번째 인자)이 동일한 프로토콜이 여럿일 수 있다. 그렇기 때문에 세 번째 인자가 필요할 때가 생긴다.

"IPv4 인터넷 프로토콜 체계에서 동작하는 연결지향형 데이터 전송 소켓"는 아래와 같다.

int tcp_socket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
profile
테니스 좋아합니다.

0개의 댓글