티스토리 뷰
인프런 김영한 님의 모든 개발자를 위한 HTTP 웹 기본 지식 강의를 듣고 내용을 정리한 글입니다.
1. 인터넷 통신
HTTP 또한 인터넷 통신 위에서 동작한다.
인터넷에서 컴퓨터는 어떻게 통신할까.
클라이언트와 서버는 인터넷을 통해 메세지를 주고받는다.
클라이언트 --- 인터넷 ---> 서버
클라이언트가 보낸 메세지가 서버에게 안전하고 정확하게 전달되려면
어떤 특정한 규칙이 필요할 것이다.
그 규칙이 인터넷 프로토콜(Internet Protocol)이다.
2. IP(인터넷 프로토콜)
인터넷 망에서 클라이언트와 서버는 IP주소를 통해 서로 메세지를 주고 받는다.
이때 패킷(packet)이라는 통신 단위로 데이터를 전달하게 되는데,
패킷은 package와 bucket의 합성어로, 데이터 뭉치라고 생각하면 된다.
IP 패킷 정보에는 출발지 IP, 목적지 IP, 전송데이터 등이 담겨 있다.
이 IP 패킷이 클라이언트를 떠나 인터넷망 내 노드들을 거쳐 결국 서버에 도착한다.
그 이후 서버는 동일한 과정을 거쳐 결과물을 클라이언트에게 준다.
IP 프로토콜의 한계
비연결성
클라이언트는 서버의 상태를 알지 못하기 때문에 패킷을 받을 대상이 없거나 서비스 불능 상태여도 패킷을 전송한다.
즉, 서버가 꺼져 있어도 클라는 그냥 전송하고, 나는 그 결과를 알 수 없다.
예를 들어 친구가 이사를 갔는지 모르고 그냥 편지를 보내는 것이다.
비신뢰성
중간에 패킷이 사라지거나, 여러 개의 패킷을 보냈을 때 순서대로 도착하지 않을 수 있다.
패킷을 보내는 중간 과정에 존재하는 서버 혹은 광케이블이 문제가 생겨서 패킷이 소실되어도 알 수 없고,
1, 2, 3이라는 패킷을 순서대로 보낼 때 2보다 3의 용량이 더 작으면, 2보다 3이 먼저 서버에 도착할 수 있다.
프로그램 구분이 안됨
같은 IP를 사용하는 서버에서 통신하는 애플리케이션이 둘 이상일 때 어떤 패킷이 어떤 애플리케이션을 위한 것인지 구분할 수 없다.
해결책?
그래서 나타난 게 TCP와 UDP이다.
3. TCP, UDP
TCP
TCP는 IP의 문제점인 비연결성, 비신뢰성, 패킷 구분없음을 해결해준다.
인터넷 프로토콜 스택의 4계층
계층 | 계층이름 | 예시 |
---|---|---|
4 | 애플리케이션 계층 | HTTP, FTP, 애플리케이션, 브라우저 |
3 | 전송 계층 | TCP, UDP |
2 | 인터넷 계층 | IP |
1 | 네트워크 계층 | LAN, LAN드라이버 |
TCP는 IP의 위 계층에서 IP를 보완해준다.
운영체제
내가 누군가에게 메세지를 보낸다면,
- 애플리케이션 계층에서 프로그램이 메세지 생성
- SOCKET 라이브러리를 통해 TCP로 전달
- TCP 정보 생성, 메세지 데이터 포함, IP로 전달
- IP 패킷 생성, TCP 데이터 포함 LAN카드로 전달
- LAN카드를 이용해 인터넷을 통해 서버로 이동
순으로 작동한다.
즉 메세지에는 HTTP, TCP, IP, Ethernet frame이 씌워져있다.
IP 패킷정보에는 출발지 IP, 목적기 IP 등이 있다.
TCP 세그먼트에는 출발지 PORT, 목적지 PORT, 전송제어, 순서, 검증 정보 등이 있다.
TCP 특징
전송제어프로토콜(Transmission Control Protocol)은 크게 아래 세 가지의 특징을 갖는다.
- 연결지향(TCP 3 way handshake)
- 클라이언트와 서버의 연결을 먼저 확인하고 데이터 전달
- 데이터 전달 보증
- 중간에 데이터가 누락이 되더라도 알 수 있음
- 순서 보장
따라서 TCP는 IP보다는 신뢰할 수 있는 프로토콜이며 현재는 대부분 TCP를 사용한다.
연결지향 TCP 3 way handshake
TCP는 3 way handshake 라는 방법을 사용해서 클라이언트와 서버의 연결 상태를 보장한다.
연결지향
- 클라에서 서버로
SYN
이라는 메세지를 보냄 - 서버에서 클라로
SYN
+ACK
- 클라에서 서버로
ACK
syn(syncronize)은 접속 요청, ack(acknowledge)은 요청 수락
위 과정처럼 3번에 걸쳐 연결상태를 확인한 후에 데이터를 전송한다.
요즘은 최적화가 많이 진행되어 3번의 과정 때 데이터를 함께 전송하기도 한다.
근데 이 연결은 가상연결이지 실제로 연결된 것은 아니다.
클라와 서버 사이에 있는 수많은 서버들, 노드들은 이 연결 사실을 모른다.
위 클라이언트와 서버를 위한 전용 LAN선이 보장되는 건 아니다.
데이터 전달 보증
클라이언트가 서버한테 데이터를 보내주면 서버가 클라한테 데이터를 잘 받았다고 응답해준다.
이 응답이 없으면 클라가 데이터가 제대로 가지 않았다는 것을 알 수 있다.
순서 보장
클라가 1, 2, 3 순서로 전송했는데
서버한테 1, 3, 2 순서로 도착하면
서버가 클라한테 2번부터 다시 보내라고 요청한다.
물론 서버에서 최적화 로직은 가능하다.
TCP가 이와 같이 연결성 뿐만 아니라 데이터, 순서를 보장할 수 있는 것은
전송제어, 순서, 검증정보가 있기 때문에 가능하다
UDP
TCP와 같은 계층에 있지만 기능이 거의 없다.
IP와 거의 같음, PORT와 체크섬 정도만 추가되어 있고, 애플리케이션에서 추가 작업이 필요하다.
PORT
는 하나의 IP에서 여러 애플리케이션을 위한 데이터 패킷을 받고, 구분할 수 있게 하는 것이고
체크섬
은 데이터 검증하는 것이다.
3 way handshake
없고 데이터 전달 보증도 없고 순서 보장도 없다.
하지만 단순하고 빠르다.
UDP를 사용하는 이유는 개발자가 커스텀할 수 있기 때문이다.
TCP는 연결지향을 하기 위해서 속도가 느려진다.
또한 데이터 검증 등을 하면 데이터도 커지고 이미 관련 로직이 많아서 전송속도를 더 최적화하기 어렵다.
따라서 TCP는 개발자가 따로 손을 댈 수가 없다.
반면 UDP는 애플리케이션 레벨에서 내가 최적화를 할 수 있다.
최근에는 데이터 전송을 최적화하기 위해 UDP가 각광받고 있다.
4. PORT
PORT의 뜻은 항구다.
하나의 IP에서 여러 개의 애플리케이션을 통한 데이터 전송을 해야 할 때 사용한다.
예를 들어 내 PC(클라)에서 게임도 하고, 카톡도 하고 웹브라우저도 켜놨다.
3개의 서버와 동시에 패킷을 주고 받을 텐데,
IP만으로는 이게 게임에 필요한 건지, 카톡에 필요한 건지 알 수 없다.
하지만 TCP에는 출발지 PORT와 목적지 PORT가 있다.
IP는 목적지 서버를 찾는 거고, PORT는 그 서버에서 돌아가고 있는 애플리케이션을 찾는다.
따라서 TCP/IP 패킷에는 출발지의 IP와 PORT, 목적지의 IP와 PORT가 있다.
즉, PORT란 같은 IP 내에서 프로세스를 구분하는 것이다.
예를 들자면 IP는 아파트, PORT는 몇동 몇호라고 비유할 수 있다.
PORT 예시
PORT는 0~65535 사이에서 할당 가능하다.
- 0~1023 잘 알려진 포트. 사용하지 않는 것이 좋다.
- FTP - 20, 21
- TELNET - 23
- HTTP - 80
- HTTPS - 443
5. DNS
100.100.100.1
이렇게 숫자로만 이루어진 IP는 기억하기 어렵다.
또한 IP는 쉽게 변경될 수 있는데 서버의 IP가 바뀌면 데이터를 전달할 수 없다.
이 두 문제점을 해결해주는 게 DNS(Domain Name System), 도메인 네임 시스템이다.
일종의 전화번호부 같은 시스템으로 도메인명을 IP주소로 변환해준다.
예를 들어 DNS 서버에
도메인명 | IP |
---|---|
www.google.com | 200.200.200.2 |
abc.com | 210.210.210.3 |
위와 같이 등록되어 있을 때,
- 클라가 DNS 서버에
www.google.com
라는 도메인명을 요청하면 - DNS서버가 그 도메인에 맞는 아이피를 클라에게 주고
- 클라는 그 IP로 접속한다.
IP가 바뀌면 해당 도메인의 소유주가 알아서 동일한 도메인에 등록된 IP를 수정한다.
또 도메인은 구매하여 사용해야 한다.
'Programming > Computer Science' 카테고리의 다른 글
[HTTP] HTTP 메소드, GET, POST, PATCH, PUT, DELETE, 안전, 멱등 (0) | 2022.03.29 |
---|---|
[HTTP] HTTP 메세지, stateless, 비연결성 (0) | 2022.02.04 |
[HTTP] URI, 웹 브라우저 요청 흐름 (0) | 2022.02.01 |
컴파일타임(compiletime)과 런타임(runtime) (0) | 2021.10.27 |
WAS와 웹 서버(Web Server)의 차이 (0) | 2021.10.19 |