티스토리 뷰

네트워크통신의 순서를 살펴보면 어플리케이션 계층에서 HTTP메시지를 작성한다. 이 메시지가 전송요청이 되면 전송계층으로 넘어가 TCP 혹은 UDP의 방식으로 패킷되어 인터넷계층으로 넘어가게된다. 인터넷계층에서는 TCP로 패킷된 정보를 포함한 IP패킷을 생성해 연결계층으로 보낸다. 연결계층에서는 요청된 목적지로 보내주고 메시지를 전송하기위해 거친 단계들을 역순으로 거치면서 패킷을 하나씩 벗겨내 최종적으로 HTTP메시지를 목적지(주로 서버)의 어플리케이션 계층으로 전달한다. 요청된 사항에 대해 서버에서 응답을 HTTP메시지로 전송하고 위의 절차를 다시 응답이 완료될 때 까지 실행한다.
각 계층에서 사용되는 프로토콜의 특징을 살펴보자.
HTTP의 특징은 클라이언트-서버 구조, 무상태성(Stateless), 비연결성(Connectionless)으로 대표된다. 이전 글에서 언급했던 2티어 아키텍쳐가 클라이언트-서버 구조에 해당한다. 더 확장할 수 있지만 가장 기본적인 구조인 것이다. 그렇기 때문에 네트워크통신의 양 끝단에 클라이언트와 서버가 존재하고 이 둘 사이의 통신은 HTTP메시지를 사용해 교환한다.
무상태성은 통신을 하고 있는 상태를 저장하지 않는것을 뜻한다. 예를 들어, 클라이언트에서 보낸 요청을 1서버에서 받아 응답을 하는 중간에 1서버와의 통신이 끊길 경우 1서버와 통신하는 상태를 저장했을 때 요청이 취소되고 다시 요청을 보내야한다. 왜냐하면 2서버로 돌려 연결을 하려해도 1서버와 현재까지 진행된 응답 상황을 1서버에 저장하였기 때문에 통신이 끊어졌을 때는 그 상황도 모두 없어지게되어 2서버와는 처음부터 다시 진행을 해야하는 것이다. 하지만 무상태성을 가지고 있다면 이미 필요한 데이터를 다 담아서 보내기 떄문에 1서버와의 연결이 끊겼을때 2서버와 연결을 하여 남은 응답처리를 진행해 성공적으로 응답을 할 수 있다.
비연결성의 경우 현재는 HTTP 지속연결 (Persistent Connections)로 문제를 해결했고 HTTP/2와 HTTP/3에서 더 많은 최적화를 해내었다. 기본적으로 HTTP는 연결을 유지하지 않는 모델이다. TCP와 IP의 경우에는 기본적으로 연결을 유지한다. 때문에 요청이 없더라도 연결을 유지하기 때문에 서버의 자원소모가 계속된다. 이러한 단점을 극복하기위해 나온 프로토콜이 HTTP인 것이다. 실제로 요청을 주고 받을 때만 연결을 유지하고 응답을 한 경우 연결을 끊는다. 이러한 특징은 트래픽이 많지않고 빠른응답을 제공해야하는 경우 효율적으로 작동한다. 하지만 트래픽이 많아지고 서비스규모가 클 때에는 비효율적이게 된다. 그래서 보완된 것이 HTTP지속연결이다. HTTP초기 비연결성의 경우 웹페이지를 구성하는 html, css, js 파일을 요청하기위해서 각각 따로 요청을 해서 받아왔다. 하지만 트래픽이 많아지면서 이는 성능의 저하를 불러왔고 연결을 유지해 순간에 필요한 모든정보를 받아온 후 연결을 끊는 방식을 취해 단점을 극복해 내었다.
TCP와 UDP는 서로 상반된 기능을 한다. TCP의 특징은 연결지향, 데이터 전달 보증, 순서 보장, 신뢰성이 있다. 가장 대표적인 특징인 연결지향은 3 way handshake를 사용한다. 3 way handshake의 연결방식은 클라이언트에서 서버에 SYN패킷을 보내 접속을 요청한다. 서버는 이 요청을 받고 요청을 수락하는 ACK(승인)와 SYN을 발송한다. 클라이언트는 ACK를 다시 발송한다. 이제 클라이언트와 서버가 연결이 되었기 떄문에 데이터를 주고 받을 수 있다. 만약 서버가 꺼져있다면 SYN을 받을 수 없어서 ACK와 SYN 응답이 없기 때문에 데이터를 주고 받을 수 없다. 이러한 특징은 데이터 전달을 보증하기도 한다. 만약 패킷이 순서대로 도착하지 않았다면 TCP세그먼트에 있는 정보를 토대로 다시 패킷전송 요청을 할 수 있다.
UDP는 기능이 거의 없는 단순한 프로토콜이다. 그렇기 때문에 TCP보다 신뢰성은 낮지만 보다 빠른 데이터 송수신 속도를 보장한다.
IP는 IP주소를 사용해 서로 통신할 호스트들을 연결해 주는 역할을 한다. 택배를 보낼 때 보내는 사람과 받는 사람의 주소를 적어 보내는 것 처럼 보내려는 요청을 패킷에 싸서 보내는 측 IP주소와 받는 측 IP주소를 같이 적어 보낸다. 가장 기본적인 통신이지만 한계가 있다. 비연결성과 비신뢰성인데, 비연결성은 서버가 끊기는 등의 서버 측 상황에 상관없이 무조건 패킷을 전송한다. 비신뢰성은 클라이언트와 서버가 직접연결이 되어있지 않는 한 중간 노드들을 거쳐 전송되는데 중간에 길이 끊겨버리게 되어서 패킷전송이 불가능하게 되더라도 클라이언트는 이를 알 수 있는 방법이 없다. 그래서 이와같은 한계를 보완하기 위해 TCP가 나온 것이다.
어느정도 요약을 해보자면 HTTP메시지는 실질적으로 서버에 요청하는 내용과 그에 응답하는 답장을 담고 있다. TCP 패킷으로 이 메시지를 소포처럼 포장하고 이 소포의 보낸이와 받는이의 주소는 IP주소로 작성한다. TCP는 마치 등기우편과 같이 내가 보내는 소포의 상태를 확인할 수 있게 한다. 더 나아가 소포를 받았을 경우 클라이언트 측에 알려주고 소포를 열 수 있도록 해준다.
'CS' 카테고리의 다른 글
| AWS배포 (0) | 2021.07.07 |
|---|---|
| HTTP/네트워크 (0) | 2021.07.04 |
| 자료구조) 2. 1) Graph (0) | 2021.05.19 |
| 자료구조) 1. Stack, Queue (0) | 2021.05.16 |
| 클래스와 객체지향프로그래밍 (0) | 2021.05.10 |