인터넷 통신

클라이언트와 서버는 어떻게 통신할까요? 만약 클라이언트와 서버가 바로 옆에 있다면, 아래와 같은 방식으로 선을 연결하여 통신하면 됩니다.

하지만 위와 같은 방식대로 한다면 하나의 서버에는 클라이언트마다 선으로 하나씩 연결이 되야하고, 멀 경우에는 선을 연결하는 방법은 비효율적 입니다. 이러한 방법으로는 통신을 할 수 없기때문에, 인터넷  망을 사용해서 통신을 합니다. 그런데 인터넷은 단순하지 않습니다. 중간에 해저 광케이블이 있을 수도 있고, 인공위성을 통해서 갈 수도있고, 알 수 없는 수 많은 중간 노드(서버)들을 통해 원하는 목적지까지 보내야합니다. 그렇다면 어떻게 내가 보낸 요청을 정확하게 목적지까지 노드들을 통해 전달할 수 있을까요?? 이것을 이해하기 위해선 IP에 대해서 학습해야 합니다.

 

 

 

IP(인터넷 프로토콜)

한국에서 미국에 있는 친구에게 "Hello, world!"라는 메시지를 정확하게 보내기 위해서는 규칙이 있어야 할 것 입니다. IP 주소는 이러한 정확한 전달의 책임을 갖고있습니다.

일단 정확한 통신을 하기 위해서는 클라이언트, 서버 모두 각각의 IP를 갖고있어야 합니다.

 

IP의 역할은 지정한 IP 주소에 데이터 전달, 패킷(Packet)이라는 통신 단위로 데이터를 전달입니다. 메시지는 그냥 보내는 것이 아닌 IP 패킷이라는 규칙이 있습니다. 

메시지를 보낼 때 전송 데이터에 "Hello, world!"를 추가하기 전에, 자신의 IP와 목적지 IP를 적어야합니다. 만든 패킷에 전송데이터를 추가한 뒤, 인터넷 망에 전송합니다. 인터넷 망에 있는 노드(서버)들은 공통된 규약이 있기때문에 패킷을 확인할 수 있고 목적에 전달이 되도록 다른 노드로 전달하게 됩니다.

목적지에 패킷이 전달이되면 목적지에선 출발지로 전달이 완료되었다는 패킷을 보냅니다. 참고로 인터넷 망은 복잡하기 때문에 보냈을 때 지나갔던 노드들과 받을 때 지나온 노드들은 다를 수 있습니다.

 

하지만, IP 프로토콜에는 아래와 같은 한계가 있습니다.

 

IP 프로토콜의 한계

  • 비연결성
    • 패킷을 받을 대상이 없거나 서비스 불능 상태여도 패킷 전송

  • 비신뢰성
    • 중간에 패킷이 사라지면?
    • 패킷이 순서대로 안오면?

  • 프로그램 구분
    • 같은 IP를 사용하는 서버에서 통신하는 어플리케이션이 둘 이상이면?

IP의 문제를 해결해주는 것이 바로 TCP 프로토콜 입니다.

 

 

 

TCP, UDP

인터넷 프로토콜 스택 4계층

TCP는 IP위에 살짝 올려서 IP의 부족한 부분을 보완해준다고 보시면 됩니다. 만약 채팅 프로그램에서 미국에 있는 친구한테 Hello, world!라는 메시지를 보내게되면 아래와 같이 작동하게 됩니다. 

위의 그림을 보시면 이전에 배웠던 Packet을 씌우기 전 전송계층에서 초록색 무언가를 씌우는 것을 볼 수 있습니다. 그렇다면 TCP 프로토콜에서는 무엇을 씌웠는지 확인해봅시다. 참고로 IP는 패킷이라 부르고, TCP는 세그먼트라고 부릅니다. 

TCP 세그먼트에는 출발지 PORT, 목적지 PORT, 전송 제어, 순서, 검증 정보 등이 들어갑니다. IP에서 해결이 안됬던 부분들을 전송 제어, 순서, 검증 정보 등을 통해 해결한다고 보면 됩니다. 

 

TCP 특징 - 전송 제어 프로토콜 (Transmission Control Protocol)

  • 연결 지향 - TCP 3 way handshake (가상 연결)
  • 데이터 전달 보증 (메시지 전달이 누락되면 알 수 있습니다.)
  • 순서 보장

TCP는 신뢰할 수 있는 프로토콜이며, 현재 대부분 애플리케이션에서 TCP를 사용합니다.

 

연결 지향

3 way handshake

3 way handshake란 TCP/IP 프로토콜로 연결을 하게되면, 클라이언트에서 서버로 SYN 메시지를 보내고 서버에서 받게되면 SYN+ACK 메시지를 보내고 클라이언트에서 서버로 ACK 메시지를 보내며 클라이언트와 서버가 연결을 하게 됩니다. 이를 통해 신뢰성을 보장받을 수 있습니다. 참고로 요즘은 최적화가 되어서 3번째 ACK를 보낼 때 데이터도 같이 보낸다고 합니다.

 

참고로 진짜 연결된 것이 아닌 개념적으로만 연결이 된 것 입니다. 즉, 논리적으로만 연결이 된 것이지 나를 위한 전용 랜선이 만들어 진 것은 아닙니다.

 

 

데이터 전달 보증

데이터를 전송하면 서버에서 데이터를 잘 받았다고 보내주어서 데이터가 잘 전달이 되었다는 것을 알 수 있습니다.

 

 

순서 보장

예를들어, 아래와 같이 1,2,3 패킷으로 나누어서 메시지를 전송했다고 가정합시다. 서버에는 2,3,1 순서로 도착이 되어지게 되면 잘못된 패킷부터 클라이언트에게 다시 전송하라고 요청합니다. 

물론, 서버 측에서 잘못된 데이터를 최적화할 수 있지만, 기본적인 로직은 위의 로직과 같습니다.  이를 통해 순서가 보장됩니다.

 

 

UDP 특징

  • TCP와 같은 계층에 있는 프로토콜입니다.
  • 하얀 도화지에 비유 (기능이 거의 없음)
  • 연결 지향 - TCP 3 way handshake X
  • 데이터 전달 보증 X
  • 순서 보장 X
  • 단순하고 빠름
  • 정리
    • IP와 거의 같습니다. PORT, CHECKSUM 정도만 추가되었습니다.
    • 애플리케이션에서 추가 작업 필요

PORT는 하나의 클라이언트에서는 다양한 작업을 합니다. 웹 서핑, 음악, 카톡 등 이러한 작업들이 받는 패킷들이 정확하게 받을 수 있도록 해줍니다.

CHECKSUM은 메시지에 대해서 제대로 받는지 검증해주는 데이터만 간단하게 추가가 되어 있습니다.

 

UDP는 최근에 각광받고 있습니다. 이유는 웹 브라우저에서 http통신을 할 때, 최근 Http 3가 나왔는데 3-way-handshake를 줄이며 최적화를 해보자라며 UDP를 사용하게되면서 뜨고있다고 합니다.

 

 

 

PORT

만약 지금 우리의 컴퓨터가 아래와 같은 여러 작업을 한다고 가정합시다.

하나의 PC가 여러개의 서버와 통신해야 합니다. 각각의 서버에서 전달한 패킷들이 클라이언트로 올텐데 게임, 화상통화, 웹 요청 중 어떠한 패킷인지 알 수가 없습니다. 이전의 TCP 세그먼트에 출발지 PORT, 목적지 PORT가 있었습니다. TCP/IP를 사용하는 경우 출발지 IP, 도착지 IP가 패킷에 저장되어 있고 출발지 PORT, 목적지 PORT가 TCP 세그먼트에 담겨져 있습니다. IP는 목적지의 서버를 찾는 것이고, 서버안에서 돌아가는 애플리케이션을 구분하는 것은 PORT라고 보면됩니다.

그렇게 되어 TCP/IP 패킷은 아래와 같다고 보시면됩니다. 

 

아래와 같이 PORT를 통해 클라이언트의 각각 애플리케이션이 정상적으로 통신을 할 수 있게되는 것 입니다.

 

PORT 번호

  • 0~65535 할당 가능
  • 0~1023 : 잘 알려진 포트, 사용하지 않는 것이 좋음
    • FTP - 20, 21
    • TELNET - 23
    • HTTP - 80
    • HTTPS - 443

 

 

 

DNS

IP는 기억하기 어렵습니다. 

또한 IP는 변경될 수 있습니다.

그래서 DNS(Domain Name System)이 있습니다. 전화번호부라고 보면 됩니다. DNS는 아래와 같이 도메인 명을 IP주소로 변환해주는 작업을 합니다.

DNS를 통해 기억하기 어려운 IP를 기억할 수 있고, 바뀐 IP도 도메인 명만 알고 있으면 접근할 수 있도록 해줍니다.

 

 

출처

 

모든 개발자를 위한 HTTP 웹 기본 지식 - 인프런 | 강의

실무에 꼭 필요한 HTTP 핵심 기능과 올바른 HTTP API 설계 방법을 학습합니다., - 강의 소개 | 인프런...

www.inflearn.com

 

+ Recent posts