🧐 인터넷망에서 컴퓨터는 어떻게 통신할까?
클라이언트와 서버가 붙어있다면 케이블로 연결한 후, Hello, world! 메세지를 보내고 서버에서 연결한 케이블로 메세지를 받으면 된다.
그런데 클라이언트와 서버 중간에 인터넷망이 있으면 어떻게 될까?
한국에서 미국으로 "인터넷망"을 통해서 메시지를 보내야 한다. 이 인터넷망에서 데이터가 어떤 규칙으로 어떻게 넘어가는지에 대해 이해하기 위해 먼저 IP에 대하여 알아보자.
IP주소 부여
📌 IP(인터넷 프로토콜)의 역할
클라이언트와 서버에 모두 IP주소가 있어야 하고 메시지를 보낼 때 패킷이라는 규칙으로 보내야 한다.
📌 IP 패킷 정보
IP 패킷 정보: 출발지 IP, 목적지 IP, 전송 데이터, 기타...
IP 프로토콜에 의해서 서버들이 규약을 따르고 있기 때문에 패킷의 정보를 이해할 수 있다.
클라이언트와 서버 사이에 있는 인터넷망은 수많은 노드로 구성되어 있다.
인터넷망에서 내가 보낸 패킷을 노드끼리 출발지와 목적지가 어딘지 이해하면서 목적지 IP까지 데이터가 전송된다.
❗ 클라이언트와 서버의 패킷 전달 경로는 서로 다를 수 있다.
📌 IP 프로토콜의 한계
패킷의 용량이 크면 여러 패킷을 끊어서 보내는데(문자의 경우 1500바이트 정도), 최단노드를 찾아서 보내므로 아래 사진과 같이 순서가 바뀌어서 도착할 수도 있다.
이러한 문제를 TCP 프로토콜이 해결해준다.
📌 프로토콜 4계층
'Hello World!'라는 메시지를 보낼 때 socket 라이브러리를 통해 OS 계층에서 TCP 정보를 생성한다. 그 밑에 IP와 관련된 데이터를 씌워준다. 이렇게 해서 IP 패킷이 생성된다.
IP 패킷에는 IP와 관련된 정보, TCP와 관련된 정보가 있다. 이 메시지는 랜카드를 통해서 나갈 때 이더넷 프레임을 포함해서 나가게 된다.
(💡Ethernet frame: 램 카드에 등록된 맥주소같은 물리적 정보가 포함되어 있다.)
📌 TCP/IP 패킷 정보
TCP와 관련된 정보에는 출발지, 목적지 port, 전송 제어, 순서, 검증 정보 등이 들어가 있다. 따라서 IP 프로토콜의 패킷 소실, 순서 제어와 같은 한계점들을 TCP 프로토콜에서 해결할 수 있다!!
📌 TCP(Transmisson Control Protocol: 전송 제어 프로토콜) 특징
- 클라이언트가 먼저 SYN 메시지를 전달한다.
- 서버는 ACK 메시지를 보내면서 서버도 접속을 허락해달라고 SYN 메시지를 클라이언트에게 전달한다.
- 클라이언트가 접속을 허락하면 ACK 전달한다.
(➕요즘 최적화가 잘 되어 있어 ACK를 보낼 때 데이터도 같이 전송한다.- 서로 연결이 되고 난 후, 데이터를 전송한다.
이렇게 서버와 클라이언트가 SYN, ACK 응답을 통해 서로 연결되었는지를 알 수 있게 된다. 만약 서버가 꺼져 있다면 SYN 메시지를 보냈을 때 서버에서 응답이 없기 때문에, 클라이언트는 문제를 인식하고 연결이 되지 않게 된다.
패킷 순서가 다르면 최적화 로직에 따라서 2번부터 다시 보내라고 클라이언트에 요청하게 된다. 그렇기 때문에 TCP에서 순서를 보장할 수 있게 된다.
💡 위와 같이 데이터 전달 보증, 순서 보장이 가능한 이유
TCP 정보 안에 전송 제어, 순서, 검증 정보가 추가되어 있기 때문이다. 그래서 TCP를 신뢰할 수 있는 프로토콜이라고 이야기한다.
📌 UDP(User Datagram Protocol:사용자 데이터그램 프로토콜)의 특징
👉 TCP는 데이터 양이 많고 3 way handshake 때문에 전송 속도가 느리다. 반면, UDP는 기능이 거의 없기 때문에 단순하고 전송 속도가 빠르다.
✏️ IP와 TCP의 차이점
: TCP는 IP와 유사하지만 내 IP로 여러 패킷(게임용, 음악 스트리밍용)이 올 때 어떤 패킷인지 구분하기 위해 PORT를 사용하고, 그 메시지를 검증해주는 체크섬 기능이 있다.
🧐 한 번에 둘 이상 연결해야 한다면?
위 사진처럼 클라이언트에서 친구와 화상통화를 하면서 게임을 하고 웹 브라우저를 사용하고 있다면 여러 개의 서버와 통신해야 한다.
IP로만 해결을 하려면 위와 같이, 나의 IP로 여러 패킷이 전송될 때 어디서 온 패킷인지 알 수가 없다. 반대도 마찬가지이다.
위에 적혀있는 📌 TCP/IP 패킷 정보에서 알 수 있듯이 TCP와 UDP에 출발지 PORT와 목적지 PORT가 있다.
➕➕
IP = 목적지 서버를 찾는 것.
PORT = 서버 안에서 돌아가는 애플리케이션을 구분하는 것.
📌 PORT는 같은 IP 내에서 프로세스를 구분한다.
TCP/IP 패킷을 보낼 때 IP와 PORT를 포함해서 보내기 때문에 위 사진처럼 각각 클라이언트와 서버에 맞는 PORT 번호를 찾아서 연결하면 된다.
📌 PORT 번호
📌 IP 주소의 문제점
IP는 숫자로 되어 있어 기억하기가 어렵다. 또한, IP주소가 변경돼서 접속이 안 되는 경우가 발생한다.
📌 DNS(Domain Name System: 도메인 네임 시스템)
이러한 문제점을 해결하기 위하여 DNS가 생겼다. DNS에 구매한 도메인을 등록할 수 있다.
클라이언트가 DNS 서버에, 도메인에 맞는 IP를 달라고 요청하면 DNS 서버가 응답하고 클라이언트는 서버에 도메인으로 접속할 수 있다.
나중에 IP가 변경된다면, DNS 서버에 등록된 도메인에 IP를 변경하면 된다.