[ 🌐 2023/05/06 ]
개발자는 평생 HTTP 기반 위에서 개발해야 한다.
1. 인터넷 네트워크
- 1. 인터넷 통신
- 2. IP(인터넷 프로토콜)
- 3. TCP/UDP
- 4. PORT
- 5. DNS
인터넷 네트워크
HTTP도 결국에는 TCP/IP나 UDP 기반 위에서 동작하기 때문에 아주 기본적인 인터넷 네트워크를 이해해야 한다.
1. 인터넷 통신 - 인터넷에서 컴퓨터 둘은 어떻게 통신할까?
가까이 연결되어 있는 컴퓨터는 클라이언트에서 메시지를 보내면 서버에서 바로 응답을 한다. 하지만 클라이언트와 서버 사이의 거리가 멀 경우 복잡한 인터넷 망을 거쳐야 한다.
2. IP (인터넷 프로토콜)
[IP 인터넷 프로토콜]
복잡한 인터넷 망에서 메시지를 보내려면 최소한의 규칙이 필요하다. IP 주소를 통해서 가능해진다.
[IP 인터넷 프로토콜 역할]
- 지정한 IP 주소(IP Address)에 데이터 전달
- 패킷(Packet)이라는 통신 단위로 데이터 전달
[ IP 패킷 정보]
출발지 IP + 목적지 IP + 전송 데이터
[클라이언트 패킷 전달]
- 패킷
| 출발 100.100.100.1 | 목적 200.200.200.2 | Hello World |
- IP 패킷을 인터넷 망으로 던진다.
- IP 프로토콜에 의해서 서버들이 규약을 따르는데 서로 노드끼리 던지다가 최종적으로 목적지까지 전달된다.
[서버 패킷 전달]
- 패킷
| 출발 200.200.200.2 | 목적 100.100.100.1 | Hello World |
- 메시지를 받은 목적지 IP가 OK라고 전달하고 싶다면, IP 패킷을 만들어서 다시 클라이언트로 던진다.
- 100.100.100.1. 을 받을 수 있는 노드를 서로 물어가며 목적지까지 전달한다.
=> 🏠 요청할 때랑 응답할 때 인터넷 망이 복잡하기 때문에 서로 다른 곳으로 전달될 수 있다.
[IP 프로토콜의 한계]
1) 비연결성
클라이언트는 패킷을 받을 대상이 없거나 서비스 불능 상태여도 서버의 상태를 모르기 때문에 패킷을 전송한다.
2) 비신뢰성
- 패킷 소실: 노드가 꺼지거나 중간 서버에 문제가 생겨서 소실되어도 모른다.
- 패킷 전달 순서 문제 발생: 패킷의 용량이 클 때 (1500Byte 이상) 메시지를 끊어서 보낸다. 끊어서 보낸 패킷이 중간에 다른 노드를 탈 수 있기 때문에 최종적으로 의도와 다르게 전달될 수 있다.
3) 프로그램 구분
같은 IP를 사용하는 서버에서 통신하는 애플리케이션이 둘 이상이면?
🎈 이를 해결하기 위한 방법?
TCP / UDP
3. TCP/UDP - IP 위에 올려서 보완하는 역할 ⭐⭐⭐
[인터넷 프로토콜 스택의 4 계층]
| 인터넷 프로토콜 스택의 4계층 |
| 애플리케이션 계층 - HTTP, FTP |
| 전송 계층 - TCP, UDP |
| 인터넷 계층 - IP |
| 네트워크 인터페이스 계층 - LAN 카드 |
[프로토콜 계층]
| 프로토콜 계층 | |
| 애플리케이션 | 웹 브라우저/ 네트워크 게임/ 채팅 프로그램 SOCKET 라이브러리 |
| OS(운영체제) | TCP/ UDP IP(Internet Protocol) |
| 네트워크 인터페이스 | LAN 드라이버 LAN 장비 |
- 프로그램 메시지 작성
- SOCKET 라이브러리를 통해 전달
- TCP 정보생성, 메시지 데이터 포함
- IP 패킷 생성, TCP 데이터 포함
- 랜카드를 통해서 나갈 때, 이더넷 프레임 포함되어서 나간다.
=> ⭐️ 웹을 공부하는 데는 IP 프로토콜까지만 깊이 있게 이해하면 된다.⭐
TCP/IP 패킷 정보
[IP 패킷 정보]
출발지 IP + 목적지 IP + 전송 데이터
[TCP 세그먼트]
- 출발지 PORT, 목적지 PORT, 전송 제어 정보, 순서 정보, 검증 정보...
- IP만으로 해결되지 못했던 순서 제어 문제가 해결이 된다.!
TCP 특징 - 전송 제어 프로토콜
- 연결지향 - TCP 3 way handshake (가상 연결)
- 데이터 전달 보증
- 순서 보장
- 신뢰할 수 있는 프로토콜
- 현재는 대부분 TCP 사용
1. TCP 3 way handshake
[connect, 연결과정]
- SYN
- SYN + ACK
- ACK
- 데이터 전송
=> 논리적으로만 연결, 중간의 수많은 서버를 거치는데 노드들 연결되었는지 모른다.
- SYN: 접속 요청
- ACK: 요청 수락
- 참고: 3. ACK와 함께 데이터 전송 가능
2. 데이터 전달 보증
클라이언트에서 데이터 전송을 하면 서버에서 데이터 잘 받았다고 응답해 준다.
3. 순서 보장
- 1. 데이터가 커서 끊어서 보낼 때 패킷 1, 패킷 2, 패킷 3 순서로 보낸다.
- 패킷 1, 패킷 3, 패킷 2 순서로 도착
- 서버가 클라이언트에게 패킷 2부터 다시 보내라고 요청한다. 그러면 클라이언트가 잘못되었구나 하고 패킷 2로부터 다시 보낸다.
UDP 특징 - 사용자 데이터그램 프로토콜
- 하얀 도화지에 비유(기능이 거의 없음 ❌)
- 연결지향 - TCP 3 way handshake ❌
- 데이터 전달 보증 ❌
- 순서 보장 ❌
- 데이터 전달 순서가 보장되지 않지만 단순하고 빠르다.
[정리]
- IP와 거의 같다. +PORT +체크섬 정도만 추가 (IP 하나가 할당된 내 PC에서 네트워크 게임도 하고, 음악도 스트리밍으로 듣고 있다. 내 IP에 여러 패킷이 들어온다. 이때 게임용 패킷인지? 음악용 패킷인지? 구분하는 것이 PORT이다. 체크섬은 이 메시지에 대해서 검증해 주는 데이터가 간단하게 추가되어 있다.)
- 애플리케이션에서 추가 작업 필요
=> TCP는 3 way handshake를 하려면 시간이 걸리고, 데이터 전달 보증, 순서 보장 등이 되어서 데이터 양도 크고 전송 속도도 빠르게 만들기 어렵다. 이미 많이 구축이 되어 있기 때문이다. 더 최적화하고 싶어도 할 수가 없다. 이미 인터넷은 TCP 기반으로 쓰고 있기 때문에 이 프로토콜에 손을 델 수 없다.
그런데 더 최적화 하고 싶다면? TCP는 그대로 쓰고, UDP로 손을 데면 된다. UDP는 아무것도 되어있지 않기 때문에 그 위에 내가 원하는 애플리케이션 레벨에서 만들어 내면 된다.
* 최근에는 UDP가 각광 받고 있다. 웹 브라우저에서 HTTP 통신을 할 때 HTTP3 스펙이 나왔는데 3 way handshake의 SYN, SYN+ANC, SYN 과정을 다 줄이고자 더 최적화를 하면서 HTTP3 경우에는 UDP 프로토콜을 사용한다.
4. PORT - 같은 IP 내에서 프로세스 구분
한번에 둘 이상 연결해야 한다면? PORT!
[TCP/ IP 패킷]
- [출발지 IP, PORT/ 목적지 IP, PORT/ 전송 데이터]
- IP - 아파트 / PORT - 몇 동 몇 호
- 0 - 65535 할당 가능
- 0 - 1023: 잘 알려진 포트, 사용하지 않는 것이 좋다.
- FTP - 20, 21
- TELNET - 23
- HTTP - 80
- HTTPS - 443 (HTTP에 +보안이 추가된 것)
5. DNS - 도메인 네임 시스템
IP 기억하기 어렵다🤯, IP 변경될 수 있다😵💫 => DNS 서버 사용!
- 전화번호부 (도메인을 사서 DNS 서버에 등록할 수 있다...!)
- 도메인 명을 IP 주소로 변환
- DNS 서버에 도메인명 google.com IP 요청 (먼저 도메인으로 찾는다.)
- DNS 서버가 응답을 준다. (200.200.200.2)
- 200.200.200.2로 접속하면 된다.
[정리]
- 복잡한 인터넷 망에서 메시지를 보내려면 IP 프로토콜이 있어야 한다.
- IP 프로토콜만 가지고 메시지가 잘 도착했는지 신뢰하기 어렵고, 메시지 순서에 문제가 발생할 수도 있다. 그리고 PORT라는 개념도 없다.
- 이러한 문제를 TCP 프로토콜이 해결해준다. UDP 프로토콜은 IP랑 거의 같은데 PORT가 추가된 백지 상태다. 필요하다면 UDP 프로토콜 위에 애플리케이션에서 기능을 확장할 수 있다.
- PORT는 같은 IP 안에서 통신하는 애플리케이션을 구분하기 위해 사용.
- DNS는 IP는 변하기 쉽고 외우기 어려운데 도메인 명을 등록해서 사용할 수 있도록 도와준다.
'Computer Science > 네트워크' 카테고리의 다른 글
| [네트워크] HTTP와 HTTPS 차이점 (0) | 2023.11.21 |
|---|---|
| 🙅🏻♀️ REST API란? (0) | 2023.10.20 |
| [네트워크] 2. URI와 웹 브라우저 요청 흐름 (0) | 2023.05.07 |
| [네트워크] 데이터 링크 계층: 랜에서 데이터 전송하기 (0) | 2023.04.18 |