나는 요즘 네트워크 공부를 하고 있다. 학부에서 배우지 않았지만 업무를 하면서 필요성을 많이 느꼈고, 기본적인 지식은 알고 있어야 겠다는 생각으로 공부를 시작하게 되었다. 나는 Udacity에서 <Networking for Web Developers>라는 무료 강의를 통해 공부 중이며, 강의 수가 많지 않아서 빠르게 완강할 수 있다. 공부를 하면서 기본적인 개념들을 이렇게 블로그에 정리를 해 놓으려고 한다.
https://www.udacity.com/course/networking-for-web-developers--ud256
우선, 이 강의에서 간단한 실습들을 하는데 그러기 위해서는 가상 서버가 필요하다. VirtualBox 등을 사용해도 되고, 나는 AWS Lightsail을 사용해 보았다. 가장 작은 사이즈의 가상 서버는 $3.5/mo. 의 비용이 발생하는데 첫 한달은 무료이다.
그리고 나서 터미널에서 다음과 같이 SSH 접속을 해서 사용하면 된다. 개인 키의 권한이 사용자에게 주어지지 않아서 permission denied 에러가 날 수 있는데, 그럴 경우 다음 스택오버플로 답변을 참고해서 권한을 주도록 하자. 하다가 잘 안되면 AWS에서 브라우저를 통해 SSH에 접근하는 방법도 있으니 그 방법을 써도 좋다.
원격 서버에 접속했다. 강의를 듣기 위한 기본 준비는 다 끝났다.
네트워크는 쉽게 말해 컴퓨터들 사이에 정보를 주고받을 수 있는 통로이다. 각각의 정보는 패킷(packet)이라는 형태로 보내지게 되는데, 패킷에는 송신자와 수신자, 그리고 각종 데이터들이 들어있다.
네트워크가 잘 동작하는지 간단하게 확인해 보는 법이 있다. 바로 ping을 보내는 것이다. $ ping -c3 8.8.8.8 이라는 명령을 터미널에서 입력하면 8.8.8.8으로 ping을 세 번 보낸다는 의미이다. ping이 8.8.8.8으로 잘 보내진다는 말은, 당신의 컴퓨터가 인터넷 네트워크에 잘 접속했으며 8.8.8.8(구글)이라는 ip 주소를 가진 컴퓨터가 현재 실행 중이라는 의미이다.
ping이 일반적으로 우리가 사용하는 HTTP나 SSH 와 다른점은, 서버가 따로 없이 그냥 메시지를 주고 받는다는 점이다. echo 요청을 받은 상대 컴퓨터는 OS 단에서 메시지를 처리하고 응답한다.
그러면 이번에는 HTTP에 대해서 알아보자. 브라우저가 HTTP 요청(ex GET)을 서버에 보내면 서버는 응답 코드(ex. 404)를 반환한다. 웹 서버는 서버 머신으로부터 특정 포트(ex. 80)로 연결이 되어 있는데 서버 머신은 여러 서버에 각기 다른 포트 번호로 연결이 되어 있다.
나는 위키피디아 홈페이지를 운영하는 서버에 HTTP 요청을 보내보았다. 여기서 nc는 netcat으로 문자열을 받아서 인터넷 네트워크로 연결하는데 사용하는 명령어이다.
위의 동작을 아래에 그림으로 표현하였다.
네트워크는 여러 레이어들로 구성되어 있고, 각각의 레이어를 구성하는 프로토콜과 개념들이 구분이 되어 있다. 예를 들어 Application 레이어에서는 HTTP, SSH 프로토콜을 처리하고 Transport 레이어에서는 TCP와 UDP 프로토콜을 처리하는 식으로 말이다. 그리고 DNS, ping 처럼 특정 레이어에 속하지 않은 프로토콜도 존재한다. 여기서 주목해야 할 점은 모든 레이어가 IP 프로토콜을 지나쳐 왔거나 지나칠 것이라는 점이다.
포트는 데이터를 주고받기 위한 창구이다. 다음과 같이 두 개의 터미널에서 각각 SSH에 접속해서 같은 포트로 연결하면 서로 메시지를 주고받을 수 있다. 참고로 여기에는 HTTP가 관여하지 않는다. 웹 서버가 아닌 TCP 서버 단에서 동작하는 것이기 때문이다.
포트 번호는 65535가 최대이며, 1024가 최소이다. 1023 이하의 포트는 이미 지정된 포트여서 우리가 마음대로 사용할 수가 없다. 그리고 만약 같은 포트를 두 서버가 동시에 접근하려고 한다면, 에러가 발생하게 된다. 포트에 대해서는 이후 포스팅에서 좀 더 자세하게 다루어 보려고 한다.
만약 서로 다른 서버에서 같은 이름의 Host로 ping을 보내면 같은 ip 주소가 나타날까? 직접 해 보았다.
같은 호스트인 google.com으로 서로 다른 서버에서 ping을 날렸는데 다른 ip 주소가 나왔다. 왜 이런 일이 발생한 것일까?
사용자가 브라우저에서 입력하는 호스트네임(ex. google.com)은 ip 주소로 변환이 되는데 이 과정을 DNS(Domain Name System)이라고 한다. 이름을 가지고 인터넷에 연결되어 있는 컴퓨터를 찾는데 많은 방법이 있지만 그 중에서 A-Record를 전 세계에서 가장 많이 사용하고 있다. www.example.net 을 93.184.216.34와 같은 ip 주소로 변환하는 것이다.
$ host <도메인이름> 을 입력하면 해당 도메인이 어떤 ip 주소로 연결이 되어 있는지를 알 수 있다.
전 세계에 수많은 도메인 이름이 있는데, 여기서 한 번에 특정 이름을 찾기는 사실 쉬운 일은 아니다. 그래서 Nameserver라는 걸 이용한다. 예를 들면 www.google.com라는 A-record는 google.com 이라는 nameserver에서 찾고, 마찬가지로 google.com 이라는 NS-record는 com이라는 nameserver에서 찾는다. com 과 같은 최상단 이름을 gtld(global top level domain) 이라고 하며 이들은 root server에 저장된다.
클라이언트는 먼저 캐시 서버에서 해당 도메인(www.example.com)이 있는지 확인하고 없으면 root server, com server, example.com server에 차례로 주소를 요청해서 결과적으로 도메인 주소를 캐시에 저장한 뒤에 클라이언트에 응답한다.
참고자료
https://www.udacity.com/course/networking-for-web-developers--ud256
'Computer Sci. > Network' 카테고리의 다른 글
[네트워크] TCP/IP (0) | 2021.05.12 |
---|---|
[네트워크] 이더넷(Ethernet) (0) | 2020.12.14 |
[네트워크] OSI 7계층, TCP/IP 4계층 모델 (0) | 2020.11.25 |
[네트워크] 토폴로지, 네트워크 구현, 장치들 (0) | 2020.10.05 |
Network #2. IP Address (0) | 2020.05.27 |