공유기 - 포트와 프로토콜

graph LR;

user["사용자"]

subgraph server["🖥 서버"];
  game-server["🎮 게임 서비스"];
  ssh-server["⚙️ ssh 서비스"];
  web-server["🌐 웹 서비스"];
end

user -- 192.168.0.1 --> server;

컴퓨터를 서버로 사용하다 보면 다양한 서비스를 한 컴퓨터에서 동시에 구동하고 싶을 수 있어요. 예를 들어 다음과 같은 서비스를 동시에 구동한다고 가정해 보세요.

  • 서버 원격 제어 서비스
  • 블로그 서비스
  • 마인크래프트 게임 서비스
  • NAS 서비스

이런 서비스마다 컴퓨터를 한대씩 추가로 장만해야 한다면 너무 불편하겠죠?

그런데 컴퓨터는 보통 하나의 IP 주소만 가지고 있어요. 그래서 사용자가 IP 주소로 서버로 접근한다고 가정해 보면, 서버 입장에서는 사용자가 자신이 제공하는 서비스 중 무엇을 이용하고 싶은 것인지 알 수가 없게 돼요.


포트와 프로토콜

graph LR;
user-80["웹 서버 사용자"];
user-3333["게임 서버 사용자"];

subgraph server["서버 192.168.0.1"];
  server-80["웹서버<br>80"]
  server-3333["게임서버<br>3333"]
end;

user-80 --[ 192.168.0.1:80 | TCP ]--> server-80;
user-3333 --[ 192.168.0.1:3333 | UDP ]--> server-3333;

그래서 나온 개념이 포트에요. 컴퓨터들은 서로 통신할 때 IP 주소 외에도 포트 번호를 반드시 명시하게 되는데요. 이를 비유하자면 한 건물(IP)내에서 몇 호실(포트)에서 만날 것인지 약속을 정한다는 것과 같아요.

이외에도 컴퓨터들은 서로 프로토콜이라 부르는 약속도 하고 만나는데요. 이를 비유하면 둘이 어떤 방식으로 소통할 것인지 정한다는 것을 의미해요. 프로토콜은 보통 TCPUDP 정도로 나뉘어요.

그래서 여러분이 어떤 웹 사이트에 들어간다는 건 서버의 IP 주소와 포트, 프로토콜까지 모두 정해서 접속을 시도했다는 것이에요.


포트와 프로토콜을 지정하지 않아도 동작하는 이유

그런데 뭔가 이상한 점이 있죠? 이전 가이드에서 ssh로 서버로 접근했을 때는, 포트 번호나 프로토콜을 입력한 적이 없으실 거예요.

이게 가능한 이유는 ssh 는 암묵적으로 22번 포트에서 TCP 프로토콜을 사용해 만나자는 약속이 있기 때문이에요. 그래서 별도로 포트 번호를 지정하지 않더라도 알아서 IP 주소 + 22번 포트 + TCP 프로토콜로 요청을 전송하게 돼요.

다른 예시도 볼까요? 여러분이 공유기 관리 화면에 접속할 때도, 포트 번호를 입력하지 않으셨을 거예요.

브라우저와 웹 서버는 서로 통신할 때 암묵적으로 80번 포트에서 TCP 프로토콜을 통해 만나자는 약속이 있어요. 그래서 포트 번호를 입력하지 않아도 알아서 IP 주소 + 80번 포트 + TCP 프로토콜로 연결되게 돼요.