🔥 모든 개발자를 위한 HTTP 웹 기본 지식
섹션1. 인터넷 네트워크
📍 인터넷 통신
👉🏻 컴퓨터 2대가 서로 케이블에 연결되어 있다면 바로 메시지를 보낼 수 있음
👉🏻 하지만 컴퓨터 2대가 물리적으로 아주 먼 곳에 존재한다면, 인터넷을 사이에 두고 통신을 할 때 아주 많은 서버를 거쳐야 함
🤔 바로 인터넷 프로토콜(IP)를 이용해서!
📍 IP(인터넷 프로토콜)
👉🏻 IP 주소를 이용한 인터넷 규칙
👉🏻 클라이언트(보내는 사람)도 IP 주소가 있어야 하고, 서버(받는 사람)도 IP 주소가 있어야 함
👉🏻 패킷(packet)이라는 통신 단위로 데이터를 전달함
Client(요청) 👉🏻 전송할 메시지를 IP 패킷 정보(출발지 IP, 목적지 IP, 기타...)에 감싸서 보냄
Server(응답) 👈🏻 전송할 메시지를 IP 패킷 정보(출발지 IP, 목적지 IP, 기타...)에 감싸서 보냄
➡️ 응답, 요청을 할 때 해당 요청에 대한 응답이라도 서로 타고 오는 서버가 다를 수 있음
✅ IP 프로토콜의 한계
1) 비연결성: 패킷을 받을 대상이 없거나 서비스 불능 상태여도 패킷 전송
➡️ 대상 서버가 패킷을 받을 수 있는 상태인지 모름
컴퓨터가 꺼져 있어도 전송함! 마치 이사 갔는지 안 갔는지 몰라도 해당 주소에 우편물 보내듯
2) 비신뢰성: 중간에 패킷이 사라지거나 순서대로 오지 않을 수 있음
➡️ 서버를 타고 오고 가다가 해당 서버가 꺼지면 패킷이 소실될 수 있음
➡️ 패킷의 크기가 매우 클 경우, 보통 1500byte 이상 정도가 되면 한 패킷을 잘라서 보내게 되는데 해당 순서가 지켜진다는 보장이 없음
1 packet: Hello,
2 packet: world!
// 패킷이 꼭 같은 서버를 타지는 않음!
// 나는 Hello, world! 로 보냈으나 상대방은 world! Hello, 로 받을 수도 있음
3) 프로그램 구분: 같은 IP를 사용하는 서버에서 통신하는 애플리케이션이 둘 이상일 수 있음
➡️ 같은 컴퓨터로 음악과 게임을 같이 한다면 어떻게 구분?
🤔 이 문제점들을 해결하기 위해 나온 것들이 TCP, UDP!
📍 TCP
👉🏻 인터넷 프로토콜 스택의 4계층
애플리케이션 계층 - HTTP, FTP - 웹 브라우저, 네트워크 게임, 채팅 프로그램
[SOCKET 라이브러리]
전송 계층 - TCP, UDP -
인터넷 계층 - IP
네트워크 인터넷 계층 - LAN 드라이버, LAN 장비
1. 프로그램이 Hello, world! 메시지 생성
2. SOCKET 라이브러리를 통해 전달
3. TCP 정보 생성, 메시지 데이터 포함
4. IP 패킷 생성, TCP 데이터 포함
👉🏻 패킷(packet) = package + pocket의 합성어
✅ TCP/IP 패킷 정보
IP 패킷 + TCP 세그먼트(출발지, 도착지의 port / 전송 제어 / 순서 / 검증 정보 등)
✅ TCP(Transfer Control Procotol, 전송 제어 프로토콜) 특징
1) 연결지향: TCP 3 way handshake(가상연결) - 먼저 연결을 한 뒤에 메시지를 보냄
➡️ TCP 3 way handshake
Client 👉🏻 Server (1) SYN: 접속 요청
Client 👈🏻 Server (2) SYN + ACK: 접속요청 + 요청 수락
Client 👉🏻 Server (3) ACK: 요청 수락
Client 👉🏻 Server (4) 데이터 전송
(참고! 3. ACK와 함께 데이터 전송 가능)
✏️ 단, 이때의 연결은 물리적인 연결이 아닌 논리적인 연결을 뜻함!
2) 데이터 전달 보증
➡️ 클라이언트가 데이터 전송 시 서버가 데이터를 전달받았다는 응답을 주기 때문에 해당 데이터가 제대로 전달되었는지 알 수 있음
3) 순서 보장
➡️ 큰 메시지를 잘라서 보낼 경우, 순서가 엉킨 채로 도착한다면 서버에서 잘못된 순서의 패킷부터 모두 버리고 다시 요청함
➡️ 신뢰할 수 있는 프로토콜
➡️ 현재는 대부분 TCP 사용
📍 UDP(User Datagram Protocol, 사용자 데이터그램 프로토콜) 특징
👉🏻 하얀 도화지에 비유(기능이 거의 없음)
👉🏻 연결지향 TCP 3 handshake 없음
👉🏻 순서 보장 없음
👉🏻 데이터 전달 보증 없음
👉🏻 데이터 전달 및 순서가 보장되지 않지만 단순하고 빠름
➡️ 즉, IP에서port, 체크섬(해당 데이터가 맞는지 검증) 정도만 추가
🤔 그럼 얘를 왜 써요?
➡️ TCP에 비해서 속도가 빠르고 애플리케이션 레벨에서 다양한 커스텀이 가능함!
➡️ 최근 매우 활발히 사용 중
📍 PORT: 같은 IP 내에서 프로세스를 구분
👉🏻 컴퓨터 1대로 게임/화상통화/웹 브라우저를 함께 사용한다면 각 서비스와의 요청과 응답 패킷이 누구의 것인지 알 수 있을까?
👉🏻 TCP/IP패킷을 이용하면 출발지와 도착지의 port를 알 수 있기 때문에 가능함!
▶️ 아파트가 IP라면, port는 몇 동 몇 호!
▶️ 0 ~ 65535: 할당 가능
▶️ 0 ~ 1023: 잘 알려진 포트이므로 사용하지 않는 것이 좋음
▶️ FTP - 20, 21
▶️ telnet - 23
▶️ HTTP - 80
▶️ HTTPS - 443
📍 DNS(Domain Name System)
👉🏻 IP는 기억하기 어렵고 변경될 수 있음!
👉🏻 전화번호부와 같은 도메인명을 IP 주소로 변경할 수 있음
도메인명 | IP |
google.com | 100.100.100.1 |
aaa.com | 200.200.200.2 |
▶️ 내가 도메인명으로 찾으면 해당 도메인에 연결된 IP를 찾아줌