프로토콜(Protocol)
컴퓨터 또는 전자기기 간의 원활한 통신을 위해 지키기로 약속한 규약 - 나무위키
컴퓨터 내부에서, 또는 컴퓨터 사이에서 데이터의 교환 방식을 정의하는 규칙 체계.
기기 간 통신은 교환되는 데이터의 형식에 대해 상호 합의를 요구하는데, 이런 형식을 정의하는 규칙의 집합을 프로토콜이라고 한다. - MDN
처음 네트워크를 공부할 때는 프로토콜이라는 단어가 모호하고 어렵게 느껴졌었다.
지금은 프로토콜을 나의 언어로 쉽게 설명해보면, "어떻게 통신할지 약속한 규칙(rules)" 이라고 말할 수 있을 것 같다.
프로토콜은 특별한 게 아니라 시스템이 서로 통신하는 방식에 대한 일련의 규칙일 뿐이다.
따라서 무언가가 데이터를 보내거나 받을 때마다 그것은 일종의 프로토콜을 사용하고 있으며, 그렇기 때문에 프로토콜은 어디에나 있으며 매우 다양하다.
어떤 프로토콜들은 HTTP 프로토콜과 같이 텍스트를 기반으로 하고,
TCP, UDP와 같은 프로토콜은 원시 바이너리 데이터를 기반으로 한다.
UART와 같은 프로토콜은 전압 수준을 사용해 데이터를 전송하고 수신한다. (전압 낮음 - 0, 전압 높음 - 1)
OSI 7계층(OSI 7 Layers)에 대해 이전에 정리한 글
각 OSI 7 계층에 속하는 주요 프로토콜들을 살펴보면,
Ethernet
, USB
, HDMI
Ethernet
, Wi-Fi
, PPP(Point-to-Point Protocol)
IP(Internet Protocol)
, ICMP(Internet Control Message Protocol)
, OSPF(Open Shortest Path First)
TCP(Transmission Control Protocol)
, UDP(User Datagram Protocol)
NetBIOS
, SAP
, SDP
, NWLink
ASCII
, MPEG
, JPEG
, MIDI
HTTP
, FTP
, SMTP
, DNS
, SSH
, WebSocket
이 중에서 가장 익숙한 응용 계층의 HTTP 프로토콜과 전송 계층의 TCP 프로토콜에 대해서 알아보자.
: 클라이언트와 웹 서버 간 데이터를 주고받는 데 사용되는 통신 규약
HTTP RFC
위 문서는 국제 인터넷 표준화 기구(IETF, Internet Engineering Task Force)가 발행한 HTTP RFC 문서로, HTTP 프로토콜에 대한 개념부터 HTTP 메세지가 어떻게 구성되어있는지(헤더, 상태 코드, 메서드) 등 다양한 세부 사항을 정의하고 설명하고 있다.
(하지만 영어로 작성되어있기 때문에 읽기 어렵다면 한국어 번역본을 구글링해서 읽어도 된다..)
*RFC(Request for Comments) : 컴퓨터 네트워크 및 인터넷 프로토콜에 대해 표준화와 기술적인 사양을 정의하고 설명하는 문서 시리즈
HTTP 프로토콜에 대한 자세한 설명은 이전에 블로깅한 글을 참고하길 바란다.
HTTP (HyperText Transfer Protocol)
💡 이번에 공부하며 HTTP 프로토콜에 대해 새롭게 알게 된 사실은,
크롬, 파이어폭스, 사파리와 같은 웹 브라우저에서만 HTTP 프로토콜을 사용하는 게 아니라, curl이나 wget과 같은 명령줄 도구를 사용해서도 HTTP 프로토콜로 웹 서버와 통신할 수 있다는 것이다.
: 서버에 데이터를 보내거나 가져올 때 사용하는 명령줄 도구 및 라이브러리 (client-side URL transfer library)
curl http://www.naver.com # naver.com의 html이 응답된다.
curl -X POST -d "param1=value1¶m2=value2" http://example.com/resource
당연히 POST, PUT, DELETE 요청도 보낼 수 있다.
: 웹에서 파일을 다운로드하기 위한 명령줄 도구
wget https://nodejs.org/dist/v14.17.6/node-v14.17.6-linux-x64.tar.xz # node.js가 다운로드된다.
curl은 다양한 프로토콜을 다루기에 더 범용적이고, wget은 웹에서 파일을 효율적으로 다운로드 하는 데에 최적화되어있다.
: 인터넷에서 데이터를 안정적으로 전송하기 위한 프로토콜, 전송 제어 프로토콜
HTTP 메세지처럼 TCP 헤더는 아래의 형식을 가지며, 각각의 값은 이진 데이터(binary data)로 표현된다.
프로토콜은 메세지 자체일뿐만 아니라 이러한 메세지가 어떻게, 언제 사용되는지에 대한 규칙 또한 포함한다.
예를 들어, TCP의 3-way-handshake가 있다.
: TCP 프로토콜에서 클라이언트와 서버가 서로의 상태를 확인하고 연결을 설정하기 위한 과정
클라이언트와 서버 간에 안정적인 연결을 수립하기 위해 사용되며, 데이터 통신의 신뢰성과 안정성을 보장하는 핵심적인 단계 중 하나이다.
이후에는 데이터를 안전하게 주고받을 수 있으며, 연결이 끝나면 FIN 패킷을 이용한 4-way-handshake를 통해 연결을 종료할 수 있다.
클라이언트 IP : 192.168.8.102
서버 IP : 52.213.14.58
[SYN] Seq=0
: 클라이언트 → 서버로 SYN 요청을 보낸다.
[SYN, ACK] Seq=0 Ack=1
: 서버 → 클라이언트로 ACK & SYN 요청을 보낸다.
[ACK] Seq=1 Ack=1
: 클라이언트 → 서버로 ACK 패킷을 보낸다.
API 문서에 CURL 요청 예시만 있는 경우가 있는데
https://kigiri.github.io/fetch/ 여기 사이트 이용하면 좋습니다 !
(갑자기 생각나서 적어봅니다..!)
오우 프로토콜 규칙 오랜만에 보고 가네요 잘보고 갑니다.
일태님 팁에 이어서 저도 하나 알려주자면 VSC 확장 프로그램에 REST Client라는 게 있어요.
http
확장자 파일인 api.http
를 만들어서 하면 바로 api 실행시키고 할 수 있답니다. 아래처럼여!
[rest-client]
2@protocol= http
@hostname = localhost
@port = 3000
@host = {{hostname}}:{{port}}
@contentType = application/json
@baseUrl = http://localhost:3000
...
POST {{baseUrl}}/v1/signup/certcode HTTP/1.1
content-type: application/json
{
"type": "phone",
"props": "01031766600",
"version": "0.0.1"
}
이렇게 하고 Send Request
하면 결과값을 알 수 있답니당. 아래 참고해서 사용법 봐보세요!
https://www.codeit.kr/tutorials/37/REST-Client-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0
프로토콜 정의와 HTTP, TCP 정리가 잘되어 있어 쉽게 읽을 수 있었습니다. 감사합니다.