인터넷에서 통신의 아래의 그림과 같은 방식으로 진행된다.
클라이언트에서 서버에 데이터를 보내며 그 사이의 노드들을 거쳐가며 전송이 된다.
이와 같이 보내는 과정에서 여러 가지 문제점이 발생할 수 있다.
밑에서부터 문제점과 그에 따른 해결 방법들 및 개념들을 설명하겠다.
IP(Internet Protocol)
- 모든 클라이언트나 서버는 IP주소를 부여받아야 한다.
- 클라이언트와 서버 간 통신에는 IP 주소를 통해 데이터를 전달한다.
- 이 과정에서 패킷이라는 통신 단위로 전달된다.
IP 패킷 정보
- 출발지 IP와, 목적지 IP 등이 있고 내부에는 전송 데이터가 들어있다.
IP 프로토콜의 한계
- 출발지 IP와 목적지 IP와 같은 적은 정보로는 여러 가지 문제점이 발생할 수 있다.
1. 비연결성
- 패킷을 받을 대상이 없거나 서비스 불능 상태에도 전송을 진행한다.
-> 도착 대상이 어떤 상태인지 클라이언트는 알지 못하기 때문
2. 비신뢰성
- 중간에 노드를 넘어가던 도중 패킷이 소실될 수도 있다.
- 서버에 도착했을 때의 패킷 순서가 클라이언트에서 보낸 패킷 순서와 일치하지 않을 수도 있다.
3. 프로그램 구분
- 같은 IP를 사용하는 서버에 여러 애플리케이션이 동작할 수 있다. 이 때는 클라이언트가 IP주소만 가지고는 한 애플리케이션과 통신할 방법이 없다.
이러한 문제들을 해결하기 위해 전송계층에 TCP, UDP라는 개념이 있다.
TCP, UDP를 알아보기 전에 인터넷 프로토콜의 계층을 먼저 알아보자
기본적으로 위와 같이 4개의 계층으로 구성되어 있다.
1. 먼저 메시지를 받으면 애플리케이션 계층의 SOCKET 라이브러리를 통해 전송계층으로 전달된다.
2. 전송계층으로 전달된 메시지가 TCP 정보를 생성하고 그 내부에는 메시지 데이터를 포함하고 있다.
3. 인터넷 계층으로 내려가 IP 패킷을 생성하는데 그 안에는 TCP정보가 포함되어 있다.
4. 네트워크 인터페이스 계층에서 LAN카드를 통해 이더넷 프레임이 포함되어서 전송된다.
여기서 TCP의 정보는 어떻게 구성되어 있는지 알아보겠다.
- 위에서 설명했던 것과 같이 TCP는 IP패킷에 감싸져 있다.
- TCP 패킷은 출발지, 목적지 포트와 전송 제어, 순서, 검증 정보 등의 내용이 추가되었다.
- 이를 통해서 IP계층에서 발생한 문제점들을 해결할 수 있다.
TCP의 특징 : 전송 제어 프로토콜(Transmission Control Protocol)
1. 연결지향 - TCP 3 way handshake
- 연결이 안 되어 있다면 패킷을 보내지 않는다.
-> 이를 통해 비연결성을 해결할 수 있고 클라이언트 서버 모두 서로를 신뢰할 수 있다.
- TCP 3 way hand shake의 과정
- 3단계의 요청 수락 과정으로 이루어져 있다.
1. 클라이언트 -> 서버 : SYN(접속 요청)을 보낸다.
2. 서버 -> 클라이언트 : SYN과 ACK(요청 수락)을 함께 보낸다. //패킷의 정보를 확인하고 오류가 없다면 보낸다.
3. 클라이언트 -> 서버 : ACK를 보낸다.
//3번 과정을 데이터 전송과 함께 가능하다.
- 하지만 이것은 진짜로 연결된 것이 아니라 논리적으로만 연결된 것이다.
- 중간에 수많은 서버들이 있는데 그 모든 서버들이 연결되었는지는 모르고 서버, 클라이언트 간의 논리적으로 연결된 것만 확인.
2. 데이터 전달 보증
- 패킷이 중간에 누락되면 알 수 있다.
-> IP계층의 비신뢰성을 해결해 준다.
3. 순서 보장
- 전송된 패킷의 순서 정보를 보고 순서가 다르게 전송되었다면 다시 보내달라고 요청한다.
TCP는 신뢰할 수 있는 프로토콜이고, 현재는 대부분 TCP를 사용한다.
UDP의 특징 : 사용자 데이터그램 프로토콜(User Datagram Protocol)
- 기능이 거의 없다
- TCP와 같이 순서 보장을 해주지도 않고 전달 보증을 해주지도 않는다. 하지만 속도가 빠르다.
- IP의 특징 + PORT + 체크섬 기능 정도를 가지고 있다.
- 애플리케이션에서 추가 작업이 필요하다.
- TCP보다 더 최적화해야 할 경우 사용한다.
- HTTP3 에선 TCP를 더 최적화해 보자 해서 UDP를 쓰고 있다. 하지만 기본적으론 TCP 프로토콜을 사용한다.
PORT
- 같은 IP 내에서 서로 다른 프로세스를 구분하기 위한 번호
- IP를 보낼 때 PORT도 같이 보내기 때문에 서버에서 클라이언트의 포트를 알 수 있다.
- 0 ~ 65535까지 할당이 가능하며 0 ~ 1023은 잘 알려진 포트로 사용하지 않는 것이 좋다.
- FTP - 20,21 / TELNET - 23 / HTTP - 80 / HTTPS - 443
- IP는 아파트 주소, PORT는 동, 호수라고 생각하면 편하다.
DNS(Domain Name System)
- IP는 변경될 수 있다. 클라이언트가 IP만 알고 있을 경우 이 상황에서 바뀐 IP를 계속 알아둬야 한다면 굉장히 불편하다.
- DNS는 위와 같은 상황을 편리하게 해 준다. DNS 서버에 도메인명과 IP를 설정해 두면 클라이언트는 도메인명만 알면 IP가 변경되어도 접속할 수 있다.
- 클라이언트가 DNS서버에 도메인명 입력 -> DNS서버가 클라이언트에 서버 IP를 보내줌 -> 클라이언트는 그 IP로 접속
출처: 모든 개발자를 위한 HTTP 웹 기본 지식 | 김영한 - 인프런 (inflearn.com)
'HTTP' 카테고리의 다른 글
HTTP 메서드 활용 (0) | 2024.09.09 |
---|---|
HTTP 메서드 (0) | 2024.09.09 |
HTTP 기본 (3) | 2024.09.04 |
웹 브라우저 요청 흐름 (0) | 2024.05.15 |
URI (0) | 2024.05.15 |