일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 프로그래머스 레벨 2
- dfs
- 백준
- 문자열
- 타입 챌린지
- dp
- 그래프
- HTTP
- type challenge
- Nestjs
- Crawling
- typescript
- 프로그래머스
- 소켓
- HTTP 완벽 가이드
- ip
- Algorithm
- 가천대
- 알고리즘
- 레벨 1
- socket
- 자바스크립트
- 수학
- 쉬운 문제
- BFS
- 크롤링
- TCP
- 타입스크립트
- javascript
- Node.js
- Today
- Total
kakasoo
[TCP/IP] 소켓의 프로토콜과 그에 따른 데이터 전송 특징 본문
네트워크 프로그래밍에서 프로토콜을 빼면 할 말이 없다. - 열혈 TCP/IP 소켓 프로그래밍
나는 이 책을 보면서 공부하는 중인데, 책의 내용을 내가 이해하기 쉽게 내 언어로 정리하고 있다.
아주 좋은 책이므로, 공부하는 사람들은 직접 책을 사서 보는 것을 추천하고 싶다. (나는 서버를 만드는 중이다.)
프로토콜(Protocol)이란?
두 통신 대상 간의 통신 방법, 즉 통신 규약을 의미로, 컴퓨터에서는 "컴퓨터 상호간의 대화에 필요한 통신규약"이다.
어렵게 생각할 것 없이, 우리가 사용하는 socket() 함수 자체가 이미 프로토콜을 쓰고 있었기 때문이다.
프로토콜에는, IPv4, IPv6와 로컬 통신을 위한 유닉스 프로토콜, Low Level 소켓을 위한 프로토콜, IPX 프로토콜이 있다.
각각의 명칭은 또, PF_INET과 같이 PF_xxxx의 꼴을 지니고 있는데, 당장은 PF_INET만 기억해두자.
(사실, 다른 것들은 이 책이 끝날 때 까지 등장하지 않을 것으로 보인다.)
- int socket(int domain, int type, int protocol); -> 성공 시 파일 디스크립터(FD) 반환, 실패 시 -1 반환.
우리가 배운 함수 중, socket() 함수의 리눅스 version이다.
이 함수를 토대로 설명할 때, 매개변수는 아래와 같은 의미를 지닌다.
- doamin : 소켓이 사용할 프로토콜 체계 (Protocol Family) 정보를 전달
- type : 소켓의 데이터 전송방식에 대한 정보 전달
- protocol : 두 컴퓨터 통신 간에 사용될 프로토콜 정보 전달
세번째 매개변수의 이름이 protocol이라서 헷갈릴 수 있는데, 첫번째 domain이 프로토콜 체계, 즉 종류에 해당한다.
따라서 여기에 앞서 말한 IPv4 값을 넣어줘야 하기 때문에, PF_INET (프로토콜 패밀리, INET)을 넣어주어야 한다.
소켓의 타입은 소켓의 데이터 전송 방식이라고 되어 있는데, (PF는 결국, 일종의 '망'에 해당하기 때문에 방법은 아니다.)
프로토콜 체계 내에서 데이터를 어떠한 방식으로 전달할 것인가를, 더 상세하게 결정해주는 역할을 한다.
대표적으로, 소켓은 두 가지의 데이터 전달 방식을 가지는데,
하나는 연결지향형(SOCK_STREAM) 소켓이고, 두번째는 비(非) 연결지향형(SOCK_DGRAM) 소켓이다.
세부적인 특징을 보면,
연결지향형의 경우는 중간에 데이터를 소멸시키지 않고, 전송 순서대로 수신되며, 데이터의 경계가 존재하지 않는다.
이미 우리가 hello 라는 메세지를 전송하는 코드를 보았을 텐데,
말하자면 char data[] = "hello, world!" 라는 데이터를 전송했을 때 배열 자체를 전송하고 버퍼를 통해 읽는 셈이다.
따라서 다시 특징을 볼 때, 전체 데이터를 보냈으니 소멸될 것이 없을 것이고, 차례대로 읽힐 것이며, 경계도 없다.
(소켓에는 자체적으로 버퍼가 존재한다, 버퍼가 가득찰 경우에는 송신을 멈추기 때문에 데이터 손실이 없다.)
비 연결지향형은 전송 순서와 무관하게, 가장 빠르게 전달할 수 있는 경우를 지향한다, 마치 택배 배달처럼.
그러다 보니 데이터가 한번에 (또는 버퍼의 크기 단위로) 전달되지 않아서 경계가 생겨나고, 수신도 호출이 많아진다.
당연히, 데이터를 분할해서라도 빠르게 보내는 게 목적이다보니 의미없이 데이터가 분할되어 손실될 수도 있다.
마지막으로 세번째 인자인, Protocol을 보자.
사실 여기까지 왔으면 더 필요한가 싶을 것이다, 어떤 프로토콜 체계에서, 어떤 데이터 전송 방법을 고를 것인지 선정하였는데도 다시 프로토콜을 인자로 받는다는 게 이해되지 않을 수 있다, 솔직히 나도 이해가 안 갔다.
하지만 책에 나오길,
"하나의 프로토콜 체계 안에 데이터의 전송방식이 동일한 프로토콜이 둘 이상 존재하는 경우" 라고 설명한다.
다만 IPv4에서 데이터 전송방식이 연결지향형인 경우는 단 1개 뿐이다.
또한 데이터 전송방식이 비연결지향형인 경우도 단 1개 뿐인데,
IPv4에서 데이터 전송방식이 연결지향형인 경우를 TCP라고 하고, 비연결지향형인 경우를 UDP라고 한다!
'프로그래밍 > 네트워크' 카테고리의 다른 글
[TCP/IP] 주소정보의 표현 (자료형, 매크로 상수들이 있는 이유) (0) | 2020.07.15 |
---|---|
[TCP/IP] 소켓에 할당되는 IP 주소와 PORT 번호? (0) | 2020.07.15 |
[TCP/IP] 윈도우 소켓 간 통신 (cmd 창에서 확인하기) (0) | 2020.07.15 |
[TCP/IP] 윈도우 기반 소켓 구현 (0) | 2020.07.13 |
[TCP/IP] 네트워크와 소켓에 대한 이해 (0) | 2020.07.13 |