...
인터넷 통신은 어떻게 이루어지는가
- 클라이언트에서 다른 클라이언트(컴퓨터)로 데이터를 보낼경우 위치에 따라 위성, 해저광케이블, 기타 통신서버와 같은 인터넷망을 거쳐서 상대 컴퓨터에 도달하게 된다.
- 그런데 인터넷 망은 단순하지 않아, 아래 그림과 같이 수 많은 중간 노드를 거쳐서 서버 컴퓨터에게 도착한다.
- 이렇게 웹 통신 과정이 어떤 규칙으로 목적지까지 안전하게 도착하는지의 이해를 하기 위해 이제부터 배울 IP, UCP, DNS 프로토콜 지식들을 알아야 한다.
[ 노드 ]
네트워크를 중간에서 연결해주는 서버라고 보면 된다.
네트워크의 기본요소인 지역 네트워크에 연결된 컴퓨터와 그 안에 속한 장비들을 통틀어 하나의 노드라고 부르며, 재분배 지점 또는 통신 종단점이다.
IP (인터넷 프로토콜)
우리가 인터넷을 사용하면 한번쯤은 들어본 아이피(IP)란 송신/수신 클라이언트에서 정보를 주고받을 때 사용하는 정보 위주의 프로토콜을 말한다.
쉽게 말하자면 우리가 배달을 시킬 때 시/군/구 도로명 주소가 필요하듯이 방대한 네트워크 세상에서 특정 호스트에 데이터를 보내기 위해서는 도착할 주소가 필요한데 이를 IP라 부른다고 이해하면 된다.
이처럼 IP의 역할은 패킷이라는 통신 단위로 지정한 IP 주소에 데이터를 전달하는 것에 목적을 둔다.
IP 패킷 정보
위에서 IP를 통해 데이터를 상대 클라이언트에 보낼때 패킷이라는 특수한 데이터 구조로 보낸다고 설명했었다.
한마디로 배달을 보낼때 뾱뾱이로 감싸고 종이박스로 포장에서 보내듯이, 인터넷 데이터를 패킷에 포장하여 인터넷 망을 통해서 전달한다고 생각하면 된다.
패킷(Packet)은 패키지(수화물) + 버킷(덩어리)의 합성어이다.
아이피 패킷은 다음과 같은 데이터로 이루어져 있다고 보면 된다.
- 전송하고자 하는 데이터의 한 블록(payload)
- 주소지 정보(발신지 주소, 목적지 주소)
- Header, IPv6와 같이 인터넷 망이 패킷을 목적지까지 전달하는데 필요한 관리 정보
1. 클라이언트 패킷 전달
- 규칙에 맞춰 보내면 노드끼리 서로 주고 받으며 도착지에 도착하게 된다.
2. 서버 패킷 전달
- 그럼 데이터를 받은 상대방도 같은 방식으로 잘 받았다는 내용을 전달한다.
IP 프로토콜의 한계
하지만 단순히 IP 주소를 통해 데이터를 보내는 데에는 한계가 있다.
중간에 패킷이 유실될 수 있으며, 만일 상대 컴퓨터가 어떠한 에러가 생겨 받을수 없는 상황이어도 무작정 보내거나, 패킷들이 순서대로 도착한다는 보장도 없기 때문이다.
1. 비연결성
- 패킷을 받을 대상이 없거나 서비스가 불능 상태여도 패킷을 전송할 수 있다.
- 클라이언트가 서버가 살아있는지 죽어있는지 모르는 상태에서 그냥 보낸다. 따라서 클라이언트 입장에선 대상 서버가 이 패킷을 받을 수 있는 상태인지 모르게 된다.
2. 비신뢰성 - 패킷 소실
- 패킷이 중간에 소실될 경우 대처할 방법이 없어 문제가 생긴다.
3. 비신뢰성 - 패킷 순서 보장 X
- 패킷이 순서가 보장되지 않을 수 있다.
예를들어 채팅 메세지를 보낸다고 가정하자.
만일 메세지 용량이 보통 1500byte가 넘으면 한 번에 너무 많은 걸 보내면 부담스럽기 때문에 끊어서 보내게 된다.
"Hello world!' 라는 3000byte 메세지를 보낸다고 하면, "Hello"가 1500byte, "world!"가 1500byte 두개의 패킷을 끊어서 보낸다고 보면 된다.
그런데 패킷들이 노드를 타는데 패킷마다 노드 타는 경로가 다르게 될 수있다. 그러면 도착하는 순서가 상이하게 된다.
4. 도착해도 프로그램 구분 불가
- 단순히 목적지 주소(IP)만 알고 있고 세부적으로 어디인지는 구체적으로 알지 못한다는 문제점도 있다.
- 예를들어 같은 IP를 사용하는 서버에서 통신하는 어플리케이션이 여러개일 경우 이를 구분하는 방법이 었다.
한 컴퓨터에서 롤도 하고 유튜브 뮤직을 들으며 카카오톡을 켜놓은 상태이면, 상대에게서 받은 패킷 데이터를 어느 프로그램으로 전달해야할지 애매하다.
카카오톡 메세지가 롤 채팅창에 보내버리게 될 수도 있는 것이다.
TCP (Transmission Control Protocol)
- 전송 제어 프로토콜(Transmission Control Protocol)
- 데이터 전달 보증하고 순서를 보장하는 신뢰할 수 있는 프로토콜을 일컬음
- 컴퓨터끼리 ‘보냈습니다’, ‘도착했습니다’라고 서로 확인 메시지를 보내면서 데이터를 주고받음으로써 통신의 신뢰성을 확립. 한마디로 TCP는 IP의 문제를 보완해주는 녀석이라고 보면 된다.
- TCP 3 way handshake(가상 연결)으로 전송을 제어한다.
- 웹이나 메일, 파일 공유 등과 같이 데이터를 누락시키고 싶지 않은 서비스에 사용
TCP / IP 패킷 정보
- 위에서 살펴본 ip 패킷에 tcp 패킷을 집어넣어 좀더 택배 화물을 강화한 것이라고 생각하면 된다.
- 단순히 목적지 뿐만 아니라 순서, 검증, 전송 제어 정보가 들어있어, 기존 IP 패킷정보의 한계인 비신뢰성과 비연결성을 TCP 정보를 추가함으로써 한계를 극복하는 식이다.
TCP / IP 패킷 전달 과정
- 채팅 애플리케이션 프로그램에서 Socket 라이브러리 라는 것을 사용해 OS에 "Hello, world!" 라는 메시지를 넘긴다.
- 그럼 컴퓨터 운영체제쪽에서는 "Hello, world!" 라는 메시지에 TCP 정보를 씌우고(초록색), IP 정보를 또 씌운다(주황색).
- 이렇게 TCP / IP 패킷이 생성된다.
- 이 데이터가 실제 랜 카드를 통해 나갈 때는 Ethernet frame 을 포함해서 나간다(검정색). Ethernet frame 에는 실제 물리적인 정보까지 들어있다.
TCP 3 way handshake
- 상본격적으로 상대 클라이언트와 연결되기 전에 가상 연결을 해서 패킷으로 보내서 확인하는 동작
- 주의할 점은 진짜 연결된 것이 아니라, 논리적으로 연결이 된거지 실제로 연결된 게 아니다.
- 클라이언트가 SYN(접속 요청)이라는 메시지를 서버에게 접속하는 거 수락해달라고 요청한다.
- 서버에서는 접속을 수락하겠다고 ACK(요청 수락)라는 메시지를 클라이언트에게 보내면서, 서버 역시 접속을 수락해달라고 SYN를 보낸다.
- 클라이언트도 접속을 수락하겠다고 서버에게 다시 ACK를 보낸다.
- 연결이 되고 나면 데이터를 전송한다. (요즘은 최적화가 잘 되서 마지막 ACK를 보낼 때 같이 데이터도 전송하는 편)
1. 데이터 전달 보증
- 클라이언트에서 데이터를 전송하면 서버에서 데이터가 잘 왔는지에 대한 응답을 해줘서 데이터 전달을 보증한다. (IP는 그냥 패킷을 보내고 끝)
- 데이터를 전송할 때 서버에서 잘 받았다고 다시 보내주기 때문에, 메시지가 잘 전달 됐는지 안됐는지 알 수 있게 된다.
2. 순서 보장
- 메세지 용량이 커서 잘라서 1, 2, 3번 순서대로 보냈는데, 서버에서 1, 3, 2번 순서로 도착을 해버렸다.
- 잘못 전송된 패킷을 기준으로 다시 보내라고 요청을 해서 다시 패킷을 받는다.
- 그럼으로써 순서가 중요한 패킷 데이터에 대해서 순서를 보장할 수 있다.
이렇게 패킷을 순서대로 제어를 할 수 있는 이유는 TCP 데이터 안에 전송 제어, 순서, 정보들이 있기 때문이다.
그래서 TCP는 신뢰할 수 있는 프로토콜이라고 얘기한다.
UDP (User Datagram Protocol)
- 사용자 데이터그램 프로토콜(User Datagram Protocol)
- 비 연결지향적 프로토콜로서, 데이터 전달 보증하지 않고 순서 보장하지도 않는다.
- TCP에 비교해서 기능이 거의 없어 단순하지만 오로지 빠르게 패킷을 보내는 것이 주 목적
- 데이터를 보내면 그것으로 끝이므로 신뢰성은 없지만 확인 응답과 같은 절차를 생략할 수 있으므로 통신이 빠르기 때문에 도메인, 실시간 동영상 스트리밍 서비스에서 사용된다.
- IP와 거의 같다고 보면되고, IP 정보에 PORT와 체크섬(메시지 검증해주는 데이터) 정도만 추가된 형태
- IP에 기능이 거의 추가되지 않은 하얀 도화지 같은 상태이기 때문에 최적화 및 커스터마이징이 용이하다.
- 필요로 하는 기능만 추가할 수 있다.
- 애플리케이션에서 추가 최적화가 필요하다면 UDP 위에 애플리케이션 레벨에서 뭔가를 만들어내면 된다.
TCP vs UDP 비교표
TCP | UDP |
연결지향형 프로토콜 | 비 연결지향형 프로토콜 |
바이트 스트림을 통한 연결 | 메세지 스트림을 통한 연결 |
혼잡제어, 흐름제어 | 혼잡제어와 흐름제어 지원 X |
순서 보장, 상대적으로 느림 | 순서 보장되지 않음, 상대적으로 빠름 |
신뢰성 있는 데이터 전송 - 안정적 | 데이터 전송 보장 X |
세그먼트 TCP 패킷 | 데이터그램 UDP 패킷 |
HTTP, Email, File transfer 에서 사용 | 도메인, 실시간 동영상 서비스에서 사용 |
PORT
IP를 이용해 방대한 인터넷 세계의 노드들을 거쳐 상대방 컴퓨터 주소로 갈수 있게 되고, TCP를 통해 상대방이 잘 받았는지 신뢰성도 보장했다.
하지만 여기서 한가지 이슈가 발생한다.
보통 컴퓨터를 할때 카카오톡도 하고 게임도 하며 웹서핑도 하는, 여러 애플리케이션을 띄우고 이용한다.
만일 채팅메세지를 상대방에게 보냈는데 IP정보를 통해 상대방 클라이언트에 도착했더니 어느 어플리케이션에 데이터를 전달해야할지 정보가 없어 애매한 것이다.
좀 더 실생활에 비유하자면 쇼핑몰에서 콜라 한박스를 주문했는데, 집 주소를 현대 아파트 101동 이라고만 작성한다면, 택배기사는 현대 아파트 101동 건물까진 올 수있겠지만, 그 안에있는 수십개의 호수 중에서 어느 집에 택배를 배달해야할지 모르는 상태인 것이다.
따라서 어느 애플리케이션의 패킷인지를 구분하기 위해 포트(PORT) 내부용 주소 개념을 사용한다고 보면 된다.
즉, 인터넷 프로토콜(IP)는 상대 클라이언트 목적지만을 가지고 있고, 컴퓨터 안의 수십개 어플리케이션중 어느 프로그램에 전달해야 하는지에 대한 목적지 정보가 포트(PORT)라고 보면 된다.
패킷에서의 포트 위치
- 이러한 포트 정보는 TCP 패킷에 출발지 PORT와 목적지 PORT로 기재 되어 있다.
포트 번호 종류
- 포트 번호 범위 : 0 ~ 65535
- 이 6만여개의 포트번호중에 0 ~ 1023 번호는 이미 전역으로 사용되어지고 있는 포트이다.
- FTP - 20, 21
- TELNET - 23
- HTTP - 80
- HTTPS - 443
DNS (도메인)
인터넷 통신을 위해 IP가 필요하다고 했는데, 이 IP에는 몇가지 단점이 있다.
먼저 숫자로만 이루어진 주소는 사람이 읽고 기억하기도 힘들어 가독성이 매우 떨어진다. 또한 IP는 언제든지 변경될수 있다.
따라서 중간에 전화번호부 같은 개념을 둬서, 도메인 명을 등록하면 IP로 변환하여 상대방 클라이언트로 전달할 수 있는 도메인 네임 시스템(DNS)가 탄생하였다.
우리가 브라우저에 www.naver.com 을 치면 우리가 굳이 네이버 회사의 서버 주소 숫자를 외울 필요없이 바로 네이버 페이지에 접속할수 있는 것 처럼 평소에도 우리는 도메인을 통해 인터넷 통신을 해온 것이다.
# 참고자료
모든 개발자를 위한 HTTP 웹 기본 지식 - 김영한
이 글이 좋으셨다면 구독 & 좋아요
여러분의 구독과 좋아요는
저자에게 큰 힘이 됩니다.