네트워크를 공부하려고 하면 처음부터 어려운 용어들이 많이 나온다.
서버, 클라이언트, 라우터, 스위치, 주소, 포트, 계층 같은 말들이 한꺼번에 등장한다.
그런데 처음부터 이 용어들을 전부 외우려고 하면 오히려 전체 그림이 잘 안 잡힌다.
그래서 나는 네트워크를 먼저 아주 단순하게 바라보기로 했다.
네트워크는 정보를 주고받을 수 있도록 서로 연결된 구조다.
조금 더 풀어 말하면, 여러 장치들이 서로 연결되어 있고, 그 사이를 통해 어떤 정보가 이동하는 구조라고 볼 수 있다.
이때 네트워크를 그래프처럼 생각하면 이해하기 쉽다.
그래프에는 점과 선이 있다.
네트워크에서도 마찬가지로 볼 수 있다.
점은 정보를 주고받는 장치다.
선은 그 장치들을 이어주는 연결이다.
그리고 그 위를 오가는 것이 메시지다.
즉, 네트워크를 가장 단순하게 보면 이렇게 정리할 수 있다.
노드, 간선, 메시지.
노드는 정보를 주고받을 수 있는 장치다.
내 노트북, 스마트폰, 서버, 네트워크 장비 같은 것들이 모두 노드가 될 수 있다.
간선은 노드와 노드를 이어주는 연결이다.
유선 케이블일 수도 있고, 무선 신호일 수도 있다.
중요한 건 두 장치가 정보를 주고받을 수 있는 통로가 있다는 점이다.
메시지는 그 연결을 따라 이동하는 정보다.
우리가 웹사이트에 접속할 때 보내는 요청도 메시지고, 서버가 돌려주는 응답도 메시지라고 볼 수 있다.
여기서 중요한 건, 네트워크를 처음부터 복잡한 기술 묶음으로 보지 않는 것이다.
먼저 “장치들이 연결되어 있고, 그 사이로 정보가 이동한다”는 그림을 잡는 게 먼저다.
네트워크 안에는 여러 노드가 있지만, 모든 노드가 같은 역할을 하지는 않는다.
그중에서 호스트는 실제로 데이터를 만들거나 사용하는 주체다.
네트워크의 가장자리에서 정보를 생성하고 소비하는 장치라고 볼 수 있다.
예를 들어 내가 사용하는 노트북은 호스트다.
브라우저를 열고 어떤 웹사이트에 접속하면, 내 노트북은 서버에게 무언가를 요청한다.
웹 서버도 호스트다.
서버는 요청을 받고, 필요한 처리를 한 뒤 응답을 만들어 다시 보내준다.
즉, 호스트는 네트워크의 끝단에서 실제 대화에 참여하는 장치다.
비유하자면, 택배를 보내는 사람과 받는 사람에 가깝다.
중간에 도로와 물류센터가 있더라도, 실제로 물건을 보내고 받는 주체는 양쪽 끝에 있는 사람이다.
네트워크에서도 마찬가지다.
내 컴퓨터와 서버가 실제 메시지를 만들고 소비한다.
호스트가 서로 통신하려면 연결이 필요하다.
이 연결을 넓게 보면 링크라고 할 수 있다.
링크는 장치와 장치 사이에 데이터가 이동할 수 있는 통로다.
집에서 사용하는 랜선도 링크의 일부로 볼 수 있고, 와이파이처럼 무선으로 연결되는 것도 링크라고 볼 수 있다.
고속도로에 비유하면 링크는 도시와 도시를 이어주는 도로다.
아무리 자동차가 있어도 도로가 없으면 이동할 수 없다.
네트워크에서도 장치들이 아무리 많아도, 서로 연결되어 있지 않으면 정보를 주고받을 수 없다.
다만 실제 네트워크는 내 컴퓨터와 서버가 선 하나로 바로 연결되어 있는 단순한 구조가 아니다.
중간에 여러 장비를 거쳐서 이동한다.
내 노트북과 서버가 직접 연결되어 있다면 이야기는 간단하다.
내가 서버에게 메시지를 보내면 되고, 서버가 다시 나에게 메시지를 보내면 된다.
하지만 실제 인터넷은 그렇게 단순하지 않다.
수많은 컴퓨터, 스마트폰, 서버, 장비들이 서로 연결되어 있다.
모든 장치가 모든 장치와 직접 선으로 연결될 수는 없다.
그래서 중간에서 연결을 도와주는 장비들이 필요하다.
대표적으로 스위치와 라우터 같은 장비들이 있다.
지금은 이 장비들을 깊게 이해하려고 하지 않고, 일단 이렇게만 생각해도 충분하다.
네트워크 장비는 호스트들이 서로 통신할 수 있도록 중간에서 메시지가 이동할 길을 만들어주는 장치다.
장비 입장에서 생각해보면 이런 느낌이다.
“어떤 메시지가 들어왔네.”
“이걸 어디 쪽으로 보내야 하지?”
“내가 알고 있는 연결 방향을 기준으로 다음 위치로 넘기자.”
물론 실제로는 더 구체적인 기준과 규칙이 있지만, 지금 단계에서는 “중간에서 길을 이어주는 장비” 정도로 이해하고 넘어간다.
여기서 중요한 건 네트워크가 단순히 내 컴퓨터와 서버만의 관계가 아니라는 점이다.
그 사이에는 메시지를 전달하기 위한 여러 연결과 장비들이 존재한다.
웹 개발을 하다 보면 가장 많이 듣는 말이 클라이언트와 서버다.
클라이언트는 요청하는 쪽이다.
서버는 요청을 받고 응답하는 쪽이다.
예를 들어 브라우저에서 웹사이트 주소를 입력한다고 해보자.
이때 내 브라우저는 클라이언트 역할을 한다.
브라우저는 서버에게 말한다.
“이 페이지를 보고 싶어.”
“이 데이터를 보내줘.”
“로그인을 처리해줘.”
서버는 그 요청을 받고 처리한 뒤 다시 응답한다.
“여기 페이지 데이터야.”
“요청한 데이터는 이거야.”
“로그인 결과는 성공이야.”
이 관계를 너무 어렵게 생각할 필요는 없다.
식당에 비유하면 클라이언트는 손님이고, 서버는 주방에 가깝다.
손님이 주문한다.
주방은 주문을 받고 음식을 만든다.
그리고 다시 손님에게 결과물을 준다.
웹에서도 비슷하다.
클라이언트가 요청하고, 서버가 응답한다.
웹 서비스의 기본 흐름은 Request - Response 구조로 이해할 수 있다.
Request는 클라이언트가 서버에게 보내는 요청이다.
Response는 서버가 클라이언트에게 돌려주는 응답이다.
예를 들어 사용자가 게시글 목록 페이지에 들어간다고 해보자.
브라우저는 서버에게 요청한다.
“게시글 목록을 보여줘.”
서버는 요청을 받고, 필요한 데이터를 준비한 뒤 응답한다.
“여기 게시글 목록이야.”
사용자가 로그인 버튼을 눌러도 마찬가지다.
브라우저는 서버에게 요청한다.
“이 아이디와 비밀번호로 로그인할 수 있는지 확인해줘.”
서버는 확인한 뒤 응답한다.
“로그인 성공이야.”
또는
“아이디나 비밀번호가 틀렸어.”
이처럼 웹에서 일어나는 많은 일은 요청과 응답의 반복으로 볼 수 있다.
여기서 중요한 건 “요청이 간다”, “응답이 온다”는 표현을 막연하게 넘기지 않는 것이다.
요청은 클라이언트에서 만들어진 메시지다.
응답은 서버에서 만들어져 다시 클라이언트로 돌아오는 메시지다.
그리고 그 메시지는 네트워크의 연결과 장비들을 거쳐 이동한다.
즉, 웹 개발에서 자주 말하는 API 요청, 서버 응답, 페이지 로딩 같은 것들은 모두 이 큰 그림 안에 있다.
정리하자면
클라이언트가 요청한다.
네트워크를 통해 서버로 이동한다.
서버가 처리한다.
다시 네트워크를 통해 클라이언트로 응답한다.
네트워크는 정보를 주고받기 위한 연결 구조다.
그 구조 안에는 노드, 간선, 메시지가 있다.
호스트는 가장자리에서 데이터를 만들고 사용한다.
중간 장비는 통신이 가능하도록 길을 이어준다.
웹 서비스는 클라이언트가 요청하고 서버가 응답하는 구조로 동작한다.