on
1. 인터넷 네트워크
1. 인터넷 네트워크
본 게시글은 https://www.inflearn.com/course/http-웹-네트워크/dashboard
이 강의를 수강한 내용을 바탕으로 작성했습니다.
기본적으로 영한님이 HTTP에 대해 강조를 정말 많이 하시고, 인프런에서 판매하는 강의들 중에 가장 저렴함에도 불구하고 꼭 들었으면
좋겠다고 강조하시는 강의인데, 여태 복습을 미뤄두고 있었다. 강의에서 설명하시는 내용을 기반으로 글을 작성하되 중간에 HTTP와
네트워크 관련된 책을 구매했는데 그 책을 읽으면서 추가할 내용이 있으면 추가할 예정이다.
이 포스팅에서 살펴볼 것은 다음과 같다.
IP(인터넷 프로토콜)
TCP, UDP
PORT
DNS
인터넷에서 컴퓨터 둘은 어떻게 통신할까?
일반적인 클라이언트-서버 구조를 떠올려보자. 클라이언트가 요청을 보내면 서버는 요청을 받고 적절한 응답을 다시 클라이언트 측으로 전송한다. 이 가운데에 인터넷이라는 것이 존재하고 그 인터넷 환경 안에는 수많은 노드들이 존재한다. 인터넷망은 실제로 상당히 복잡하게 되어어 있다. 수많은 노드들이 존재한다.
그렇다면 클라이언트의 요청은 이 수많은 노드들을 어떻게 거쳐서 서버로부터 적절한 응답을 얻을 수 있을까?
이 복잡한 노드들 사이에서 클라이언트가 서버로부터 요청을 보내고 적절한 응답을 얻으려면 최소한의 규칙이 있어야 한다. 이 때 필요한 것이 바로 IP 주소를 부여하는 것이다. 우선 클라이언트가 IP 주소를 부여받아야 한다. 그리고 서버의 IP 주소를 알고 있어야 한다.
IP주소
IP 주소 즉, 인터넷 프로톸ㄹ의 역할은 지정한 IP 주소에 데이터를 전달하고 패킷이라는 통신 단위로 데이터를 전달한다.
IP 패킷은 다음과 같이 출발하는 곳의 IP, 목적지 IP, 기타 등등의 내용과 전송 데이터를 담고 있다.
이렇게 출발지와 목적이 그리고 전송데이터를 담은 패킷을 전송하게 되면 노드를 타고 서버로 도착한다.
그러면 다음 아래의 화면처럼 서버가 다시 응답 패킷을 인터넷에 던지게 된다. 다만 이때 서로 거쳐가는 노드는 다를 수 있다.
근데 이런 IP 프로토콜은 한계를 가지고 있는데 나열하자면 다음과 같다.
비연결성 : 패킷을 받을 대상이 없거나 서버가 서비스 불능 상태여도 패킷을 전송한다.
비신뢰성 : 중간에 패킷이 사라지거나 패킷이 순서대로 오지 않을 수도 있다.
프로그램 구분 : 같은 IP를 사용하는 서버에서 통신하는 애플리케이션이 둘 이상일 경우.
이러한 문제를 해결하기 위해 등장한 것이 바로 TCP와 UDP이다.
TCP와 UDP
TCP가 내가 보낸 전송데이터를 감싸는 과정은 위와 같다. 이전에는 IP 패킷으로만 전송 데이터를 감싸고 있었다면 IP 패킷보다 좀 더 작은 TCP 패킷을 감싸준 것이다. TCP 패킷에 포함되는 정보는 출발지의 PORT와 목적지의 PORT, 전송 제어, 순서, 검증 정보 등이 포함된다.
TCP의 특징
연결 지향 - TCP 3 way handshake(가상 연결)
데이터 전달 보증
순서 보장
신뢰할 수 있는 프로토콜
현재는 대부분 TCP를 사용한다.
TCP 3 handshake란 , 클라이언트가 먼저 SYN이라는 접속 요청을 보낸다. 그러면 서버는 SYN에 ACK(요청 수락) 메세지를 다시. 클라이언트에 보낸다. 그러면 클라이언트는 다시 ACK 메시지를 서버에 보낸다. 이런 방식으로 서로의 연결을 보장한다. 하지만 이는 물리적으로 연결된 것이 아닌 가상으로 연결된 상태이다.
순서 보장의 경우에는 패킷1, 패킷 2, 패킷 3 순서로 클라이언트가 전송했다고 가정하자, 그런데 서버에는 패킷 1, 패킷 3, 패킷 2 순서대로 도착했다. 이 경우 서버는 클라이언트에 패킷 2부터 다시 보내라고 요청한다.
UDP
UDP는 위에서 언급한 TCP의 특징을 다 가지고 있지 않다. 데이터 전달 및 순서가 보장되지도 않는다. IP와 거의 같다. IP와 다른점은 포트와 체크섬 정보만 추가가 되어있다. 그래서 애플리케이션에서 추가 작업이 필요하다. 하지만 최근에 각광을 받고 있는데 웹 브라우저에서 HTTP 통신을 할때 HTTP3 스펙에서 SYN과 ACK를 보내는 과정을 생략하는 시도가 이뤄지고 있는데 이 과정에서 UDP를 쓰기 때문이다.
PORT
만약 내가 하나의 컴퓨터로 여러 개의 서버에 저마다 다른 요청을 보낸다면 서버는 저마다 각 다른 응답 패킷을 보낼 것이다. 그러면 이때 클라이언트 컴퓨터는 이 패킷을 구분할까? 이때 PORT를 사용한다. 즉 서버 혹은 클라이언트 안에서 애플리케이션을 구분하는 용도라고 생각하면 편할 것이다.
DNS
IP는 기억하기도 어렵고 변경될 수도 있다. 특히 IP가 변경될 경우에는 신규 IP 주소를 알아야지만 클라이언트와 서버간에 상호작용이 가능해진다. 그런데 이런 IP의 변경을 늘 추적할 수 있는 상황은 현실적으로 매우 복잡하고 귀찮은 작업이 될 것이다.
이때 DNS, Domain Name System을 사용하는데 비유하자면 전화번호부와 같다고 할 수 있다. 도메인 명을 IP 주소로 변환하여 도메인 명을 Key로 갖고 IP 주소를 Value로 가지고 있는 서버를 DNS 서버라고 한다. 그림으로 표현하면 아래와 같다.
from http://wisehero10.tistory.com/12 by ccl(A) rewrite - 2021-12-04 08:01:20