on
인터넷 네트워크
김영한님의 모든 개발자를 위한 HTTP 웹 기본 지식을 공부하고 정리하는 포스트입니다.
인터넷 네트워크
인터넷 통신
인터넷에서 컴퓨터 둘은 어떻게 통신할까? 클라이언트와 서버가 바로 옆에 있다면 케이블을 연결해서 바로 주고 받으면 된다. 하지만 서로 멀리 떨어져 있다면? 인터넷 망을 통해서 메세지를 주고 받아야 한다.
인터넷 망은 단순하지 않다. 수많은 노드와 인공위성을 거쳐서 도착하게 되는데 그 수많은 복잡한 과정을 알아보자.
IP (인터넷 프로토콜)
인터넷 프로토콜, 흔히 IP라고 부르는 것에 대해서 알아보자.
복잡한 인터넷 망을 통해서 메세지를 보내려면 최소한의 규칙이 있어야 할 것이다. 그 규칙을 가능하게 하는 것이 IP 주소라는 것이다.
예를 들어 클라이언트의 IP 주소가 100.100.100.1 이고 서버의 IP 주소가 200.200.200.2 라고 하자.
IP, 인터넷 프로토콜의 역할은 지정한 IP 주소(IP Address)에 데이터를 전달하는 일종의 규칙 같은 것이다. 데이터를 주고 받기 위해서 패킷(Packet)이라는 통신 단위를 사용하는데, 메세지를 그냥 보내는 것이 아니다.
마치 포장지에 우편 주소를 적는 것처럼 전송 데이터를 넣기 전에 출발지 IP와 목적지 IP를 적어서 데이터를 감싼다. 이렇게 해서 만든 패킷을 인터넷 망에 던지면 각 서버들은 규약을 따르기 때문에 해당 서버에 도착할 때까지 패킷을 던진다. 그렇게 던져진 패킷이 목적지에 도착하고 나서 목적지에서도 답장을 하면 동일한 과정을 거쳐 다시 돌아오는 것이다. 물론 인터넷 망이 복잡하기 때문에 이 과정에서 거치는 경로는 다를 수 있다.
그런데 이 IP 프로토콜에는 한계가 있다.
첫 번째로 비연결성이 있다. 패킷을 받을 대상이 없거나 서비스 불능 상태여도 패킷이 전송되는 것이다.
두 번째는 비신뢰성이다. 중간에 패킷이 사라지거나, 순서가 보장되지 않는 것이다.
세 번째는 프로그램 구분이다. 같은 IP를 사용하는 서버에서 통신하는 애플리케이션이 두 개 이상인 경우에 어떻게 구분되는지 알 수 없다.
이러한 문제를 해결해주는 것이 바로 TCP 프로토콜이다.
TCP, UDP
먼저 인터넷 프로토콜 스택의 4계층을 보자.
이렇게 각 계층이 쌓여있는데, TCP는 IP 계층 위에 살짝 얹어서 보안을 해준다고 보면 된다.
서버에게 Hello, world라는 메세지를 전달한다고 할 때 다음과 같은 순서를 거치게 된다.
SOCKET 라이브러리를 통해서 OS 계층에 메세지를 넘기면 TCP 정보로 메세지를 감싼다. 그리고 감싸진 메세지를 IP에게 넘겨주면 이전에 확인했던 것처럼 패킷을 만든다. 이렇게 만들어진 패킷이 네트워크 인터페이스, 랜 카드를 통해서 나갈 때 Ethernet frame으로 감싸져서 나가게 된다.
이전의 IP 패킷은 출발지 IP, 목적지 IP 등으로 전송 데이터를 감싸고 있었다. 하지만 TCP/IP는 IP 패킷 내부에 TCP 세그먼트, TCP와 관련된 정보가 들어간다. 출발지 PORT, 목적지 PORT, 전송 제어, 순서, 검증 정보 등이 들어가게 되고 이러한 정보들로 인해 문제가 해결된다.
TCP 특징
TCP : 전송 제어 프로토콜(Transmission Control Protocol)
- 연결지향 : TCP 3 way handshake (가상연결)
- 데이터 전달 보증
- 순서 보장
이러한 특징을 가지고 있기 때문에 신뢰할 수 있는 프로토콜이고 현재는 대부분 TCP를 사용한다. 각각의 특징을 살펴보자.
1. TCP 3 way handshake
TCP 프로토콜로 연결하면 먼저 SYN이라는 메세지를 서버에 보낸다. 그러면 서버측에서 수신을 했다는 뜻으로 ACK를 포함하여 SYN + ACK1를 전달하면 클라이언트는 다시 이해했다는 뜻으로 ACK를 돌려보낸다. 이렇게 3번 주고 받고 연결이 되고나면 데이터를 주고받게 된다. 요즘은 최적화가 되어서 클라이언트가 ACK를 보낼 때 데이터 전송이 가능하다.
여기서 중요한 점은 실제로 연결된게 아닌 개념적으로 연결된 것이다. 단지 SYN과 ACK을 주고 받았기 때문에 연결이 되었다고 논리적으로 판단하는 것이다. 즉, 전용 랜선이 보장되는 것은 아니다.
2. 데이터 전달 보증
TCP로 연결했다면 데이터를 전송했을 때 서버측에서 데이터를 잘 받았다고 답장을 보내준다. 이를 통해서 메세지가 잘 전달되었는지 확인할 수 있는 것이다.
3. 순서 보장
패킷을 1, 2, 3 순으로 전달했는데 서버측에서 1, 3, 2로 받았을 경우 서버는 3, 2를 버리고 2번부터 재전송을 요구한다. 물론 서버 측에서 로직적으로 최적화가 가능하지만 기본적인 방식은 이렇다.
이것이 가능한 것은 TCP 내부에 정보가 들어있기 때문이다.
UDP
UDP는 TCP와 같이 IP 위에 있는 계층인데, 하얀 도화지와 같은 것이다. 즉, 기능이 거의 없다. 마치 IP와 같은 녀석인데, 다른 점은 PORT와 체크섬 정도만 추가되어있다.
그렇다면 UDP를 왜 쓸까? TCP는 분명히 좋은 것이지만, 데이터 양도 크고 전송속도도 빠르게 만들기 어렵다. 즉, 원하는대로 만들 수 없다.
이 때 애플리케이션 레벨에서 원하는 것을 만들어서 UDP를 통해서 사용하는 것이다.
PORT
IP 프로토콜의 문제점 중 한 번에 둘 이상의 연결이 있을 때 어떻게 처리할 것이냐는 문제가 남았다. 클라이언트에서 한 번에 여러 개의 서버와 통신하게 되면 패킷이 무수히 날아올텐데 이게 어디서 온 패킷인지 알 수도 없고 보낼 때도 어디로 보내는지 알 수 없다.
TCP/IP를 보면 출발지 PORT와 목적지 PORT라는 것이 있다. IP는 목적지를 찾는 것이고, 내부에서 돌아가는 애플리케이션을 구분하는 것이 PORT라고 생각하면 된다.
즉, 같은 IP 내에서 프로세스를 구분해주는 것이 PORT이다. 쉽게 생각하기 위해서 예를 들자면 IP는 아파트이고, PORT는 동호수인 것이다.
실제로 사용되는 PORT는 예시는 다음과 같다.
- 0 ~ 65535 : 할당 가능한 PORT
- 0 ~ 1023 : 잘 알려진 포트, 사용하지 않는 것이 좋음
- 20, 21 : FTP
- 23 : TELNET
- 80 : HTTP
- 443 : HTTPS
DNS
지금까지 IP를 가지고 통신을 했다. 하지만 IP는 기억하기도 어렵고, 변경될 수도 있다. 이러한 것을 위해 도메인 네임 시스템(Domain Name System), DNS라는 것이 있다.
일종의 전화번호부 같은 것으로 도메인 명을 IP 주소로 바꾸는 것이다. DNS 서버에 도메인을 구매해서 등록하고 도메인 명으로 검색하면 DNS 서버가 IP 주소를 알려준다.
정리
복잡한 인터넷 망에서 메세지를 보내기 위해(인터넷 통신을 하기위해) 우리는 IP 프로토콜을 사용한다. 하지만 이것만으로는 메세지가 잘 전달되었는지 신뢰하기 어렵고, 메세지의 순서도 보장 받을 수 없다. 이를 해결하기 위해 TCP, UDP라는 것을 사용하며 TCP가 신뢰성과 순서를 보장해주고 여러 서버와 통신할 때 각각을 구분하기 위해 PORT라는 정보가 있다. 마지막으로 외우기 어렵고 변할 수도 있는 IP를 쉽게 알기 위해서 DNS를 사용한다.
1 : SYN는 접속 요청, ACK는 요청 수락이라는 의미를 가지고 있다.
Comments
CS 의 다른 글
-
HTTP 헤더 - 캐시와 조건부 요청 03 Jan 2022
-
HTTP 헤더 - 일반 헤더 26 Dec 2021
-
HTTP 상태코드 20 Dec 2021
-
HTTP 메서드 활용 17 Dec 2021
-
HTTP 메서드 12 Dec 2021
-
HTTP 기본 09 Dec 2021
-
URI와 웹 브라우저 요청 흐름 08 Dec 2021
-
인터넷 네트워크 06 Dec 2021
-
Single LinkedList 01 Oct 2021
-
ArrayList 24 Sep 2021
-
List Interface(리스트 인터페이스) 23 Sep 2021
-
자바 컬렉션 프레임워크 20 Sep 2021
-
면접 기초 질문 리스트 31 Aug 2021
-
인프라 기초 총정리 14 Aug 2021
-
하드웨어와 네트워크 기초 지식 03 Aug 2021
-
오버레이 네트워크(Overlay Network) 02 Aug 2021
-
이건 꼭 알고 가자! 면접 출제 빈도가 높은 질문들 19 May 2021
-
1분 자기소개 19 May 2021
-
백엔드 개발자 면접 / 학습내용 15 Feb 2021
-
너비 우선 탐색(breadth-first search, BFS) 22 Oct 2020
-
깊이 우선 탐색(depth-first search, DFS) 10 Oct 2020
-
크리티컬 섹션(Critical Section) 10 Sep 2020
-
삽입 정렬(Insertion Sort) 04 Sep 2020
-
선택 정렬(Selection Sort) 04 Sep 2020
-
거품 정렬(Bubble Sort) 04 Sep 2020
-
LRU 알고리즘 31 Aug 2020
-
Stack, Queue 29 Aug 2020
-
awk 명령어 사용법 24 Aug 2020
-
grep 명령어 사용법 23 Aug 2020
-
DNS의 이해 14 Aug 2020
-
대칭키와 공개키 10 Aug 2020
-
HTTP & HTTPS 10 Aug 2020