라즈베리파이반

라즈베리파이 등 컴퓨터계열 게시판입니다.

제목통신 프로토콜에 대하여2021-10-16 06:23
작성자user icon Level 4

88x31.png


앞서 ESP 모듈을 이용하여 TCP 서버와 클라이언트를 구성하고 HTTP 통신을 하는 방법을 설명했습니다.

그런데 TCP, HTTP 같은 것들은 뭘까요?? 프로그램 작성은 왜 그렇게 했을까요?


프로그래밍의 이해를 돕기위해 이번 글에서는 통신 프로토콜에 대해 알아보겠습니다.



1. OSI 7계층(Open Systems Interconnection 7 Layer) 


데이터를 주고 받는 과정에는 많은 단계가 있습니다. 국제표준화기구(ISO)에서는 이를 역할에 따라 7개의 계층으로 나누었습니다. 이것을 OSI 7계층(Open Systems Interconnection 7 Layer)이라고 합니다.


mb-file.php?path=2021%2F10%2F15%2FF3995_2.png


각 계층은 독립적으로 작용하며 수많은 프로토콜(Protocol)이 존재하는데 프로토콜이란 데이터를 주고 받기위한 일종의 약속을 말합니다. 프로토콜에 의해 하위 계층으로 갈수록 헤더가 붙으면서 데이터의 크기는 커집니다.


 OSI 모델

 프로토콜

1층: 물리 계층

1000BASE-T, RS-232, RS-485

2층: 데이터 링크 계층

이더넷(Ethernet), PPP, UART

3층: 네트워크 계층

IP, ICMP

4층: 전송 계층

TCP, UDP

5층: 세션 계층

SSH, TLS, RPC

6층: 표현 계층

ASCII, MPEG, JPEG

7층: 응용 계층

HTTP, FTP, Telnet, DHCP


1) 물리 계층

물리 계층의 데이터 단위는 비트(bit)이며, 데이터를 신호로 변환하여 전송하는 계층입니다. 통신케이블(예를 들어 랜선)의 규격이나 무선통신 주파수 설정은 이 계층과 관련되어 있습니다.

물리 계층과 관련된 장비로는 동축 케이블의 아날로그 신호를 디지털 데이터로 변환하는 모뎀(Modem), 다수의 컴퓨터를 연결하여 하나의 네트워크로 보내는 허브(Hub), 디지털 신호를 증폭해주는 리피터(Repeater) 등이 있습니다.


2) 데이터 링크 계층

데이터 링크 계층의 데이터 단위는 프레임(frame)이며, 물리적 매체를 통해 데이터를 전달하는 계층입니다. 네트워크 계층에 데이터를 전달하고 물리계층에서 발생하는 오류를 탐지하고 수정하는 기능을 담당합니다. MAC주소(Media Access Control Address)이라는 물리적 주소를 사용하여 각 기기들의 구분을 가능하게 합니다.

이 계층과 관련된 장비로는 데이터를 MAC주소를 기반으로 빠르게 전달하는 스위치(Switch), 2개의 랜을 연결하는 브릿지(Bridge) 등이 있습니다.


3) 네트워크 계층

네트워크 계층의 데이터 단위는 패킷(packet)이며, 네트워크를 논리적으로 구분하는 계층입니다. 인터넷에서는 IP주소(Internet Protocol Address)라는 논리적 주소를 사용합니다. 이 계층에서는 전송 계층에서 요구하는 서비스 품질(Qos)를 위한 수단을 제공합니다. 또한 라우팅 프로토콜을 통해 데이터를 전송하는 최적의 경로를 찾아냅니다. 관련된 장비로는 랜을 연결하는 라우터(Router)가 있습니다.


4) 전송 계층

전송 계층은 서비스를 구분하고 사용자 사이의 신뢰성 있는 데이터 전달을 담당하는 계층입니다.

이 계층의 프로토콜에는 신뢰성있는 데이터 전송이 목적인 TCP(Transmission Control Protocol)와 빠른 데이터 전송이 목적인 UDP(User Datagram Protocol)가 있습니다.

TCP는 세그먼트(Segment)라는 데이터 단위를 사용하며 UDP는 데이터그램(Datagram)이라는 데이터 단위를 사용합니다.

TCP는 세그먼트를 작은 패킷으로 나눠 여러 경로를 통해 데이터를 전송하고 목적지에서 순서대로 패킷을 조립하여 데이터를 전달합니다. 반면 데이터그램은 순서에 상관없이 데이터를 전달하기때문에 신뢰성은 없습니다.


5) 세션 계층

세션 계층은 두 컴퓨터 사이에 연결을 형성하고 유지 및 종료하는 기능을 담당하는 계층입니다. 일종의 대화통로라고 보면 됩니다.


6) 표현 계층

표현 계층은 데이터의 변환을 담당하는 계층입니다. 파일의 확장자(txt, jpeg, mp4, html 등)이 이 계층과 관련된 프로토콜입니다.


7) 응용 계층

응용 계층은 응용 서비스를 수행하고 사용자 인터페이스를 제공하는 계층입니다. 대표적인 프로토콜로는 html 문서 전송 프로토콜인 HTTP(HyperText Transfer Protocol), 파일 전송 프로토콜인 FTP(File Transfer Protocol), 메일 전송 프로토콜인 SMTP(Simple Mail Transfer Protocol) 등이 있습니다.




2. TCP/IP(Transmission Control Protocol/Internet Protocol) 


인터넷에서 데이터를 주고 받을때는 대부분 전송 계층에 속하는 TCP(Transmission Control Protocol)​와 네트워크 계층에 속하는 IP(Internet Protocol)를 많이 사용하는데 이를 묶어 TCP/IP(Transmission Control Protocol/Internet Protocol)라고 합니다. TCP/IP는 4계층으로 나누며 OSI 모델과 다르게 서로 종속적입니다.


mb-file.php?path=2021%2F10%2F15%2FF3994_1.png 


TCP의 경우 "3 Way-Handshake"라는 방식을 사용합니다. 장치간에 연결이 잘 되었는를 3번의 과정을 통해 확인하여 데이터 전송의 신뢰성을 확보합니다.


mb-file.php?path=2021%2F10%2F16%2FF3997_3.png 


SYN은synchronize sequence numbers의 약자이고 ACK는 acknowledgements의 약자입니다.

상태

설명

CLOSED

닫힌 상태

LISTEN

요청 대기 상태

SYN-SENT

SYN 요청 상태 

SYN-RECEIVED

SYN 요청을 받은 상태

ESTABLISHED

연결 확인 상태


1. 클라이언트가 서버에게 SYN을 요청하고 SYN-SENT 상태가 됩니다.
2. SYN을 요청받은 서버는 SYN-RECEIVED 상태가 되고, SYN과 함께 ACK를 클라이언트에게 읍답합니다. 
3. SYN+ACK를 응답받은 클라이언트는 ACK를 서버에 요청하고 클라이언트와 서버는 ESTABLISHED 상태가 됩니다.

쉽게 말해서 클라이언트가 "내말 들려?" 라고 요청을 보내면 서버가 "응 들려, 넌 내말 들려?" 라고 응답하고,  클라이언트가 "응, 나도 들려" 라고 대답하면서 대화가 시작되는겁니다.



3. HTTP(HyperText Transfer Protocol)


드디어 HTTP 입니다. HTTP는 하이퍼텍스트 전송 프로토콜입니다. 하이퍼텍스트는 문서에서 다른 문서로 접근할 수 있는 텍스트로 쉽게 말해서 인터넷 링크(Link)라고 보면 됩니다.


HTTP는 라인(Line), 헤더(Header), CRLF, 바디(body)로 구성됩니다. CRLF는 \r\n를 말하며 줄바꿈을 나타냅니다.

라인(CRLF)헤더(CRLF)(CRLF)바디(CRLF)


요청(Request) 라인은 전송방식, 경로, 버전으로 구성됩니다.

다음 요청은 전송방식이 GET이고 경로는 / 이며 HTTP/1.1을 따르는 요청을 한 것입니다.

GET / HTTP/1.1


전송방식에는 대표적으로 GET과 POST가 있습니다.

GET으로 요청할때는 바디가 없습니다.


응답(Response) 라인은 버전, 상태코드, 상태로 구성됩니다.

다음 응답은 HTTP/1.1을 따르며 상태코드는 200으로 OK 상태(요청 성공)라는 말입니다.

 HTTP/1.1 200 OK 


다음 코드는 저번 글에 작성한 코드의 일부분입니다.     

if (buf.endsWith("GET /")) {

    client.println(F("HTTP/1.1 200 OK"));

    client.println(F("Content-type:text/html; charset=utf-8"));

    client.println(F("Connection: close"));

    client.println();

    ...

}


이 코드는 서버가 / 경로로 GET 요청을 받으면 HTTP/1.1을 따르는 응답이며 상태는 OK로 요청성공이라는 응답을 보낸다는 뜻입니다.

다음과 같이 메시지가 전송됩니다.

HTTP/1.1 200 OK

Content-type: text/html; charset=utf-8

Connection: close


...


클라이언트는 서버의 / 경로로 GET 요청을 한다면 HTTP/1.1에 바디의 데이터를 응답받습니다.


또다른 코드를 보겠습니다.

 if (buf.endsWith("POST /switch/on")) {

    client.println(F("HTTP/1.1 200 OK"));

    client.println(F("Content-type:application/json; charset=utf-8"));

    client.println(F("Connection: close"));          

    client.println();

    digitalWrite(LED, HIGH);

    client.println(F("{"status":1}"));

}


다음 코드는 ESP 모듈 서버에서 /switch/on 경로로 POST 요청을 받으면 LED를 켜고 {"status":1} 이라는 json을 응답합니다. 

다음과 같이 메시지가 전송됩니다.

HTTP/1.1 200 OK

Content-type:application/json; charset=utf-8

Connection: close


{"status":1}


클라이언트는 ajax를 통해 /switch/on 경로로 POST 요청을 하면 json 형태의 응답을 받게 됩니다.

#프로토콜# protocol# HTTP# TCP/IP# TCP# OSI
댓글
자동등록방지
(자동등록방지 숫자를 입력해 주세요)