CS

인터넷 네트워크

chillmyh 2024. 4. 4. 20:37

 

이 글은 스터디를 진행하며 '모든 개발자를 위한 HTTP 웹 기본 지식 (김영한)' 강의를 듣고 정리한 글입니다.

 


1. 인터넷 통신

 

서버와 클라이언트가 붙어있다면, 별문제 없이 요청과 응답을 주고받으면 될 것이다. 하지만, 서버와 클라이언트가 붙어있는 경우는 대개 없으며 대부분 인터넷을 거쳐 통신을 한다. 이 경우, 인터넷 망을 통해 서버로 요청을 보내야 하는데, 인터넷의 수많은 노드들을 타면서 원하는 목적지까지 메시지가 전달되며 통신하게 된다.

 

복잡한 인터넷 망을 어떻게 지나가야 메시지가 안전하게 전달되는지에 대해서는 먼저 IP(Internet Protocol)에 대해 이해해야 한다.

 

2. IP(인터넷 프로토콜)

먼저 강의를 듣다보니 프로토콜(Protocol)이라는 단어에 대해 개념 정리가 필요했다. 프로토콜은 아래와 같이 정의된다.

 

통신 프로토콜 또는 통신 규약은 컴퓨터나 원거리 통신 장비 사이에서 메시지를 주고 받는 양식과 규칙의 체계이다. 통신 프로토콜은 신호 체계, 인증, 그리고 오류 감지 및 수정 기능을 포함할 수 있다. 프로토콜은 형식, 의미론, 그리고 통신의 동기 과정 등을 정의하기는 하지만 구현되는 방법은 독립적이다. 이때문에 프로토콜은 하드웨어 또는 소프트웨어 그리고 때로는 모두를 사용하여 구현되기도 한다. - wikipedia

 

길게 적혀있지만 요약하자면 컴퓨터 사이에 메시지를 주고 받는 규칙 체계이다. 원래도 프로토콜이 외교상의 언어로써 의례나 국가간의 약속을 의미한다고 한다. 비슷한 맥락으로 인터넷 세계에서도 서로 통신은 할 수 있지만 공통된 언어가 없기 때문에 프로토콜이 그 언어의 역할을 한다고 이해하니 쉬웠다.

 

다시 IP로 돌아와서, IP란 인터넷 프로토콜(Internet Protocol)이다. 만약 hello world라는 메시지를 미국에 있는 친구에게 보내야 한다고 할때 최소한의 규칙이 필요한데 이때 IP 주소를 통해 가능해진다.

 

IP의 역할은 다음과 같다.

IP 역할
- 지정한 IP 주소(IP Address)에 데이터 전달
- 패킷(Packet)이라는 통신 단위로 데이터 전달

 

 

Hello, world! 라는 전송 메시지에 IP 패킷을 씌워, 출발지, 목적지 등의 정보를 씌워 인터넷에 던지게 되면 인터넷 망의 노드들을 타고 목적지를 찾아 목적지로 전송되게 된다. 여기서 패킷이란 패키지+버킷의 합성어로 설명해주셔서 패키징하는 것으로 이해했다.

패킷(packet, 문화어: 파케트, 소포)은 정보 기술에서 패킷 방식의 컴퓨터 네트워크가 전달하는 데이터의 형식화된 블록이다. 패킷은 제어 정보와 사용자 데이터로 이루어지며[1], 이는 페이로드라고도 한다. 패킷을 지원하지 않는 컴퓨터 통신 연결은 단순히 바이트, 문자열, 비트를 독립적으로 연속하여 데이터를 전송한다. 데이터가 패킷으로 형식이 바뀔 때, 네트워크는 장문 메시지를 더 효과적이고 신뢰성 있게 보낼 수 있다. - wikipedia

 


전송 메시지가 request되어 잘 도착했다면, 서버는 클라이언트에게 잘 받았다고 응답(response)한다. 위와 동일한 과정으로 잘 받았다고 OK라는 응답메시지를 담아 보낸다.

 

참고로 클라이언트에서 서버로 보낼때와 서버에서 클라이언트로 보낼때 인터넷 망이 복잡하기 때문에 서로 다른 곳으로 전달 될 수 있다. 이는 다음과 같은 Ip 프로토콜의 한계 때문이다.

IP 프로토콜의 한계
- 비연결성 : 패킷을 받을 대상이 없거나 서비스 불능 상태여도 패킷은 전송
- 비신뢰성 : 중간에 패킷이 사라지면? 패킷을 여러개 보냈을 때 순서대로 안오면?
- 프로그램 구분 : 같은 IP를 사용하는 서버에서 통신하는 애플리케이션이 둘 이상이면?

 

이러한 문제들을 해결해 주는 것이 TCP와 UDP이다.

 

3. TCP, UDP

먼저 TCP, UDP에 대해 설명하기 전에 인터넷 프로토콜 스택의 4계층을 알고가면 좋다.

TCP, UDP는 각각 Transmission Control Protocol, User Datagram Protocol의 약자로, 인터넷 프로토콜 4계층 중 세번째 계층인 전송 계층이다. IP 계층 위에서 보완해주는 용도라고 생각하면 된다.

 

TCP

예를들어 채팅 프로그램을 이용하여 친구에게 메시지를 전달한다고 가정해보면 위 그림과 같은 순서로 메시지가 전송이 된다.

1. [애플리케이션] 프로램이 "Hello World" 메세지 생성
2. [애플리케이션] Socket 라이브러리에서 OS 계층으로 메세지 전달 (채팅은 보통 Socket 라이브러리를 사용한다!)
3. [OS] Hello 메세지에 TCP 정보를 한번 씌움
4. [OS] 그다음 IP 관련 데이터 정보를 한번 더 씌움 (= ip 패킷)
5. [네트워크 인터페이스] 마지막으로 Ethernet Frame이 씌워져서 LAN 카드로 나감 (MAC주소 등 물리적인 주소 포함)
6. 인터넷으로 데이터 전달됨

 

 

여기서 TCP의 역할은 IP 패킷 안에 위치하여, 출발지 PORT, 목적지 PORT, 전송 제어, 순서, 검증 정보 등에 대한 정보가 들어가 IP로만 해결이 안됐던 순서 제어 등의 문제를 해결할 수 있게 된다.

 

TCP는 말그대로 전송 제어 프로토콜(Transmission Control Protocol)이므로 전송을 어떻게 할지 제어를 해주는 역할이다. 이는 신뢰할 수 있는 프로토콜이고 현재는 대부분 TCP를 사용중이다.

 

여기에는 크게 3가지 특징이 있다.

TCP 특징
- 연결지향 - TCP 3 way handshake (가상연결)
- 데이터 전달 보증
- 순서 보장

 

연결지향 - TCP 3 way handshake

대상과 통신하기 전, 정확한 전송을 보장하기 위해 상대 컴퓨터와 사전에 연결이 잘 되는지 확인하는 과정이다. 참고로 이는 클라이언트와 서버를 연결하는 수 많은 노드(서버)들은 제외하고 클라이언트와 서버만의 논리적인 연결이 되었다 이기 때문에 실제로 물리적으로 연결되었다는 것과는 다른 말이다. TCP 3 way handshake는 크게 세 단계로 나뉜다.

1. 클라이언트에서 SYN (synchronize) 메세지를 보낸다 (=연결해달라고 요청)
2. 서버에서 알았다는 뜻으로 ACK(acknowledgement)와 나도 연결해달라는 SYN 메세지를 두개 보낸다.
3. 클라이언트에서 응답을 확인했다는 뜻으로 ACK를 보낸다.

 

결국 양측 다 SYN, ACK 메시지를 각 세번에 걸쳐 보내 연결이 되었음을 확인하는 방식이다. 이 단계들을 거쳐 연결 되었음이 확인되면 그 후에 데이터를 전송한다. 연결을 확인하는 단계이므로 중간에 노드(서버)가 꺼져서 응답을 받지 못했다면 데이터는 전송하지 않는다. 다만, 최근에는 해당 과정이 최적화 되어서 3번째 ACK을 보낼 때 메시지도 같이 보내기도 한다. 

 

데이터 전달 보증

TCP/IP 에서는 TCP가 붙게 되면 데이터 전송 시 서버에서 데이터를 잘 받았다고 클라이언트에게 메시지를 보내준다. 때문에 클라이언트는 메시지가 잘 전달 됐는지 안 됐는지 확인이 가능해진다.

 

순서 보장

클라이언트에서 서버로 여러 패킷들을 전송했을 때, 서버에서 패킷을 받고 보냈던 순서와 다르면 클라이언트에게 잘못된 순서부터 다시 보내라고 메시지를 보낸다. 순서에 대한 작업은 서버측에서 최적화가 가능하지만, 기본적으로 클라이언트에게 위 그림처럼 다시 보내라고 알려준다.

 

이 특징들은 TCP 패킷 안에 출발지 PORT, 목적지 PORT, 검증 정보, 순서 등의 정보가 담겨져 있기 때문에 가능한 것이다.

 

UDP

사용자 데이터그램 프로토콜(User Datagram Protocol)로, 최근에 각광받고 있는 프로토콜이다.

이는 UDP의 다음과 같은 특징 때문이다.

UDP 특징
- 하얀 도화지에 비유 (기능이 거의 없음)
- 연결지향 - TCP 3 way handshake ❌
- 데이터 전달 보증 ❌
- 순서 보장 ❌
- 데이터 전달 및 순서가 보장되지 않지만, 단순하고 빠름
- IP와 거의 같다. PORT, 체크섬 정도만 추가

 

특징만 보면 TCP보다 기능도 없는데 왜 최근에 각광 받는다고 하는 것일까? 이는 PORT와 체크섬(메시지에 대해 맞는지 검증해주는 데이터)의 정보만 포함된 UDP는, 3 way handshake를 거치지 않기 때문에 속도가 더 빠르고, 여러 보증에 대한 단계가 생략되기 때문에 오히려 UDP의 하얀 도화지같은 특징이 장점이 되어 어플리케이션 단계에서 커스텀하여 최적화가 가능하기 때문이다.

 

실제로는 TCP가 90 몇 % 이상 점유를 했지만 시대가 바뀌어 점차 UDP가 뜨고 있는 추세라고 한다. 추가로, HTTP3 에서는 기본적으로 UDP 프로토콜을 사용한다.

 

4. PORT

포트(Port)는 뜻대로 배가 도착하는 '항구'의 뜻을 가지고 있다. 한번에 두개 이상 서버와 연결해야 할 때, IP만 보내면 어디서 오는 패킷인지 알 수가 없다. 이러한 문제를 출발지/목적지 포트를 추가함으로서 구분할 수 있다. 비유를 하자면 컴퓨터, IP가 아파트이면 포트는 동/호수 이다.

 

포트는 0 ~ 65535까지 할당이 가능한데, 0 ~ 1023 까지는 잘 알려진 포트라 이미 할당이 된 경우가 많으니 사용하지 않는 것이 좋다. 예를들어 FTP는 포트 20, 21. HTTP는 포트 80, HTTPS는 포트 443을 사용한다. 참고로 포트가 65535까지 할당이 가능한 것은 16bit 정수로 만들어졌기 때문이다.

5. DNS

DNS란 도메인 네임 시스템(Domain Name System)의 약자로 IP 주소에 도메인 이름을 등록할 수 있게 해준다. IP 주소는 외우기도 어렵고, 변경될 수 있기 때문에 DNS라는 전화번호부 같은 곳에 저장하여 도메인을 등록하여 IP 주소로 접속할 수 있다.