1. 우리가 사용하는 인터넷은 어떻게 연결되어 있는가?
보통 개발 공부를 하며 배우는 서버와 클라이언트의 관계는 "클라이언트에서 요청하면 서버에서 데이터를 준다"가 끝이지만 서버와 클라이언트는 당연스럽게도 1:1로 직렬 연결되어 있지 않다.
그 사이에는 수많은 링크(랜선)과 노드(교환기)가 자리하고 있는데 그 다양한 형태를 위 그림에서 확인할 수 있다.
일반적으로 우리가 볼 수 있는 네트워크 토폴로지는 위의 그림 중 Star와 Mesh일 것이다.
스타형(성형)은 중앙에서 모든 인터넷을 관리하는 형태로 우리가 집에서 네트워크를 구성하면 대부분 이러한 모양새를 가지게 된다.
ex ) 공유기 -> 컴퓨터, 휴대폰, 프린터 ..
그리고 우리가 평상시에 사용하는 인터넷은 Mesh형으로써 여러 링크와 노드가 연결되어 있기 때문에 중간에 어떤 링크 혹은 노드에 문제가 생기더라도 다른 노드를 통해 통신 가능게 설계되어 있다.
참고로 새삼스럽지만 우리가 미국과 인터넷이 연결되는 것은 인터넷 선이 미국까지 연결되어 있기 때문이다.
궁금하면 해저터널 지도를 확인해보자. https://www.submarinecablemap.com/
2. 인터넷 프로토콜 스택
인터넷 프로토콜 스택은 네개의 계층으로 나눌 수 있다.
1. 애플리케이션 계층(Application) : HTTP, FTP, DNS, bitTorrent, SSH, RTP, IMAP, POP3, SMTP ...
>> 프로토콜은 여러 종단 시스템에 분산되어 있어서, 한 종단 시스템에 있는 애플리케이션이 다른 애플리케이션과 정보 패킷을 교환하는데 이 프로토콜을 사용한다. 애플리케이션 계층에서의 이 정보 패킷을 Message라고 한다.
쉽게 말하면 전송할 패킷을 생성하는 계층이다.
ex ) 프로그램이 생성한 메세지를 SOCKET 라이브러리를 통해 전달
2. 전송 계층(Transport) : TCP, UDP, DCCP, SCTP ...
>> 클라이언트와 서버간 애플리케이션 계층 Message를 전송하는 서비스를 제공한다. 대표적으로 TCP와 UDP라는 프로토콜이 존재한다.
ex ) TCP 정보 생성, 데이터 포함
3. 인터넷 계층(Internet) : IP (IPv4, IPv6)
>> 인터넷 계층으로 Message(패킷)이 전달되면, 인터넷 계층에서는 Packet에 출발지와 목적지 IP Address에 대한 정보를 추가함으로써 패킷이 어디로 가야하는지 설정해준다.
ex) IP패킷 생성, TCP정보 및 데이터 포함
4. 네트워크 인터페이스 계층 (Network Access) : 이더넷, Wi-Fi, 토큰링, ATM, FDDI..
>> 네트워크 상의 호스트 혹은 노드를 연결하기 위해 사용되는 네트워크 구성 요소이다.
이중 가장 익숙할만한 IP에 대해 알아보자.
2-1. IP (Internet Protocol)
인터넷 프로토콜(IP, Internet Protocol)은 송신 호스트와 수신 호스트가 패킷 교환 네트워크(패킷 스위칭 네트워크, Packet Switching Network)에서 정보를 주고받는 데 사용하는 정보 위주의 규약(프로토콜, Protocol)이며, OSI 네트워크 계층에서 호스트의 주소지정과 패킷 분할 및 조립 기능을 담당한다. 줄여서 아이피(IP)라고도 한다.
<wikipedia>
기본적으로 우리가 네트워크를 통해 데이터를 전달하면 IP에서 패킷을 조립하여 지정 IP Address로 전송한다.
그런데 IP는 비신뢰성이라는 특징을 가지고 있기 때문에 IP 프로토콜만으로는 원활한 인터넷 사용이 불가능하다.
비신뢰성이란 ?
: Internet Protocol은 오직 패킷이나 데이터그램을 보내기만 할 뿐 그 흐름에 관여하지 않는다.
따라서 패킷을 받을 대상이 존재하지 않거나 서비스 불능 등의 상태여도 클라이언트는 그것을 알지 못하고 데이터를 계속 전송하게 된다. 따라서 데이터가 유실되거나 손상될 수 있다.
또한 같은 IP Address를 사용하는 기기에서 여러 어플리케이션을 실행하고 있다고 가정해보자. (사실 가정이 아니라 우리는 늘 그렇게 기기를 사용하고 있다.) 오직 Internet Protocol만 통해서 우리가 네트워크 통신을 한다면 IP Address로 전송 받은 데이터를 어떤 어플리케이션으로 입력해야할지 구별할 수 없을 것이다.
이런 한계를 극복하기 위해서 TCP, UDT가 탄생했다.
TMI - 이렇게 인터넷이 급속도로 발전하게 된 것은 군사적인 이유였다고 한다. 궁금하면 찾아보삼.
2-2. TCP (Transmission Control Protocol)
전송 제어 프로토콜(Transmission Control Protocol, TCP, 문화어: 전송조종규약)은 인터넷 프로토콜 스위트(IP)의 핵심 프로토콜 중 하나로, IP와 함께 TCP/IP라는 명칭으로도 널리 불린다. TCP는 근거리 통신망이나 인트라넷, 인터넷에 연결된 컴퓨터에서 실행되는 프로그램 간에 일련의 옥텟을 안정적으로, 순서대로, 에러없이 교환할 수 있게 한다. TCP는 전송 계층에 위치한다. 네트워크의 정보 전달을 통제하는 프로토콜이자 인터넷을 이루는 핵심 프로토콜의 하나로서 국제 인터넷 표준화 기구(IETF)의 RFC 793에 기술되어 있다.
<wikipedia>
TCP는 데이터 손실에 대한 신뢰성이 높기 때문에 가장 범용적으로 사용되는 프로토콜이다. 대다수의 네트워크 프로그램은 TCP를 기반으로 통신한다고 봐도 무방하며 TCP와 IP는 전혀 별개의 것임에도 불구하고 TCP/IP라고 묶어서 표기하는 경우를 많이 볼 수 있다.
TCP는 다음과 같은 특징을 가지고 있다.
1. 연결 지향
: 아래의 그림을 보면 이해하기 쉬울 것이다.
서버가 먼저 소켓을 열어놓은 상태로 대기하고 있다가 클라이언트가 연결을 요청한다고 SYN을 보내면 서버에서는 연결할 수 있는 소켓을 생성한 뒤 클라이언트에게 SYN와 ACK를 보낸다. 그러면 클라이언트는 다시 한 번 ACK를 보냄으로써 정상적으로 응답 받았다는 사실을 서버에게 다시 전달한다. (TCP는 항상! 확인 응답을 거친다)
쉽게 표현하면 다음과 같다.
클라이언트 : 서버야 연결해도 되니?
서버 : 어어.. 잠시만.. 어어 됐다 됐다 확인해보삼
클라이언트 : ㅇㅋㅇㅋ 잘됐음 고마워 ㄱㅅㄱㅅ
2. 신뢰성 보장과 흐름 제어
: Internet Protocol이 패킷을 나눠서 보내는 것 때문에 데이터의 순서가 보장되지 않는다는 것을 알고 있을 것이다. 물론 TCP를 사용해도 그 부분은 변함 없지만 데이터를 보낼 때 내부적으로 데이터에 순서를 표기해서 보낸다.
그러면 받는 쪽에서는 해당 데이터를 받다가 순서가 다르게 데이터가 도착한다면 데이터를 순서에 맞게 다시 보내라고 요청한다.
또한 이렇게 확인응답(Acknowledge) 과정에서 전송이 똑바로 유실되지는 않았는지, 서버 상태가 문제가 있는 것은 아닌지 체크할 수 있다.
TCP의 특징 두가지를 읽어보면 확실히 왜 TCP가 가장 범용적으로 사용되는지 이해할 수 있을 것이다.
다만 항상 장단이 존재하는 법.. TCP는 계속해서 응답을 받아야하고 데이터 용량이 증가하여 수신 속도가 떨어진다는 단점이 있다.
실제로 이러한 단점 때문에 UDP를 TCP처럼 사용하려는 시도가 이어지고 있으며 HTTP 중 가장 최신 버전인 HTTP3는 UDP를 채택했다. 그러면 UDP가 무엇인지도 알아보자.
2-3. UDP ( Unreliable Damn Protocol User Datagram Protocol)
UDP는 TCP의 신뢰성 기능을 모두 빼버렸다고 생각하면 된다.
IP adress와 PORT 넘버, 그리고 체크섬만 존재하는 경량 버전이다.
받는 쪽이 어떤 상태인지, 받긴 받았는지 전혀 궁금해하지 않고 당연히 순서도 보장하지 않는다.
대신 그만큼 속도가 빠르기 때문에 어느 정도 데이터가 유실되어도 크게 문제가 없는 스트리밍 분야, VoIP, mVoIP 서비스 등에서 사용되고 있다.
또한 TCP의 신뢰성 작업은 성능 손실이 너무 크기 때문에 UDP를 적절히 수정하여 TCP의 기능을 구현하려는 노력이 계속되고 있다.
물론 당장 더 중요한 것은 범용적으로 쓰이고 있는 TCP이다.
2-4. DNS ( Domain Name System )
마지막으로 애플리케이션 계층에서 한 자리 차지하고 있는 DNS에 대해 알아보자.
도메인 네임 시스템(Domain Name System, DNS)은 호스트의 도메인 이름을 호스트의 네트워크 주소로 바꾸거나 그 반대의 변환을 수행할 수 있도록 하기 위해 개발되었다. 특정 컴퓨터(또는 네트워크로 연결된 임의의 장치)의 주소를 찾기 위해, 사람이 이해하기 쉬운 도메인 이름을 숫자로 된 식별 번호(IP 주소)로 변환해 준다. 도메인 네임 시스템은 흔히 "전화번호부"에 비유된다. 인터넷 도메인 주소 체계로서 TCP/IP의 응용에서, www.example.com과 같은 주 컴퓨터의 도메인 이름을 192.168.1.0과 같은 IP 주소로 변환하고 라우팅 정보를 제공하는 분산형 데이터베이스 시스템이다.
어렵게 이야기하자면 한도 끝도 없이 어려울 수 있겠지만 말 그대로 전화번호부다. 우리가 대부분의 연락처를 외우지 않고 등록된 번호의 이름만 눌러서 전화를 거는 것과 같다.
IP주소는 외우기 힘들 뿐더러 변경될 가능성도 있다. 따라서 사람이 이해할 수 있는 문자열을 입력하면 이를 등록된 IP Address로 연결해주는 것이다.
지금까지 배운 것들을 바탕으로 웹 브라우저의 요청 흐름을 심플하게 정리하자면 다음과 같다.
1. 서버의 DNS와 PORT 정보를 읽는다.
2. HTTP 요청 메세지를 생성한다.
3. 브라우저가 HTTP 메세지를 생성하고 SOKET 라이브러리를 통해 TCP/IP를 연결한 뒤 Internet Protocol에서 패킷을 생성해서 보낸다.
4. 서버에서 HTTP를 분석해서 요구한 결과물을 다시 브라우저로 전송한다.
5. 브라우저에서 결과물이 렌더링된다.
'CS ﹒ Algorithm > (구)Network' 카테고리의 다른 글
네트워크 (6) HTTP 헤더 - 1 - 종류와 사용 (0) | 2022.07.22 |
---|---|
네트워크 (5) 자주 볼 수 있는 상태코드 모음 (0) | 2022.07.16 |
네트워크 (4) HTTP 메서드의 종류와 속성 (0) | 2022.07.12 |
네트워크 (3) HTTP의 개요와 특징 (0) | 2022.07.10 |
네트워크 (2) URI, URL, URN은 각각 무엇이고 어떤 차이가 있는가 (0) | 2022.07.07 |