해당 자료는 인프런 김영한 님의 모든 개발자를 위한 HTTP 웹 기본 지식을 참고하여 작성하였습니다.
https://www.inflearn.com/course/http-웹-네트워크/dashboard
IP(인터넷 프로토콜)
인터넷 프로토콜 역할
- 지정한 IP 주소(IP Address)에 데이터를 전달합니다.
- 패킷(Packet)이라는 통신 단위로 데이터를 전달합니다.
IP 패킷 정보
- 출발 IP
- 목적 IP
- 그 밖에도 많은 정보를 담고 있습니다.
클라이언트 패킷 전달
IP 프로토콜의 규약에 따라 출발지 IP Address에서 목적지 IP Address로 노드들을 거치면서 전달되어, 최종적으로 목적지(IP Address)에 도착하게 됩니다.
서버 패킷 전달
목적지에 잘 전달되면, 응답으로 클라이언트의 IP Address로 응답 패킷을 전달합니다.
참고: 클라이언트 → 서버, 서버 → 클라이언트로 패킷이 전송될 때는 인터넷망이 복잡하기 때문에 서로 다른 경로로 전달될 수 있습니다.
IP 프로토콜의 한계
- 비연결성
- 패킷을 받을 대상이 없거나 서비스 불능 상태여도 패킷을 전송합니다.
- 비신뢰성
- 중간에 패킷이 사라지면 어떻게 될까요?
- 패킷이 순서대로 도착하지 않으면 어떻게 될까요?
- 프로그램 구분
- 같은 IP를 사용하는 서버에서 통신하는 애플리케이션이 둘 이상이면 어떻게 구분할까요?
이러한 문제를 해결하기 위해 나온 방식이 TCP, UDP입니다.
TCP, UDP
프로토콜 계층
인터넷 프로토콜 스택은 4계층으로 구성됩니다.
- 애플리케이션 계층: 웹 브라우저, 네트워크 게임, 채팅 프로그램에서 메시지를 Socket 라이브러리를 통해 OS 계층으로 전달합니다.
- OS 계층의 TCP에서 TCP 세그먼트로 감싸줍니다.
- IP에서 IP 패킷을 생성한 후 TCP 세그먼트를 감싸줍니다.
- 네트워크 인터페이스에서 Ethernet frame으로 감싸줍니다(랜카드의 맥 주소 등).
TCP 특징
전송 제어 프로토콜(Transmission Control Protocol)
연결지향 - TCP 3-way handshake(가상 연결)
- 클라이언트가 서버로
SYN연결 요청을 전송합니다. - 서버가 클라이언트로
SYN + ACK로 응답합니다(나도 연결해 달라는 의미). - 클라이언트가 서버로 알겠다는 의미로
ACK를 전송합니다.
이제 클라이언트와 서버 간에 신뢰성 있게 연결할 수 있습니다. 이후 데이터를 전송합니다.
참고: 실제로 물리적으로 연결되는 것이 아니라 개념적으로 연결되는 것입니다.
- 클라이언트가 서버로
데이터 전달 보증 클라이언트에서 서버로 데이터를 전송할 때, 잘 받았는지 응답 유무에 따라 전달 보증을 확인할 수 있습니다.
순서 보장
- 클라이언트가 서버로 패킷을 전송할 때 패킷 순서를 확인합니다.
- 패킷 순서가 맞지 않으면 맞는 패킷까지 보관하고, 나머지 영역은 버립니다.
- 버린 영역을 순서에 맞게 다시 달라고 클라이언트에게 요청합니다.
참고: 순서 등은 TCP/IP 패킷 정보의 전송 제어, 순서 정보 등으로 확인합니다.
신뢰할 수 있는 프로토콜입니다.
현재는 대부분 TCP를 사용합니다.
UDP 특징
사용자 데이터그램 프로토콜(User Datagram Protocol)
- 하얀 도화지에 비유할 수 있습니다(기능이 거의 없음).
- 연결지향(TCP 3-way handshake)이 없습니다.
- 데이터 전달을 보증하지 않습니다.
- 순서를 보장하지 않습니다.
- 데이터 전달 및 순서가 보장되지 않지만, 단순하고 빠릅니다.
- 정리
- IP와 거의 같고, PORT와 체크섬 정도만 추가됩니다.
- 애플리케이션에서 추가 작업이 필요합니다.
참고: 요즘에는 웹 브라우저에서 HTTP 통신을 할 때 최대한 간편하게 동작하는 것을 원하기 때문에, 3-way handshake도 줄여서 속도를 빠르게 하려는 취지에서 UDP가 많이 각광받고 있습니다.
PORT - 같은 IP 내에서 프로세스 구분
현재 PC에서 게임, 영상통화, 웹 브라우징을 동시에 사용하고 있다고 가정하면 여러 개의 패킷을 동시에 전달받을 수 있습니다. 이때 포트를 통해서 해당하는 영역으로 전송하게 됩니다.
그렇다면 포트는 어떻게 구분할 수 있을까요? TCP/IP 영역에서 TCP 세그먼트 안에 출발지 PORT와 목적지 PORT 정보가 들어 있기 때문입니다.
정리하면, IP는 목적지를 찾고 PORT는 서버 안에서 돌아가는 애플리케이션을 찾습니다.
PORT
- 0 ~ 65535까지 할당 가능합니다.
- 0 ~ 1023: 잘 알려진 포트로, 사용하지 않는 것이 좋습니다.
- FTP - 20, 21
- TELNET - 23
- HTTP - 80
- HTTPS - 443
DNS
IP는 기억하기 어렵고 변경될 수 있습니다. 기존 서버의 IP가 200.200.200.2에서 200.200.200.3으로 변경되면 클라이언트는 헷갈릴 수 있습니다. 이를 해결하는 방법이 DNS 서버입니다.
- DNS 서버를 사용해서 도메인 명으로 해당하는 IP를 찾을 수 있습니다.
- IP가 변경되어도 도메인 명이 유지되므로 사용자는 헷갈릴 일이 없습니다.
이 글은 인프런 김영한 님의 모든 개발자를 위한 HTTP 웹 기본 지식을 들으며 정리한 노트입니다.
댓글
GitHub 계정으로 로그인하시면 댓글과 질문을 남기실 수 있습니다. 남겨 주신 글은 이 저장소의 Discussions에 쌓입니다.