웹 공부하기/HTTP

[인프런] 모든 개발자를 위한 HTTP 웹 기본 지식 (인터넷 네트워크)

웹이나 HTTP도 인터넷 네트워크 망을 기반으로 동작하기에 기초 지식을 배워보자!

 

인터넷 통신

인터넷에서 컴퓨터 둘은 어떻게 통신할까? 그냥 케이블 연결해서 하면 되지 않아?

그럼 엄청 멀리 떨어져 있는 컴퓨터들 (해외에 있다면?) 어떻게 통신해?

인터넷을 통해 전달을 하려하는데 인터넷은 되게 복잡한 구조로 되어 있어서 여러 규칙들에 의해 전달된다.

 

그럼 그 규칙은 무엇일까?

 

IP (인터넷 프로토콜)

그 규칙은 IP 즉, 인터넷 프로토콜을 이용하는 방법이다. 클라이언트(나)와 서버(친구)에게 각각 다른 IP 주소를 부여한다.

인터넷 프로토콜의 역할은 지정한 IP 주소에 데이터를 전달하는 것이다. 이 때, 패킷(Packet)이라는 통신 단위를 사용한다. IP 패킷에는 출발지 IP, 목적지 IP, 기타 내용을 작성하고 전송 데이터를 담아 인터넷에 전달한다. 그럼 인터넷 망에 있는 노드가 목적지 IP를 찾아 전달 전달 전달 되어 목적지에 도착하게 된다.

 

그러나 이 방법에는 다음과 같은 한계가 있다.

  • 비연결성: 패킷을 받을 대상이 없거나 서비스 불능 상태여도 패킷을 전송한다. ex) 친구가 컴퓨터를 꺼둔 상태일수도 있지만 그냥 패킷 전송함 마치 친구가 이사간지도 모르고 그 주소로 편지를 보내는 것 처럼.. 친구가 그 집에 없어도 편지는 결국 그 집으로 도착할테니까..
  • 비신뢰성: 노드 서버의 문제로 중간에 패킷이 사라질 수도 있고, 패킷이 전송 순서대로 도착하지 않을 수도 있다.
  • 프로그램 구분: 같은 IP를 사용하는 서버에서 통신하는 애플리케이션이 두개 이상일 때 어떻게 구분할 지도 문제이다.

 

그렇다면 이와 같은 문제를 해결할 수 있는 방법은 무엇일까?

 

TCP, UDP

바로 TCP이다. TCP는 전송 제어 프로토콜로 앞서 말한 문제를 해결하는 특징을 가지고 있다.

  • 연결지향적: 3 way handshake 방법을 통해 클라이언트와 서버가 연결되었는지 확인할 수 있다.
    1. SYN (씬): 클라이언트가 서버에게 접속 요청
    2. SYN + ACK (에크): 서버가 요청을 수락하고, 자신도 클라이언트에게 접속 요청
    3. ACK: 클라이언트도 요청을 수락
  • 데이터 전달 보증: 클라이언트가 서버에게 데이터를 전송하면, 서버에서 데이터를 잘 받았다고 클라이언트에게 다시 알려준다.
  • 순서 보장: 클라이언트가 패킷 1,2,3 순서로 전송했는데 만약 서버에서 1,3,2 순서로 도착하면 서버에서 패킷 2부터 다시보내라고 알려준다.

이와 같이 안정적인 전달이 가능하여, 신뢰할 수 있는 프로토콜이라고 불린다. 현재 대부분 TCP를 사용하고 있다.

이러한 전달이 가능한 것은 TCP로 감쌀 때 전달되는 정보들 덕분이다. 여기서 PORT는 같은 IP에서 여러 애플리케이션을 사용할 때를 구분하기 위한 것인데, 아래에서 더 자세히 다룬다.

 

그리고 UDP는 사용자 데이터그램 프로토콜인데, 거의 기능이 없다. TCP처럼 연결지향적이지도 않고, 데이터 전달 및 순서도 보장되지 않는다. IP와 유사하지만 PORT와 이를 체크하는 체크섬 정도만 추가되어 있다. 따라서 이를 더 최적화하고 싶다면 애플리케이션에서 추가 작업이 필요하다.

PORT

한 번에 둘 이상을 연결해야 할 때, 즉 하나의 IP 주소에서 여러 애플리케이션을 구분해야할 때 사용하는 것이 PORT이다. TCP/IP 패킷에 출발지 IP,PORT, 목적지 IP,PORT가 들어가 있어 같은 IP 내에서 프로세스를 구분할 수 있다.

 

예를 들어, 게임을 IP가 100.100.100.1이고 PORT가 8090에 연결해두고 게임 서버를 연결하기 위한 요청을 IP가 200.200.200.2이고 PORT가 11220인 곳에 보낸다. 그러면 그 서버는 IP와 PORT가 게임을 가리키는 것을 알고 요청을 수락할 것이다. 이렇게 같은 IP에서 여러 애플리케이션을 구분할 때는 각자 다른 PORT 번호를 사용하면 된다.

 

PORT 번호는 0 ~ 65535 범위 내에서 할당 가능하며, 0 ~ 1023 는 잘 알려진 포트로 사용하지 않는 것이 좋다.

DNS

DNS는 도메인 네임 시스템이다. 약간 전화번호부 같은 느낌인데, 기억하기 어렵고 바뀔 수도 있는 IP 주소를 도메인 명과 함께 기억해둔다. 그리고 클라이언트가 요청을 하면 DNS 서버에서 도메인 명을 IP 주소로 바꿔준다.

 


출처: [인프런] 모든 개발자를 위한 HTTP 웹 기본 지식