study/NETWORK PROGRAMMING

03-1. [Linux/Ubuntu] 네트워크 프로그래밍 - 소켓 타입과 프로토콜 설정

김팥빵_ 2025. 3. 21. 15:04

소켓 타입과 프로토콜 설정

  • 프로토콜이란?
    • 컴퓨터 상호간의 데이터 송수신에 필요한 통신규약
    • 소켓을 생성할 때 기본적인 프로토콜을 지정한다.
#include	<sys/socket.h>

int socket(int domain,	int type,	int protocol);
->	성공 시 파일 디스크립터, 실패 시 -1 반환
  • domain[PF_INET] : IPv4
  • type[SOCK_STREAM] : TCP
  • protocol[0]
  • ***매개변수(domain, type protocol) 모두 프로토콜 정보와 관련이 있음

 

  • 1. 프로토콜 체계 (protocol family)
    • IP_INET은 IPv4 인터넷 프로토콜을 의미한다.
    • socket()함수의 domain 파라미터에 적용

대표적인 프로토콜 체계

  • 2. 소켓의 타입
    • 데이터 전송방식을 의미한다. 
    • 소켓이 생성될 때 소켓의 타입도 결정되어야 한다.
  • 프로토콜 체계 PF_INET의 대표적인 소켓 타입 
    • 연결 지향형 소켓 타입 ex. TCP 소켓 : SOCK_STREAM
      • HTTP, FTP, Telnet(원격접속에 사용), SMTP
    • 비 연결 지향형 소켓 타입 ex. UDP 소켓 : SOCK_DGRAM
      • 데이터만 목적지에 계속 던지는 특징
      • 게임, 스트리밍
  • TCP  vs. UDP 프로토콜 비교
특징 TCP UDP
연결 설정 - 데이터 전송 이전에 연결 설정이 필요 -  연결 설정이 필요없음
데이터 전송 순서 - 전송 순서대로 데이터 수신 - 전송 순서에 상관없이 데이터 전달
데이터 재전송 - 패킷 에러 발생 시 재전송 지원 - 재전송 기능 없음
- 데이터 손실 우려
데이터 전달 보장
( = 신뢰성 )
- 신뢰성 있는 데이터 전송 -  신뢰성을 보장하지 않음
Broadcasting 지원
(특정한 모든 곳에 데이터를 다 뿌림)
( = multicasting)
- 지원 X  - 지원 O
전송 속도
(앞선 UDP의 단점들에도 불구하고 UDP를 쓰는 이유) 
- 느림 (복잡한 전송 과정) - 빠름 (단순한 전송 과정)

 

  • 3. 프로토콜의 선택
    • TCP 소켓 사용 - IPPROTO_TCP
    • UDP 소켓 사용 - IPPROTO_UDP
    • 프로토콜 선택
      • 첫 번째, 두 번째 인자로 전달된 정보를 통해 소켓의 프로토콜이 결정된다.
      • IPPROTO_TCP, IPPROTO_UDP 대신 0 사용 가능

 

데이터 경계

  • -> "송수신 관계"로 이해하기 
    • TCP 소켓
      • 전송되는 데이터 경계(boundary)가 존재하지 않음
      • 데이터 전송 횟수와 수신 횟수가 일치하지 않음
      • 전송한 데이터 양만큼 수신한다
    • UDP 소켓
      • 전송되는 데이터 경계(boundary)가 존재함
      • 데이터 크기가 제각각임
      • 데이터 크기가 달라도 수량만 같으면 됨 (데이터 전송 횟수와 수신 횟수가 일치해야 함)
    • mtu : maximum transmit unit 최대 전송 데이터 크기 ex. 1500bytes

maximum transmit unit

  • 다음 내용은 참고자료로 공부하고 있는 책에서 제공하는 소스코드의 내용입니다.
  • tcp_server.c 와 tcp_client.c의 동작 과정
    • write함수 "한 번" 호출하면 "1회" 보낸 것    /* tcp_server.c : 데이터 전송 역할 */
    • while(read_len=read(sock, &message[idx++], 1))       /* tcp_client.c : 데이터 수신 역할 */
      • 1 -> 읽어 올 최대 바이트 수
      • 1byte씩 읽어와서 message[idx++]에 넣는다는 뜻
      • 만약 sever가 hello!를 보내면 1byte씩 읽어오기 때문에, while문을 실행할 때마다 h, e, l, l, o, !, null을 읽어와 message 배열에 저장한다 -> 총 6번 읽어와 저장
      • read()함수는 실제 읽은 바이트 수를 return하고, [reading end-of-file]일 때 '0'을 리턴하므로 읽어온 데이터가 0보다 크기만 하면 계속 읽는다.
    • server에선 1번 보냈지만 client에선 6번 수신했다.
    • tcp의 경우 : 송신 횟수와 수신 횟수가 일치하지 않음

 

vscode 디버깅하기 위한 설정

  • launch.json 파일 설정
    • launch.json 파일 역할
      • 디버깅 환경 설정
      • 명령행 인자 설정
      • 사전 작업
        • preLaunchTask를 통해 디버깅 전에 컴파일 수행
        • "program" 항목
          • "program": "${fileDirname}/${fileBasenameNoExtension}",
          • 현재 사용중인 소스 코드의 실행 파일
      • 수정사항
        • "args": ["127.0.0.1", "9190"],  : 전달될 명령행 인자 설정 
        • launch.json파일의 "preLaunchTask": "C/C++ gcc build active file",이랑
        • task.json파일의 "label": "C/C++: gcc build active file", 가 같아야 함