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
- 데이터만 목적지에 계속 던지는 특징
- 게임, 스트리밍
- 연결 지향형 소켓 타입 ex. TCP 소켓 : SOCK_STREAM
- 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
- TCP 소켓
- 다음 내용은 참고자료로 공부하고 있는 책에서 제공하는 소스코드의 내용입니다.
- 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", 가 같아야 함
- launch.json 파일 역할