일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Compound Component
- Render Queue
- Dockerfile
- Sparkplug
- useEffect
- Event Loop
- TypeScript
- AJIT
- linux 배포판
- 주니어개발자
- 프로세스
- useMemo
- 타입 단언
- CS
- 명시적 타입 변환
- prettier-plugin-tailwindcss
- prettier
- docker
- Headless 컴포넌트
- 암묵적 타입 변환
- JavaScript
- 좋은 PR
- type assertion
- task queue
- useLayoutEffect
- useCallback
- React.memo
- react
- Microtask Queue
- Custom Hook
- Today
- Total
구리
[네트워크] HTTP에 대해 (1) - IP, TCP/UDP, PORT, DNS 본문
HTTP에 대해 공부하며 정리한 글입니다.
1. 인터넷 네크워크
HTTP도 인터넷 네트워크 기반으로 동작하기에 알아야 하는 개념입니다.
1-1. IP(인터넷 프로토콜)
클라이언트, 서버는 인터넷이라는 수많은 노드 서버를 거쳐 메세지를 주고 받습니다. 이때 수많은 서버들을 거쳐 전송해야 하기에 정보를 수신, 송신하는 통신규약을 정했는데 이를 Internet Protocol이라고 합니다.
IP는 지정한 IP 주소(IP Address)에 패킷(Packet)이라는 통신 단위로 데이터를 전달하는 역할을 합니다.
즉, IP는 서로 다른 컴퓨터에게 메세지를 전달할 수 있도록 정해진 규칙으로 규칙의 내용을 다음과 같습니다.
(Protocol : 통신을 원활하게 하는 통신 규약)
클라이언트 패킷 전달
1. IP 패킷에 출발 IP 주소(클라이언트 주소)와 목적 IP 주소(서버 주소)를 저장합니다.
2. 전달할 요청 데이터를 IP 패킷으로 감쌉니다.
3. 전달 데이터가 포함되어 있는 IP패킷을 인터넷 망에 전송합니다.
4. IP 프로토콜의 규약에 따라 출발지부터 목적지에 도착할 때까지 노드들이 패킷을 순차적으로 전달해 목적 IP 주소에 패킷이 도착합니다.
패킷을 전달받은 컴퓨터는 위와 같은 방식으로 응답할 수 있습니다. (서버 패킷 전달)
참고로 클라이언트, 서버가 전송할 때 서로 다른 노드를 통해 전달될 수 있습니다.
하지만 IP 프로토콜의 동작 방식에도 한계가 존재합니다.
IP 프로토콜의 한계
- 비연결성
- 패킷을 받을 대상이 없을 경우, 또는 서비스가 불능 상태일 경우여도 패킷을 전송합니다.
- 비신뢰성
- 중간에 서버가 다운되는 경우, 패킷이 소실될 수 있습니다.
- 패킷 메세지의 용량이 클 경우, 끊어서 패킷을 전송하는데 이때 1,2 순서로 전송해도 패킷들이 다른 노드 서버의 이동경로로 이동할 가능성이 있어 서버에서는 패킷 2,1 순서로 받을 수 있습니다. 따라서 패킷 전달 순서 문제가 발생합니다. (보통 1300바이트 정도)
- 프로그램 구분
- 같은 IP를 사용하는 서버에서 통신하는 애플리케이션이 2개 이상일 경우, 전송 받은 패킷이 어떤 애플리케이션에 해당하는지 구분하지 못하는 한계가 발생합니다.
1-2. TCP, UDP
TCP는 IP 프로토콜의 한계를 극복할 수 있습니다.
TCP/IP 모델의 4계층을 보면 위 사진처럼 아래부터 순서대로 레이어가 쌓입니다. TCP는 IP를 보완하기 위해 IP 스택 위에 쌓인다고 이해하면 될 것 같습니다.
프로토콜 계층에서 동작 순서는 다음과 같습니다.
1. 프로그램이 메세지를 생성합니다.
2. 보통 애플리케이션에선 SOCKET 라이브러리를 통해 OS 계층에 메세지를 전달합니다.
3. OS 계층에서 TCP 정보를 먼저 생성해 메세지 데이터를 포함시킵니다.
4. IP 패킷을 생성해 TCP 데이터를 포함시킨 후 네트워크 인터페이스를 통해 LAN 카드를 이용해 Ethernet frame을 포함시켜 인터넷 망으로 전송합니다.
Ethernet frame이란 LAN카드에 등록된 MAC 주소와 같은 물리적 주소를 포함하며 이더넷 기반의 네트워크에서 데이터 전송시 사용되는 기본 단위입니다. 컴퓨터와 네트워크 장치 간에 정보를 교환하기 위해 사용되며, 이더넷 프레임은 표준화된 구조를 가지고 있어 서로 다른 장치들 간의 데이터 전송을 원활하게 합니다.
TCP/IP 패킷정보는 위 사진처럼 되어 있습니다. TCP 데이터는 IP 패킷과 다르게 PORT, 전송 제어, 순서, 검증 정보 등을 포함시키고 있기에 IP프로토콜의 여러 문제들이 해결됩니다.
TCP 특징
전송 제어 프로토콜(Transmission Control Protocol)은 출발지에서 목적지로 단순히 전송하는 것만을 담당했던 인터넷 프로토콜과 다르게 구체적으로 어떻게 전송할지 제어함으로써 다음과 같은 특징을 가집니다.
- 연결 지향 (TCP 3 Way Handshake - 가상 연결)
- 클라이언트, 서버와의 연결이 된 것을 확인 후 메세지를 전송하기에 비연결성 문제가 해결됩니다.
- 데이터 전달 보증
- 메세지 전송 중 패킷이 소실된 것을 알 수 있습니다.
- TCP에서는 클라이언트가 서버에게 데이터 전송시 데이터를 잘 받았는지 서버가 응답합니다.
- 응답이 없을 경우 문제가 있는 것을 확인할 수 있습니다.
- 순서 보장
- 클라이언트가 전송한 패킷 순서와 서버에 도착한 패킷 순서가 다를 경우, 기본적으로 서버는 잘못된 순서부터 재전송할 것을 클라이언트에게 요청합니다.
- TCP 세그먼트에 순서 관련 정보가 담겨 있기에 가능합니다.
이러한 특징들로 TCP는 신뢰할 수 있는 프로토콜이 되어 대부분 애플리케이션에서는 TCP를 사용합니다.
TCP 3 way handshake
연결지향이 가능하게 되는 원리는 다음과 같습니다.
- 클라이언트가 서버에게 SYN(Synchronization: 동기화) 세그먼트을 보냅니다. (통신할 수 있어?)
- 서버가 SYN을 전달 받으면 ACK(요청 확인)이라는 메세지를 포함해 응답합니다. (가능해)
- 서버에게 SYN + ACK 패킷을 전달받은 클라이언트는 ACK(응답 확인)를 다시 응답해 연결 여부를 검증합니다. 이런 과정을 통해 클라이언트와 서버는 연결 여부를 확인해 동시에 서로를 신뢰할 수 있습니다. (이 연결은 물리적으로 연결된 것이 아니라 단지 서버, 클라이언트가 개념적으로 연결된 것으로, 전용 랜선이 보장된 것은 아닙니다)
- 연결이 되면 서버가 응답할 데이터를 클라이언트에게 전달합니다. 연결 여부가 확인되지 않을 경우 데이터를 전송하지 않습니다.
참고로 요새는 최적화가 되어 있어 3번 과정에서 ACK와 함께 요청을 같이 전송하기도 합니다.
Q) 3 way handshake 과정을 보면 클라이언트의 전송 계층(TCP)에서 서버의 전송계층(TCP)으로 다이렉트로 연결되는 것처럼 보이는데, 위와 같은 논리적 연결을 위해선 클라이언트측에서 전송 계층 → 물리계층을 거쳐 서버로 패킷을 전송하는 건가요?
맞습니다. 모든 통신은 OSI 표준 모델에 나와있듯이 물리 계층을 거치며 비트레벨로 변환, 전송됩니다.
그리고 수신측은 전송자가 거친 과정을 역순으로 (물리 → 데이터링크 → 네트워크 → 전송 등..) 거치며 파싱하는 작업을 진행합니다.
Q) 여기서 SYN, ACK은 구체적으로 어떤 의미인가요?
먼저 HTTP, TCP, IP와 같은 프로토콜들은 각자 자신의 역할이 있고, 보내고자 하는 데이터에 자신의 헤더를 붙여서 데이터의 정보를 표현합니다.
TCP의 헤더의 구성 요소 중 하나인 Flags가 있는데 9개의 비트 플래그로, ACK와 SYN이 이 플래그에 해당됩니다.
여기서 플래그란 다른 프로그램에게 약속된 신호를 남기기 위한 용도로 사용됩니다.
- ACK (Acknowledgement)
- 응답 플래그로 송신측으로부터 패킷을 잘 받았다는 것을 알려주기 위한 플래그
- SYN (synchronization)
- 연결 요청 플래그로 통신 시작시 세션을 연결하기 위한 플래그
따라서 3 way handshake를 다시 보면 다음과 같은 과정으로 진행됩니다.
- 송신측 → 수신측 - SYN bit = 1 (통신할 수 있니?)
- 수신측 → 송신측 - SYN, ACK bit = 1 (응)
- 송신측 → 수신측 - ACK bit = 1 (그래, 통신을 시작하자)
Q) 세그먼트, 패킷, 프레임이 정확히 어떤 것인가요?
클라이언트가 전송하는 데이터는 각 레이어를 거치고 헤더 정보가 추가되면서 명칭이 달라지게 됩니다. (데이터 자체는 동일)
- 세그먼트 - 데이터에 4계층(TCP) 헤더가 붙은 경우 (전송 계층)
- 패킷 - 세그먼트에 3계층(IP) 헤더가 붙은 경우 (네트워크 계층)
- 프레임 - 패킷에 2계층(Ethernet) 헤더가 붙은 경우 (물리 계층)
UDP
사용자 데이터그램 프로토콜(User Datagram Protocol)은 기능은 다음과 같은 특징이 있습니다.
- 기능이 거의 없으며 데이터 전달 보증, 순서 보장이 되지 않습니다. (IP와 거의 같지만 PORT, 체크섬 정도만 추가됩니다.)
- 3 way handshake를 사용하는 TCP에 비해 단순하고 빠릅니다.
- 이미 체계가 구축돼있는 TCP에 비해, 애플리케이션 레벨에서 최적화를 위한 추가 작업을 하여 사용합니다.
1-3. PORT
PORT란 한 IP(서버)에서 여러 애플리케이션을 구분하기 위한 용도로 사용됩니다. 만약 내 서버에서 영화, 게임, 채팅 애플리케이션을 사용할 경우, 요청에 대한 응답 패킷이 여러개 오게 되는데 이때 어떤 패킷이 어떤 애플리케이션에 해당하는지 알 수 없기에 PORT 정보로 구분해서 사용합니다.
- 0 ~ 65535 - 할당 가능한 PORT 범위
- 0 ~ 1023 - 잘 알려진 포트가 많기에 사용하지 않는게 좋음
- FTP : 20, 21
- TELNET : 23
- HTTP - 80
- HTTPS - 443
1-4. DNS
IP를 기억하는 게 쉽지 않을뿐더러, IP는 변경될 수 있습니다. 그래서 도메인명을 IP주소로 변환해주는 DNS(Domain Name System)을 사용합니다. 도메인명을 DNS에게 전송하면 DNS는 등록된 도메인명 목록에서 일치하는 도메인명의 IP를 찾아서 클라이언트에게 전달합니다. 클라이언트는 전달 받은 IP를 이용해 특정 서버에게 요청을 전달할 수 있습니다.
참고로 주소창에 도메인이 아닌 IP를 입력한다면 브라우저는 IP가 입력되었다는 것을 판단해 DNS를 거치지 않고 바로 서버에게 요청을 전송하며 DNS 서버는 보통 회사(Google, Cloudflare)나 기관에서 운영하고 있습니다.
'네트워크' 카테고리의 다른 글
[네트워크] CORS (0) | 2023.06.21 |
---|---|
[네트워크] HTTP 헤더 - 캐시와 조건부 요청 (1) | 2023.06.18 |
[네트워크] HTTP에 대해 (4) - HTTP 쿠키, 세션 (0) | 2023.06.13 |
[네트워크] HTTP에 대해 (3) - HTTP 기본 (0) | 2023.06.10 |
[네트워크] HTTP에 대해 (2) - URI, 웹 브라우저 요청 흐름 (0) | 2023.06.09 |