본 포스트는 김영한 개발자님의 모든 개발자를 위한 HTTP 웹 기본 지식을 공부하고 정리한 글입니다.
모든 개발자를 위한 HTTP 웹 기본 지식 - 인프런 | 강의
실무에 꼭 필요한 HTTP 핵심 기능과 올바른 HTTP API 설계 방법을 학습합니다., - 강의 소개 | 인프런...
www.inflearn.com
- 인터넷 통신
인터넷 망에서 컴퓨터들은 어떻게 통신할까?
예를들어 클라언트와 서버가 가깝다면, 물리적으로 케이블을 연결하여 통신할 수 있다.
그러나 실제로는 클라이언트와 서버의 거리가 멀 것이다. 그렇다면 인터넷 망을 통해 "Hello, world!"를 보내야 한다면 어떻게 될까? 클라이언트는 인터넷 망 내부의 수많은 노드를 거쳐 안전하게 서버로 전달해야 한다. 이러한 과정을 이해하기 위해서는 IP 프로토콜을 알아야 한다.
- IP 인터넷 프로토콜
1. IP 주소 부여
클라이언트와 서버가 통신할 수 있도록 IP 주소가 부여된 상태여야 한다.
2. IP (인터넷 프로토콜) 역할
- 지정한 IP 주소에 데이터를 전달
- 패킷(Packet)이라는 통신 단위로 데이터 전달
3. IP 패킷 정보
마치 택배 박스처럼 패킷 단위로 데이터를 전달하게 되는데, 전송 데이터와 출발지 IP(클라이언트), 목적지 IP(서버) 등 함께 묶여 패킷으로 전달된다.
4. 클라이언트 패킷 전달
인터넷 망 내에 클라이언트가 보낸 패킷들은 노드를 통해 목적지까지 길을 안내 받게 되며, 서버에 도달하게 된다.
5. 서버 패킷 전달
클라이언트가 서버에 패킷을 보낸 후, 마찬가지로 서버도 패킷을 노드를 통해 클라이언트에게 보낸다.
6. IP 프로토콜의 한계
그러나 IP 프로토콜으로만 통신을 하기에 한계가 있으며 이는 비연결성, 비신뢰성, 프로그램 구분 등의 문제를 가진다.
6-1. 비연결성 - 대상이 서비스 불능, 패킷 전송
클라이언트는 서버에 패킷을 전송하려고 할 때, 대상 서버의 상태를 알 수 없다. 이러한 문제는 서버가 서비스 불능이 되는 경우 패킷을 받을 대상이 없어지게 되며, 이를 모르고 클라이언트는 서버에 패킷을 계속 전송하게 된다.
6-2 비신뢰성 - 패킷 손실
만약 인터넷 망 내에 노드가 문제가 생기는 경우, 서버까지 도달되야 하는 패킷이 유실되는 문제를 가질 수 있다.
6-3 비신뢰성 - 패킷 전달 순서 문제 발생
대용량 데이터를 한번에 보내는 경우 이를 하나의 패킷에 담을 수 없기 때문에 여러 패킷으로 분리해서 전송하게 된다. 패킷이 노드를 통해 보내질 때 항상 같은 이동 경로를 보장하지 않는다. 이로 인해 클라이언트가 원하는 패킷 순서가 맞지 않을 수 있는 문제를 가진다.
- TCP/UDP
1. 프로토콜 4계층
채팅 프로그램에서 "Hello, world!"라는 메세지를 전송하면 다음과 같은 과정이 발생한다.
- 프로그램이 데이터("Hello, world!" 메세지)를 생성
- 생성된 데이터를 soket 라이브러리를 통해 os 계층으로 전달
- TCP 계층에서 데이터를 포함한 TCP 정보를 생성
- IP 계층에서 TCP 정보를 포함한 IP 패킷 생성
- IP 패킷이 LAN 카드를 통해 나갈 때 IP 패킷이 Ethernet Frame에 포함되어 전송
Ethernet Frame: LAN 카드의 MAC 주소 등 물리적 정보가 포함되어 있다.
2. IP 패킷 정보 → TCP/IP 패킷 정보
TCP/IP 패킷은 IP 뿐만이 아니라 PORT, 전송 제어, 순서, 검증 정보 등이 추가된다. 이로 인해 IP 프로토콜의 한계를 해결할 수 있다.
3. TCP(Transmission Control Protocol : 전송 제어 프로토콜)의 특징
3-1 TCP 3 way handshake
- 클라이언트가 서버에 접속을 요청하는 SYN을 보낸다.
- 서버가 SYN을 받은 후, 서버에서 클라이언트로 접속을 요청하는 SYN과 ACK를 보낸다.
- 클라이언트가 SYN을 받았다면, 서버로 ACK를 보낸다.
- 3 way handshake 이후, 클라이언트와 서버는 서로 연결됐음을 인식한다.
- 클라이언트가 서버로 데이터를 전송한다.
현재는 최적화가 잘 되어 서버가 ACK를 보낼 때 데이터도 같이 전송하기도 한다.
3-2 데이터 전달 보증
클라이언트가 데이터를 전송하고 서버가 데이터를 받았다면 클라이언트에게 정상적으로 전송됐음을 응답해준다.
3-3 순서 보장
클라이언트가 패킷을 보낸 순서대로 서버에 전달되지 않으며, 서버가 클라이언트에게 다시 순서대로 전송될 수 있도록 요청한다.
4. UDP(User Datagram Protocol : 사용자 데이터그램 프로토콜)의 특징
- TCP 처럼 3 way handshake가 없으며, 데이터 전달 보증과 순서를 보장해주지 않는다.
- TCP의 위와 같은 과정이 없기 때문에 상대적으로 속도가 빠르며, PORT와 checksum 정도만 추가하면 된다.
- 애플리케이션에서 추가 작업이 필요하다.
checksum: 중복 검사의 한 형태이며, 송신된 자료의 무결성을 보호하는 단순한 방법이다.
UDP 애플리케이션 추가 작업의 의미란?
웹의 통신 규격인 HTTP는 여러가지 버전(0.9, 1.1, 2, 3)이 있다. HTTP/1.1 과 HTTP/2 는 TCP를 기반으로 작동하고 HTTP/3 은 UDP를 기반의 QUIC를 사용한 기술이 도입됐다. 이중 대부분을 차지하는 HTTP/1.1과 달리 HTTP/3은 아직 보편화된 단계가 아니고 구글의 크롬 브라우저에서만 도입되고 사용되는 단계다.
하나의 웹사이트 페이지는 여러 개의 파일(이미지, css 파일 등)의 모음이다. 따라서 한 페이지를 요청할 때 파생되는 수백개의 요청을 효율적으로 처리하는 것이 HTTP/2, HTTP/3의 주요 목표다. 하나의 사이트를 불러오기 위해 브라우저는 TCP, UDP 등의 모든 통신을 동시에 활용한다. (서버가 UDP를 지원한다는 전제하에)
UDP는 3-way-handshake 과정이나 데이터 순서 보장을 하지 않아 클라이언트가 이를 알아서 해결해야 한다. 즉, 데이터 순서를 보장하지 않는 문제를 해결하기 위해 클라이언트에서는 추가적으로 작업이 필요하게 된다. 웹 개발에서 애플리케이션은 브라우저를 말하고 브라우저(클라이언트)가 TCP, UDP에 대한 처리를 담당하므로 웹 개발자가 이를 구분하여 작업할 필요는 없다.
- PORT
1. 하나의 IP 주소를 가진 클라이언트가 2개 이상 서버에 요청을 하고 있는 상황을 가정해보자.
즉, 클라이언트가 여러 개의 서버와 서버와 통신해야 하는 상황이다.
서버가 클라이언트에게 패킷을 보내기 위해 클라이언트 IP를 통해 패킷을 보내야 한다. 하지만 IP만 사용하게 되면, 클라이언트 입장에서는 받은 패킷이 위 그림처럼 게임, 화상통화, 웹 브라우저 요청 중 어떤 프로그램으로 온 패킷인지 알 수 없는 문제가 있다. 따라서 이를 해결하기 위해 PORT를 사용하여 구분한다.
2. TCP/IP 패킷 정보
위 그림처럼 TCP/IP 패킷은 출발지 PORT, 목적지 PORT가 포함되는 것을 볼 수 있다.
- IP: 목적지 서버를 찾는 용도
- PORT: 서버 내부에 돌아가는 애플리케이션을 구분하는 용도
3. PORT - 같은 IP 내 프로세스 구분
- [클라이언트] 게임 : 8090 ↔ [서버] 게임 : 11200
- [클라이언트] 화상통화 : 21000 ↔ [서버] 화상통화 : 32202
- [클라이언트] 웹 브라우저 : 10010 ↔ [서버] 웹 브라우저 : 80
4. PORT 번호
- 0 ~ 65535 : 할당 가능
- 0 ~ 1023 : 잘 알려진 포트라 사용하지 않는 것이 좋음
- FTP : 20, 21 / TELNET : 23 / HTTP : 80 / HTTPS : 443
- DNS(Domain Name System)
1. IP 주소의 문제점
IP 주소를 가지고 서로 통신을 할 수 있으나, IP를 기억하고 있기 어려운 문제를 가지고 있다.
IP 주소는 변경될 수 있기 때문에 IP 주소를 기억한다고 해도 신규 IP를 알 수 없다.
2. DNS(Domain Name System)이란?
도메인 명을 IP 주소로 변환시켜주는 역할을 한다.(전화번호부같은 역할)
DNS를 통해 IP를 기억하기 어렵고, 변경될 수 있는 문제를 해결해준다.
- DNS 서버에 도메인 명에 대한 IP 주소를 등록해둔다.
- 클라이언트가 DNS 서버에 도메인 명에 대한 IP를 요청한다.
- DNS 서버는 해당 도메인 명에 대한 IP 주소를 클라이언트에게 전달한다.
- 클라이언트는 해당 IP 주소로 서버에 접근한다.
'HTTP' 카테고리의 다른 글
[모든 개발자를 위한 HTTP 웹 기본 지식] 비 연결성(Connectionless) (0) | 2023.01.25 |
---|---|
[모든 개발자를 위한 HTTP 웹 기본 지식] Stateful, Stateless (1) | 2023.01.25 |
[모든 개발자를 위한 HTTP 웹 기본 지식] URI와 웹 브라우저 요청 흐름 (0) | 2023.01.23 |
[모든 개발자를 위한 HTTP 웹 기본 지식] HTTP 정리 (0) | 2023.01.23 |