만약 클라이언트와 서버가 바로 옆에 붙어 있다면 케이블 등으로 연결해서 통신할 수 있다.
그러나 하나의 예를 들어보자.
나는 한국에 있고 내가 메세지를 보내고자 하는 친구는 미국에 있다. 비행기로 최소 10시간이 걸리는 거리를 케이블을 이용해서 연결하는 것은 불가능에 가까울 것이다.
이때 인터넷 망을 통해서 메세지를 보내야 한다. 그러나 인터넷 망은 매우 복잡한다. 내가 보낸 메세지가 수많은 노드들을 거쳐서 미국에 있는 친구의 pc까지 안전하게 갈 수 있어야한다.
그렇다면 어떻게 내가 보낸 메세지가 어떤 규칙과 방식으로 복잡한 인터넷 망을 거쳐서 친구의 pc에 도착할까?
이를 이해하기 위해서는 IP(인터넷 프로토콜)에 대해서 알아야한다.
나와 친구의 pc에 다음과 같이 IP 주소를 부여하자.
100.100.100.1
200.200.200.2
일단 ip 주소는 부여했는데 IP가 무엇일까?
IP(인터넷 프로토콜)의 역할
내가 친구에게 메세지를 보낼 때 그냥 보내는 것이 아닌 IP 패킷이라는 규칙이 존재한다.
IP 패킷은 전송 데이터에 "Hello, world!"를 넣을 때 그 밖에서 나의 ip와 친구의 ip 두 개를 적어줘야한다. 마치 주소를 적듯이 말이다.
그렇다면 위 사진처럼 출발지 ip, 목적지 ip, 데이터를 담은 패킷이 노드를 타고 전송되면서 목적지 ip에 해당하는 친구의 pc에 도달한다.
이때 친구가 메세지를 수신했다면 친구도 출발지 ip, 목적지 ip, 메세지를 수신했다는 OK 전송데이터를 다시 나의 pc로 보낸다.
그러나 IP(인터넷 프로토콜)도 한계가 존재한다.
IP 프로토콜의 한계
이런 문제를 해결해주는 것이 TCP, UDP 프로토콜이다.
위에서 TCP가 IP(인터넷 프로토콜)의 한계를 해결해준다고 언급했다. TCP는 출발지 PORT, 목적지 PORT, 전송 제어 정보, 순서 정보, 검증 정보 등을 포함하고 있어서 IP만으로는 해결이 안되었던 순서 문제 등을 해결한다.
채팅 프로그램을 통해서 미국에 있는 친구에게 메세지를 전송하고 싶다고 해보자. 그렇다면,
1. 소켓 라이브러리를 통해서 "Hello, world!" 를 OS계층에 넘긴다.
2. 그렇다면 TCP가 메세지 정보에게 TCP 정보를 한 겹 씌운다.
3. 한 칸 더 내려가서 IP 계층에서 IP를 씌어서 IP 패킷을 만든다.
TCP 특징
전송 제어 프로토콜(Transmission Control Protocol)
연결지향 - TCP 3 way handshake (가상 연결)
데이터 전달 보증
순서 보장 -> 내가 보낸 순서대로 데이터가 도착함
신뢰할 수 있는 프로토콜
현재는 대부분 TCP를 사용한다.
한 가지 예를 들어서 설명을 해보겠다. TCP의 3 way handshake는 IP에서 문제가 되었던 비연결성을 해결한다.
1. 내가 친구와 메세지를 하고 싶다고 해보자.
2. 우선 내 pc는 미국에 있는 친구 pc에게 SYN(접속 요청)
을 보낸다.
3. 친구의 PC는 연결 가능한 상태라면 SYN
과 ACK(요청 수락)
을 내 PC에게 보낸다.
4. 내 PC는 친구 PC의 요청을 받고 연결 가능한 상태라면 ACK
를 친구의 PC에게 보낸다.
이 과정까지 끝난다면 나는 친구와 메세지를 주고받을 수 있는 상태가 되었다.
이와 같은 과정이 생기면서 비연결성 문제를 해결할 수 있다.
하얀 도화지에 비유(기능이 거의 없음)
연결지향 X - TCP 3 way handshake X
데이터 전달 보증 X
순서 보장 X
데이터 전달 및 순서가 보장되지 않지만, 단순하고 빠름
정리
지금까지 TCP에 대해서 알아보았다. 그런데 만약 친구와 게임도 하면서 화상통화도 같이 하고 한 쪽에는 넷플릭스도 틀었다고 해보자.
한 번에 여러 요청을 한다면 각각의 서버에서 패킷이 날라올텐데 게임에서 온 패킷인지, 화상통화에서 온 패킷인지, 웹 브라우저에서 온 패킷인지 어떻게 구별할까?
이때 사용되는 것이 이전에 TCP를 소개할 때 언급했던 PORT이다.
IP는 서버는 찾는 것이고, 서버 안에서 애플리케이션을 구별하는 것이 PORT이다.
위 사진과 같이 게임 서버는 8080 PORT, 화상통화는 21000 PORT, 웹 브라우저는 10010 PORT 등을 사용하며 각 서버에서 오는 패킷을 구분할 수 있다.
PORT 정보
- 0 ~ 65535 할당 가능
- 0 ~ 1023: 잘 알려진 포트, 사용하지 않는 것이 좋음
- FTP - 20, 21
- TELNET - 23
- HTTP - 80
- HTTPS - 443
DNS(Domain Name System)
IP는 기억하기 어렵다. 또한 변경될 수 있다.
IP가 변경된다면 접속하고 싶었던 IP에 접근을 할 수가 없게 된다. 이때 DNS를 사용한다.
만약 구글에 접속하고자 한다고 하자. 나는 google.com 도메인을 작성해서 요청하면 DNS 서버에서는 해당 도메인 명에 맞는 IP 주소를 응답으로 보내준다.
이처럼 DNS를 사용하면 IP 주소를 모르거나 변경되었어도 도메인 명만 안다면 원하는 사이트에 접속할 수 있게 된다.
출처
모든 개발자를 위한 HTTP 웹 기본 강의
해당 게시물의 모든 사진 자료는 위 강의의 자료를 사용하였습니다.
좋은 글 감사합니다. 자주 방문할게요 :)