뭔가 네트워크 포스트 순서가 잘못된 것 같지만,,,기분탓임,,,
반박시 님들 말이 다 맞음...
TCP UDP 어쩌고 등등등
이런 것들을 알아보기 전에 컴퓨터가 어떻게 통신하는지 알아보자.
우리는 보통 클라이언트에서 서버로 통신을 하려고 할 때, 인터넷 망을 사용한다.
그런데 잘 생각해 보면 인터넷 망은 내 PC 뿐만 아니라 다른 PC도 사용하고, 전 세계의 PC나 모바일 기기 등에서 사용한다.
분명 인터넷이 가능한 모든 전자기기는 인터넷 망을 통해 서로 통신을 하는데 어떻게 서로를 알아보고 원하는 곳으로 보낼 수 있는 것 일까?
이를 가능하게 하는 것이 IP(Internet Protocol)이다.
(유튜버 형독 영상 中)
어릴적 게임 좀 해본 사람들이라면 한 번 쯤 이런 협박을 당해봤을 것이다.
아닌가?
각설하고
IP는 쉽게 말해 주소라고 생각하면 이해하기 편하다.
즉, 서로 통신할 때 지정한 IP 주소에 데이터를 전달하는데, 이때 패킷(Packet)이라는 통신 단위로 전달하게 된다.
우선 패킷이란, 패키지 + 버킷의 합성어다.
이를 네트워크에 접목 시켜보면 데이터를 보내기 위한 특수한 데이터 구조로 생각하면 될 것 같다.
IP 패킷은 다음과 같은 데이터로 이루어져 있다.
그림으로 쉽게 알아보자면,
1. 서버로 패킷 전달 (클라이언트 → 서버)
2. 클라이언트로 패킷 전달 (서버 → 클라이언트)
우리 주소로 우편을 받는다고 생각해보자.
만약 집을 이사갔는데, 주소지 갱신을 하지 않았다면? 내 이전 주소로 우편이 도착할 것이다.
또한, 택배나 우편이 중간에 훼손되거나 사라질 수 도 있다. (실제로 겪어봄...)
이와 같이 IP에도 한계가 나타난다.
이러한 한계를 해결하기 위해 TCP라는 녀어석이 나옴
데이터 전송 프로토콜이라고 하는 TCP는 데이터 전달을 보증하고 순서를 보장하는 프로토콜이다.
쉽게 말해, 컴퓨터끼리 '발송 완', '수신 완' 과 같은 확인 메세지를 보내면서 데이터를 주고 받고 통신의 신뢰성을 확립할 수 있다.
이러한 과정을 거치면서 통신의 신뢰성을 확립할 수 있기에 IP의 문제를 보완할 수 있다.
이러한 과정을 TCP 3 Way Handshake라고 한다.
TCP는 IP의 단점을 보완했다고 한 것처럼, IP 패킷에 TCP 패킷을 추가했다고 생각하면 된다.
이처럼 IP 패킷에 있던 데이터와 단순 출발지 및 목적지 등만 있는 것이 아닌 순서와 검증, 전송 제어 정보 등이 함께 들어 있어, IP 의 단점인 비신뢰성과 비연결성을 극복한다.
그리고 IP 패킷 구조에 TCP 패킷 구조를 합쳐서, TCP/IP라고 말한다.
그럼 클라이언트에서 서버로 전송될 때 어떠한 과정을 거치는지 알아보자.
1. 열동이가 자체적으로 만든 채팅 프로그램에 Hello,World! 라는 메세지를 썼다.
2. 해당 메세지는 Socket 라이브러리를 통해 OS로 전달한다.
3. 전달받은 메세지 데이터에 TCP 정보를 씌운다.
4. 그 위에 IP 정보를 덧 씌운다.
5. TCP/IP 패킷을 모두 씌우면 LAN카드를 통해 나가게 되는데 실제 물리적인 정보까지 들어있는 Ethernet Frame을 포함해서 나간다.
그럼 어떠한 방식으로 IP의 단점인 비신뢰성과 비연결성을 극복할 수 있는지 알아보자.
위 사진에는 1번부터 3번이 마치 연결이 된 것처럼 보이지만, 실제로는 연결된 것이 아닌 서로의 확인을 통해 논리적으로 연결이 된 것이다.
SYN은 접속 요청
ACK는 요청 수락
을 뜻하며 클라이언트와 서버 둘 다 요청과 수락을 주고 받는다.
그래서 3번 까지의 과정을 성공적으로 마치면, 그 뒤에 데이터를 전송하는 방식이다.
최근에는 최적화가 잘 되어 있어서 마지막 ACK를 보낼 때 같이 데이터도 전송하는 편이다.
데이터를 전달 보증하는 방법은 데이터를 받았으면 잘 받았다는 응답을 해주면 된다.
그럼, 순서는 어떻게 보장할 까? 간단하게 알아보자.
만약, 이메일의 용량이 매우 커서 3등분 했다고 하자.
이 3등분 한 것을 1번 2번 3번 순서대로 서버에 보냈는데, 서버에 도착한 패킷은 1 3 2 순으로 도착한 것이다.
그럼 서버에서는 데이터가 모두 잘 왔지만, 순서가 달라졌기에 다시 보내달라는 요청을 하고 순서대로 패킷을 받는다.
이렇게 순서도 관리할 수 있는 이유는, 위에 설명한 것처럼 TCP 패킷에 순서에 대한 정보도 담겨 보내기 때문이다.
사용자 데이터그램 프로토콜이라고 한다.
앞선 TCP와 다르게, 비 연결지향적이며, 데이터 전달을 보증하지 않고 순서도 보장하지 않는다.
엥? 그럼 쓰면 안되는거 아닌가? 싶을 수 있는데,
TCP와 달리 비교나 데이터의 안정성 등의 기능이 없기에 단순하며, 오로지 빠른 속도로 패킷을 보내는 것이 주 사용 목적이다.
당연히, 3-Way Handshake도 없다.
즉, 거의 보내는 즉시 받게 하고 싶은 것. 그래서 UDP는 실시간성이 중요한 스트리밍 서비스에 주로 사용된다.
IP와 유사한 구조를 갖는데, IP의 구조에서 PORT와 메세지를 검증해주는 데이터인 체크섬 정도만 추가된 형태이다.
HTTP3에서는 UDP를 사용한다.
이러한 특성 때문에 최적화 및 커스터마이징에 용이한 모습을 보여준다.
IP의 한계 중 프로그램 구분, 같은 IP를 사용하는 서버에서 통신하는 애플리케이션이 두 개 이상인 경우에 대해 알아보았다.
즉, PC로 들어가는 IP주소는 알고 있지만, 한 대의 PC에 여러 프로그램을 사용하기에 IP 주소를 잘 찾아 왔어도 어느 프로그램으로 보낼지 모르게 된다.
예를 들어,
배달 기사님이 아파트 이름까지는 알았는데, 동호수를 모르는 상태
그래서 이를 구분하기 위해 PORT 가 존재한다.
그리고 PORT의 정보는 위에 TCP에서 다루었듯이, TCP 패킷을 감쌀 때 같이 저장한다.
PORT 번호의 범위는 0 ~ 65,535 이따. (unsigned short처럼 16비트 크기와 같다)
그럼 우린 IP 주소도 알고 PORT 번호도 알고 있으면 데이터를 보낼 수 있다.
그럼 된거 아님?
하지만 우리가 코딩할 때, 메모리 주소를 일일히 알고 있지 않고 변수에 저장하여 사용한다.
int port = 8080; String ip = "어쩌고 저쩌고";
DNS도 같은 원리라고 생각하면 된다.
즉, 숫자로만 이루어진 주소는 가독성이 매우 떨어진다. 또한, IP는 언제든지 변경될 수 있으므로 숫자로만 알고 있다면 이미 예전 IP 주소로 내 데이터를 보낼지도 모른다.
그래서 이런 IP주소에 이름을 붙여주는 것이 DNS이다.
예를 들어, 우리가 www.google.com 을 치면 구글의 회사 서버 주소를 알지 않아도 구글 페이지에 접속할 수 있는 것
https://velog.io/@yes_jihyeon/HTTP-%EC%9D%B8%ED%84%B0%EB%84%B7-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-IP-TCP-UDP-PORT-DNS%EC%9D%98-%EA%B0%9C%EB%85%90%EA%B3%BC-%EC%98%88%EC%8B%9C
https://www.inflearn.com/course/http-%EC%9B%B9-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC
https://inpa.tistory.com/entry/%EC%9B%B9-%ED%86%B5%EC%8B%A0-%EA%B8%B0%EB%B3%B8-%EC%9D%B4%EB%A1%A0-%ED%86%B5%ED%95%A9-%EC%9A%94%EC%95%BD-%EC%A0%95%EB%A6%AC