- 인터넷에서, 내가 누군가에게 메세지를 전달할때 어떤 방식으로 전달될까?
IP(인터넷 프로토콜)
- IP를 통해서 우리는, 누군가에게 메세지를 전달할 수 있다.
- IP는 지정한 IP주소에 데이터를 패킷이라는 데이터로 전달한다.
- 클라이언트는 IP 패킷에 출발지의 IP, 목적지의 IP, 요구 사항등을 서버에 보내는데,
- 이렇게 보내지면 목적지의 IP를 따라서 노드를 건너 서버에 도착한다.
- 서버에서 이 IP 패킷을 받으면 서버는, 적혀져 있는 출발지의 IP 주소를 이용해 데이터를 클라이언트에 전송한다.
IP 프로토콜의 한계
- 비연결성
- IP프로토콜은, 데이터를 전송하기 전에 서로 연결하는 단계를 거치지 않는다.
(TCP는 데이터를 전송하기 전에 연결하는 단계를 거친다.)
- 이런점에서, 데이터를 전송할때 상대방의 연결이 잘 되어있는지 확인할 수 없다.
- 상대방의 연결이 잘 안되어 있다고 하더라도, 패킷을 전송시킨다. (알 수 없으므로)
- 비신뢰성
- 패킷이 중간에 소실되어지더라도 알 수 없다.
- 패킷의 전달 순서가 보장되지 않는다.
(패킷이 크면, 패킷을 나누어 전송하는데 패킷의 순서를 받는 쪽이 알 수 없다.)
- 프로그램 구분
- 사용자가 다양한 프로그램을 사용한다고 가정하면, IP의 충돌이 일어날 수 있다.
TCP
- 신뢰할 수 있는 프로토콜
- 현재는 대부분 TCP를 사용한다.
- TCP 3 WAY HANDSHAKE : 비연결성 해결
- 클라이언트가 서버에 SYN (접속요청)
을 보내면,
- 서버는 클라이언트에 ACK (요청수락)
하고 SYN (접속요청)
을 보낸다.
- 클라이언트는 서버로부터 받은 SYN (접속요청)
에 ACK (요청수락)
한다.
- 쉽게 말하자면, 데이터를 송수신하기전에 서로 지금 가능한 상태인지에 따라서 연결을 먼저 하고 연결을 확인하는 과정을 거친다.
-
데이터 전달 보증 : 비신뢰성 해결
- 클라이언트가 서버에 데이터를 전송하면, 서버는 클라이언트에 데이터를 잘 받았다고 전송한다.
-
순서 보장 : 비 신뢰성 해결
- TCP내부에는 패킷의 순서가 적혀져 있어, 서버는 이를 보고 받아야 하는 패킷의 순서를 인지한다.
- 잘못된 순서의 패킷이 전달되면, 맞는 순서의 패킷을 다시 요청한다.
-
포트의 사용 : 프로그램 구분 해결
- TCP의 패킷에는 출발지의 PORT와 목적지의 PORT정보다 담기는데, 이를 통해서 다양한 프로그램을 사용할때 충돌을 방지하고 프로세스를 구분할 수 있다.
- 예를들어, 웹 브라우저 요청 포트는 10010
의로 정해두면 해당 포트만을 이용해 웹브라우저 요청이 진행되고 동시에 다른 포트에서는 게임을 할 수 있는 식이다.
UDP
- UDP는 User Datagram Protocol의 준말이다.
- UDP는 가지고 있는 기능이 거의 없다.
- TCP가 가지고 있던 기능-순서보장-등이 없다.
- 오히려 가지고 있는 기능 자체가 거의 없다는 점에서 빠르다.
- 애플리케이션의 추가 작업을 통해서, 최적화를 다양하게 할 수 있다.
- HTTP3에서 사용된다.
DNS : Domain Name System
- 도메인명을 특정한 IP 주소로 변환하는 것이다.
- 예를 들어, 도메인 명의
google.com
은 dns
서버를 사용해서 200.200.200.2
로 IP를 확인할 수 있다.
자바스크립트에서 DNS 이용하기.
- 자바스크립트에서 DNS를 이용해서 아주 간단히 특정 URL의 IP주소를 얻을 수 있다.
(DNS api의 기능은 아주 다양한 것 같지만, 일단 ip주소를 얻는 것 부터..😂)
const dns = require('dns');
const google = dns.lookup('google.com', (err, address) => {
console.log(address);
})