프로토콜이란

지은·2023년 10월 1일
0

네트워크

목록 보기
17/17

프로토콜 (Protocol)

프로토콜(Protocol)

컴퓨터 또는 전자기기 간의 원활한 통신을 위해 지키기로 약속한 규약 - 나무위키

컴퓨터 내부에서, 또는 컴퓨터 사이에서 데이터의 교환 방식을 정의하는 규칙 체계.
기기 간 통신은 교환되는 데이터의 형식에 대해 상호 합의를 요구하는데, 이런 형식을 정의하는 규칙의 집합을 프로토콜이라고 한다. - MDN

처음 네트워크를 공부할 때는 프로토콜이라는 단어가 모호하고 어렵게 느껴졌었다.
지금은 프로토콜을 나의 언어로 쉽게 설명해보면, "어떻게 통신할지 약속한 규칙(rules)" 이라고 말할 수 있을 것 같다.

프로토콜은 특별한 게 아니라 시스템이 서로 통신하는 방식에 대한 일련의 규칙일 뿐이다.
따라서 무언가가 데이터를 보내거나 받을 때마다 그것은 일종의 프로토콜을 사용하고 있으며, 그렇기 때문에 프로토콜은 어디에나 있으며 매우 다양하다.

어떤 프로토콜들은 HTTP 프로토콜과 같이 텍스트를 기반으로 하고,

TCP, UDP와 같은 프로토콜은 원시 바이너리 데이터를 기반으로 한다.

UART와 같은 프로토콜은 전압 수준을 사용해 데이터를 전송하고 수신한다. (전압 낮음 - 0, 전압 높음 - 1)


프로토콜의 종류

OSI 7계층(OSI 7 Layers)에 대해 이전에 정리한 글

각 OSI 7 계층에 속하는 주요 프로토콜들을 살펴보면,

  1. 물리 계층(Physical Layer)
    • 물리적인 신호를 전송하기 위한 계층으로, 전압, 전류, 빛 등의 물리적 신호를 다룬다.
    • Ethernet, USB, HDMI
  2. 데이터 링크 계층(Data Link Layer)
    • 물리 계층에서 전송된 비트(Bit)를 물리적인 매체에 오류 없이 전달하기 위한 계층이다.
    • Ethernet, Wi-Fi, PPP(Point-to-Point Protocol)
  3. 네트워크 계층(Network Layer)
    • 데이터 패킷의 경로 선택 및 라우팅을 관리하는 계층으로, IP 주소를 사용한다.
    • IP(Internet Protocol), ICMP(Internet Control Message Protocol), OSPF(Open Shortest Path First)
  4. 전송 계층(Transport Layer)
    • 데이터 전송의 신뢰성과 연결 관리를 제공하는 계층으로, 포트(Port) 번호를 사용하여 애플리케이션 간 통신을 관리한다.
    • TCP(Transmission Control Protocol), UDP(User Datagram Protocol)
  5. 세션 계층(Session Layer)
    • 데이터 교환의 세션을 설정, 관리, 종료하는 역할을 한다. 세션 복원 및 다중 세션 관리 기능을 제공한다.
    • NetBIOS, SAP, SDP, NWLink
  6. 표현 계층(Presentation Layer)
    • 데이터의 인코딩, 암호화 및 변환을 처리하는 계층으로, 데이터 형식 및 구문을 다룬다.
    • ASCII, MPEG, JPEG, MIDI
  7. 응용 계층(Application Layer)
    • 최종 사용자와 상호작용하기 위한 응용 프로그램과 통신하기 위한 계층으로, 다양한 응용 프로토콜 및 서비스를 제공한다.
    • HTTP, FTP, SMTP, DNS, SSH, WebSocket

이 중에서 가장 익숙한 응용 계층의 HTTP 프로토콜과 전송 계층의 TCP 프로토콜에 대해서 알아보자.


HTTP(Hypertext Transfer Protocol)

: 클라이언트와 웹 서버 간 데이터를 주고받는 데 사용되는 통신 규약

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 프로토콜로 웹 서버와 통신할 수 있다는 것이다.

✳️ curl

: 서버에 데이터를 보내거나 가져올 때 사용하는 명령줄 도구 및 라이브러리 (client-side URL transfer library)

  • Client for URLs의 약자
  • JavaScript 환경에서 ajax, fetch를 이용해 요청을 보내는 것처럼, shell(커맨드 환경)에서는 curl 명령어를 이용할 수 있다.
  • 주로 데이터를 다운로드하거나 원격 서버와 상호 작용하는 데 사용된다.
  • HTTP, HTTPS, FTP, LDAP, SCP, TELNET, SMTP, POP3 등 다양한 프로토콜을 지원하며, Linux, Unix 계열 및 Windows, Mac 등 주요한 OS에서 사용할 수 있다.

curl을 이용한 HTTP GET 요청

curl http://www.naver.com # naver.com의 html이 응답된다.

curl을 이용한 HTTP POST 요청

curl -X POST -d "param1=value1&param2=value2" http://example.com/resource

당연히 POST, PUT, DELETE 요청도 보낼 수 있다.


✳️ wget

: 웹에서 파일을 다운로드하기 위한 명령줄 도구

  • Web Get의 약자
  • HTTP, HTTPS, FTP 등의 프로토콜을 사용해 파일을 다운로드할 수 있다.
  • 주로 큰 파일이나 여러 파일을 일괄 다운로드하고, 재귀적으로 링크를 따라가는 기능을 지원한다.

wget을 이용한 파일 다운로드

wget https://nodejs.org/dist/v14.17.6/node-v14.17.6-linux-x64.tar.xz # node.js가 다운로드된다.

curl은 다양한 프로토콜을 다루기에 더 범용적이고, wget은 웹에서 파일을 효율적으로 다운로드 하는 데에 최적화되어있다.


TCP(Transmission Control Protocol)

: 인터넷에서 데이터를 안정적으로 전송하기 위한 프로토콜, 전송 제어 프로토콜

TCP RFC

TCP Header

HTTP 메세지처럼 TCP 헤더는 아래의 형식을 가지며, 각각의 값은 이진 데이터(binary data)로 표현된다.

  • 예를 들어 Source Port와 Destination Port는 16bits,
  • Sequence Number, Acknowledge Number는 32bits로 표현된다.

  • Source Port : 패킷을 송신하는 시스템의 포트 번호
  • Destination Port : 패킷을 수신할 시스템의 포트 번호
  • Sequence Number : 세그먼트 데이터의 순서 번호
  • Acknowledge Number : 상대방으로부터 수신한 데이터의 바로 다음에 수신할 데이터의 순서 번호
    • Sequence Number의 확인 응답으로서 데이터 전송자에게 패킷을 잘 받았으니 그 다음 패킷을 송신하라는 의미로 사용됨
    • 상대방이 다음에 전송할 패킷의 Sequence Number이기도 함
  • Header Length : TCP 헤더의 전체 길이 (byte 단위)
  • Reserved : 미래를 위해 예약된 필드. 항상 0으로 설정된다.
  • Window Size : 송신 시스템에서 자신이 수용하는 한 버퍼의 크기(byte 단위). 통신하는 동안 송수신자는 해당 필드를 통해 수신 사이즈를 계속 변경하게 된다.
  • Checksum : 데이터가 전송 중에 손실되지 않고 원본과 동일한지 검사한다.
  • Urgent Point : Urgent flag 설정 시, urgent 데이터의 마지막 byte의 일련 번호를 Urgent Point 필드에 저장한다. 해당 부분까지 긴급하게 처리를 요한다는 의미이다.

참고 : TCP의 기능 및 전송 프레임 구조 특성


프로토콜은 메세지 자체일뿐만 아니라 이러한 메세지가 어떻게, 언제 사용되는지에 대한 규칙 또한 포함한다.

예를 들어, TCP의 3-way-handshake가 있다.

3-way-handshake

: TCP 프로토콜에서 클라이언트와 서버가 서로의 상태를 확인하고 연결을 설정하기 위한 과정
클라이언트와 서버 간에 안정적인 연결을 수립하기 위해 사용되며, 데이터 통신의 신뢰성과 안정성을 보장하는 핵심적인 단계 중 하나이다.

1. 클라이언트가 서버로 연결 요청 (SYN)

  • 클라이언트가 서버에 연결을 요청하기 위해 SYN 패킷을 보낸다.
  • SYN 패킷에는 초기 시퀀스 번호(ISN, Initial Sequence Number)가 포함되어 있으며, 이 번호는 클라이언트가 서버로 전송하려는 데이터의 시작 지점을 나타낸다.

2. 서버가 연결 요청을 수락하고 응답 (ACK & SYN)

  • 서버가 클라이언트의 SYN 요청을 받으면, 서버는 클라이언트에게 1번에 대한 ACK 응답과 함께 연결을 요청하는 SYN을 설정한 패킷을 보낸다.
    N)
  • 이 패킷은 서버가 클라이언트의 요청을 수락하고 연결을 수립할 준비가 되었음을 나타낸다.
  • 서버 역시 초기 시퀀스 번호을 설정하며, 클라이언트로부터 받은 SYN 패킷의 시퀀스 넘버를 1 증가시켜 응답한다.

3. 클라이언트가 서버의 응답을 확인 (ACK)

  • 클라이언트는 서버의 ACK & SYN 응답을 받으면, 이를 확인하기 위한 ACK 패킷을 서버로 전송한다.
  • 이제 클라이언트와 서버 간의 연결이 수립된다.

이후에는 데이터를 안전하게 주고받을 수 있으며, 연결이 끝나면 FIN 패킷을 이용한 4-way-handshake를 통해 연결을 종료할 수 있다.


Wireshark로 3-way-handshake 확인해보기

클라이언트 IP : 192.168.8.102
서버 IP : 52.213.14.58

  1. [SYN] Seq=0 : 클라이언트 → 서버로 SYN 요청을 보낸다.

    • 초기 시퀀스 번호(Seq)가 0으로 설정되어 전송된다.
  2. [SYN, ACK] Seq=0 Ack=1 : 서버 → 클라이언트로 ACK & SYN 요청을 보낸다.

    • 이 패킷은 클라이언트의 SYN 요청에 대한 응답이다.
    • 서버의 ACK 번호는 클라이언트가 시작한 SYN 요청의 시퀀스 번호를 1 증가시킨 값으로 설정된다.
    • 서버도 클라이언트와 통신을 시작하기 위해 자체적인 SYN 요청을 보낸다. (마찬가지로 초기 시퀀스 번호가 0으로 지정되어 전송된다.)
  3. [ACK] Seq=1 Ack=1 : 클라이언트 → 서버로 ACK 패킷을 보낸다.

    • 이 패킷은 클라이언트가 서버의 SYN 요청을 받아들이고, 서버와의 연결을 수립하기 위해 보내는 패킷이다.
    • 클라이언트의 ACK 번호는 서버의 SYN 요청의 시퀀스 번호를 1 증가시킨 값으로 설정된다.

참고 : TCP 3-Way Handshake using Wireshark

profile
개발 공부 기록 블로그

6개의 댓글

comment-user-thumbnail
2023년 10월 8일

프로토콜 정의와 HTTP, TCP 정리가 잘되어 있어 쉽게 읽을 수 있었습니다. 감사합니다.

답글 달기
comment-user-thumbnail
2023년 10월 11일

어려워서 두세번 읽었는데도 이해가 쉽지는 않네용 .. ㅠㅠㅠ 고생하셨습니닷!

답글 달기
comment-user-thumbnail
2023년 10월 15일

API 문서에 CURL 요청 예시만 있는 경우가 있는데
https://kigiri.github.io/fetch/ 여기 사이트 이용하면 좋습니다 !
(갑자기 생각나서 적어봅니다..!)

답글 달기
comment-user-thumbnail
2023년 10월 15일

오우 프로토콜 규칙 오랜만에 보고 가네요 잘보고 갑니다.

일태님 팁에 이어서 저도 하나 알려주자면 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

답글 달기
comment-user-thumbnail
2023년 10월 15일

애매했던 개념인데 설명 잘 해주셔서 잘 읽고 갑니다 고생하셨어요!

답글 달기
comment-user-thumbnail
2023년 10월 15일

네트워크 프로토콜에 대해서 기존에 http 프로토콜을 활용한 curl, http, smtp 정도 밖에 몰랐는데 덕분에 좀 더 공부하게 되었네요 감사합니다!

답글 달기