리셋 되지 말자

[Ch2] 정리 본문

socket

[Ch2] 정리

kyeongjun-dev 2020. 4. 13. 18:25

프로토콜(Protocol)이란 무엇인가?

  • 대화에 필요한 통신 규약을 의미한다. 즉, 컴퓨터의 관점에서 "컴퓨터 상호간의 대화에 필요한 통신규약" 이라고 할 수 있다.

소켓의 생성(복습)

  • int socket(int domain, int type, int protocol);
    • domain : 소켓이 사용할 프로토콜 체계(Protocol Family) 정보 전달
    • type : 소켓의 데이터 전송방식에 대한 정보 전달
    • protocol : 두 컴퓨터간 통신에 사용되는 프로토콜 정보 전달

프로토콜 체계(Protocol Family) - 헤더파일 sys/socket.h에 선언되어 있음

  • PF_INET : IPv4 인터넷 프로토콜 체계(가장 보편화되고 많이 쓰임)
  • PF_INET6 : IPv6 인터넷 프로토콜 체계
  • PF_LOCAL : 로컬 통신을 위한 UNIX 프로토콜 체계
  • PF_PACKET : Low Level 소켓을 위한 프로토콜 체계
  • PF_IPX : IPX 노벨 프로토콜 체계

소켓타입(Type)

  • 소켓타입 : 소켓의 데이터 전송 방식을 의미(소켓의 데이터 전송방식을 결정). 소켓타입 정보를 소켓 생성시, 두 번째 인자로 전달함.
  • 하나의 프로토콜 체계정보에도 둘 이상의 데이터 전송방식이 존재해서 반드시 결정 해주어야 함.
  • 대표적으로는 연결지향형 소켓, 비 연결지향형 소켓이 있다.

    1. 연결지향형 소켓(SOC_STREAM)

  • 소켓 생성 시, 두 번째 인자로 SOC_STREAM을 전달하면 '연결지향형 소켓'이 생성된다.
  • 연결 지향형 소켓의 특징
  1. 중간에 데이터가 소멸되지 않고 목적지로 전송된다.

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

  3. 전송되는 데이터의 경게(Boundary)가 존재하지 않는다. (1000바이트를 100씩 write하고, 1000바이트를 1000씩 한번에 read하여도 된다.)

  4. 데이터 송, 수신 시에 read, write의 함수 호출 횟수에 의존하지 않는다. 보내고 받는 데이터의 총 량에 맞도록 한다.

  5. 소켓 대 소케싀 연결이 1:1 이어야 한다.(연결지향형 소켓 하나는 다른 연결지향형 소켓 하나와만 연결이 가능하다.)

    요약 : "신뢰성 있는 순차적인 바이트 기반의 연결지향 데이터 전송 방식의 소켓"

2. 비 연결지향형 소켓(SOCK_DGRAM)

  • 소켓 생성 시, 두 번째 인자로 SOCK_DGRAM을 전달하면 '비 연결지향형 소켓'이 생성된다.
  • 비 연결지향형 소켓의 특징
  1. 전송된 순서에 상관없이 가장 빠른 전송을 지향한다.(연결지향형 소켓에 비해 전송속도가 빠르다.)

  2. 전송된 데이터는 손실의 우려가 있고, 파손의 우려가 있다.

  3. 전송되는 데이터의 경게(Boundary)가 존재한다.(write를 10번 했다면, read를 10번 해야한다.)

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

  5. 연결지향형 소켓과 달리 '연결'이라는 개념이 존재하지 않는다.
    요약 : "신뢰성과 순차적 데이터 전송을 보장하지 않는, 고속의 데이터 전송을 목적으로 하는 소켓"

    프로토콜의 최종 선택

  • 소켓 생성 시, 세 번째 인자로 전달해야 하는 것인데, "하나의 프로토콜 체계 안에 데이터의 전송 방식이 동일한 프로토콜이 둘 이상 존재하는 경우"에는 0으로 생략하지 않고, 명시해 주어야 한다.(소켓의 데이터 전송방식은 같지만, 그 안에서도 프로토콜이 다시 나뉘는 상황이 존재할 수 있다.)

    ex) "IPv4 인터넷 프로토콜 체계에서 동작하는 여녁ㄹ지향형 데이터 전송 소켓 " = int tcp_socket=socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

    PF_INET, SOCK_STREAM을 사용하는 프로토콜은 IPPROTO_TCP 하나밖에 없어서 0으로 생략하여도 된다. 그리고 이를 "TCP"소켓이라고 한다.

    ex) "IPv4 인터넷 프로토콜 체계에서 동작하는 비 연결지향형 데이터 전송 소켓" = int udp_socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);

    PF_INET, SOCK_DGRAM을 사용하는 프로토콜은 IPPROTO_UDP 하나밖에 없어서 0으로 생략하여도 된다. 그리고 이를 "UDP"소켓이라고 한다.

Comments