네트워크는 노드들이 데이터를 공유할 수 있게 하는 디지털 전기통신망의 일종이다. 분산된 컴퓨터를 통신망으로 연결한 것을 말하며, 여기서 노드는 네트워크에 속한 컴퓨터 또는 통신 장비를 일컫는다.
인터넷은 문서, 사진, 영상과 같이 여러 형태의 데이터들을 공유하도록 구성된 세상에서 가장 큰 네트워크이며, www는 인터넷을 통해 웹과 관련된 데이터를 공유하고 분산하는 하이퍼텍스트 시스템으로 인터넷과 구별되는 개념이다.
- 네트워크 : 노드들이 데이터를 공유할 수 있는 디지털 전기통신망
- 인터넷 : 전 세계의 네트워크를 연결한 초대형 네트워크
- www : 인터넷 기반으로 동작하는 분산형 하이퍼텍스트 정보 공유 시스템
LAN(Local Area Network)
- 가까운 지역을 하나로 묶은 네트워크
- ex) 같은 PC방 내에서 스타크래프트 배틀넷 근거리 통신망 멀티 플레이
WAN(Wide Area Network)
- 먼 지역을 한 곳으로 묶은 네트워크
- 가까운 지역끼리 묶인 LAN과 LAN을 다시 하나로 묶은 것
MAN(Metropolitan Area Network)
기타 VLAN, CAN, PAN 등등...
Star 형식
- 중앙 장비에 모든 노드가 연결된 형태
- 하나의 LAN 대역을 구축할 때 보통 Star 형식으로 연결
- ex) 가정집의 공유기를 통해 핸드폰, 컴퓨터, TV 등이 연결
- 위의 예시에서 만약 공유기가 고장난다면...? 이게 Star 형식의 단점
Mesh 형식
- 여러 노드들이 서로 그물처럼 연결된 형태
- WAN 대역을 구축할 때 채택됨
- ex) https://www.submarinecablemap.com/country/south-korea
Tree 형식
- 나뭇가지처럼 계층 구조로 연결된 형태
기타 링형, 버스형, 혼합형 등등...
- 실제 인터넷은 Star와 Mesh가 섞인 혼합형으로 구축
유니 캐스트
- 네트워크 상의 특정 대상과 1대1로 통신하는 방식
멀티 캐스트
- 네트워크 상의 특정 다수와 1대N으로 통신하는 방식
브로드 캐스트
- 네트워크 상에 있는 모든 대상과 통신하는 방식
프로토콜은 일종의 약속이다. 택배를 보내려면 택배 양식이 존재하고, 편지도 편지지라는 양식이 존재하고, 전화 역시 전화만의 양식이 존재하듯 네트워크 역시 노드와 노드 간의 통신에서 약속이 필요하다. 구체적으로는 어떤 노드가 어떤 노드에게 어떤 데이터를 어떻게 보내는지 작성하기 위한 양식이 프로토콜의 정의라 할 수 있다.
이런 프로토콜이 필요한 이유는 당연한 얘기겠지만 내가 보내려는 혹은 받으려는 데이터를 정확하게 받기 위해서다. 엉뚱한 곳에 도달해있거나 아니면 전혀 다른 데이터가 전송되면 안 될 테니까.
가까운 곳과 연락할 때
- Ethernet 프로토콜(MAC 주소)
멀리 있는 곳과 연락할 때
- ICMP, IPv4, ARP(IP 주소)
여러 프로그램으로 연락할 때
- TCP, UDP(포트 번호)
참고로 나는 MacOS다. 윈도우 명령어도 같이 기재할 테지만, 앞으로 진행하는 실습 내용의 대부분은 MacOS를 기준으로 연습하고 레코드를 남길 예정.
터미널(윈도우라면 cmd)에서 traceroute 8.8.8.8
을 입력해보자.
해당 명령어를 입력하면 시간이 조금 소요되다가 마지막에 dns.google (8.8.8.8)
에 도달하는 것을 확인할 수 있다. 이것은 경로 추적 명령어이며 패킷이 거치는 라우터(네트워크 경유지, LAN 대역)의 IP 주소 및 해당 라우터까지의 응답 시간을 순차적으로 출력한다.
8.8.8.8
은 구글의 DNS 서버다. DNS는 사람이 이해하는 도메인 이름(www.google.com)을 컴퓨터가 이해할 수 있는 IP 주소(8.8.8.8)로 변환하는 시스템으로 보통 인터넷 연결 상태를 테스트할 때 해당 명령어를 많이 사용한다. 윈도우의 cmd에서는 tracert 8.8.8.8
을 활용한다.
나 같은 경우는 로컬 네트워크의 내부망 라우터에서 인터넷 서비스 제공 업체(ISP)의 외부 라우터와 백본에 위치한 라우터를 거쳐 다양한 중간 네트워크 라우터를 거친 끝에 구글의 공개 DNS 서버에 도달하는 것을 확인할 수 있었다.
도커로도 세팅이 가능한데 대신 GUI는 활용을 못한다(...아쉽)\
어차피 공부하고 정복하고 싶은 영역이었으니 직접 세팅을 해야겠다.
설치는 간단하다. 구글에 Wireshark 검색해서 나오는 공식 홈페이지에서 각자의 운영체제에 맞춰 다운받고 설치하면 끝.
들어가자마자 상당히 어려워보이는 것들로 가득한데, 우선 Wireshark가 뭐하는 도구인지를 확인해야 한다.
Wireshark는 네트워크 패킷 분석 도구다. 즉, 네트워크를 통해 실시간으로 전달되는 데이터를 실시간 캡처 후 분석할 수 있다. 패킷은 네트워크를 통해 전송되는 데이터의 기본 단위를 의미하며 데이터가 이 패킷들로 구성된다. 보통은 주소 정보나 제어 정보를 포함한 헤더와 실제 데이터가 담긴 페이로드로 구성된다.
얘기를 들었을 때, 얼핏 감이 오겠지만 Wireshark는 네트워크 스니핑 툴로도 활용이 가능하다. 물론 불법적인 의도가 아닌 보안 테스트 용도이며 사실 얘로 해킹(...)을 하는 것 자체가 애초에 불가능하다. 웬만한 실시간 통신들 중 우리가 관심있는 부분들은 대부분 HTTPS 프로토콜로 이뤄졌는데 관련 SSL/TLS 키를 알고 있지 않는 한 Wireshark가 캡처할 수는 없다.
여튼 위에서 우리가 봐야할 것은 WI-FI:en0
와 Loopback: lo0
인데, 내 운영체제는 MacOS에 노트북이어서 우리집 공유기에서 나오는 와이파이의 LAN에서 전송되는 데이터 패킷을 WI-FI:en0
에서, 내 노트북 내에서의 네트워크 통신을 위한 가상 인터페이스인 루프백(localhost)에서 전송되는 데이터 패킷을 Loopback: lo0
에서 캡처할 수 있다.
그외에도 VPN 연결에 사용되는 utun
인터페이스 시리즈나, 유선 네트워크 연결을 나타내는 Ethernet
등도 있는데 어차피 지금 내 수준에서는 봐도 뭔지 모른다(...)
아무튼, 일단 WI-FI:en0
에 먼저 접속해보자
처음 들어간 상태에서 인터넷을 만지작하면 뭐 TCP니 뭐니 하면서 마구잡이로 패킷들이 캡처되는데 어차피 난 아직 모르는 것들이라서 일단 HTTP만 포착되도록 필터 적용을 했다. 이러면 위에서 말했듯 웬만한 웹 상의 데이터 패킷들은 전부 HTTPS로 처리되기 때문에 포착되는 내용이 아무 것도 없을 것이다.
여기서 인텔리제이를 열어보면 꽤나 재밌는 게 포착된다.
인텔리제이를 열어서 특정 프로젝트를 엶과 동시에 무슨 요청과 응답이 내 공유기 와이파이에서 포착됐다. HTTP 프로토콜로 이뤄져있는 것을 볼 수 있으며 특정 엔드포인트로 GET 요청이 이뤄졌고 301 응답이 반환된 것을 확인할 수 있다.
리퀘스트 패킷을 뜯어보면 인텔리제이의 GitLab 플러그인을 통해 GitHub API에 요청을 보내는 내용을 확인할 수 있다. 아마 추측상 깃헙의 원격 레포지토리와 로컬 깃 간의 연동을 통해 push, pull 등의 작업이 가능케 하기 위한 리퀘스트인 듯하다.
리스폰스는 별다른 내용은 없지만 301 응답을 반환한다. 이는 깃헙 서버가 HTTP에서 HTTPS로 리디렉션을 수행해서 향후의 요청은 HTTPS 프로토콜의 엔드포인트로 리퀘스트를 보내야 함을 명시하고 있다.
이번에는 개발할 때 흔히 쓰이는 로컬호스트(127.0.0.1)를 확인해보자. 참고로 일반적인 IP 주소는 사람이 해석할 수 있는 도메인에서 DNS에 의해 매핑되는 것이 원칙이지만 localhost는 DNS를 거치지 않고 운영체제의 hosts 파일에 의해 알아서 127.0.0.1로 매핑한다.
한번 자바로 구축한 서버를 부팅해서, 포스트맨으로 간단한 리퀘스트를 보내 리스폰스를 받아본다. 해당 엔드포인트로 조회된 엔티티의 객체 해시코드와 필드 내용이 ResponseEntity
에 담겨서 반환된다.
정상적으로 리퀘스트와 리스폰스가 주고받아진 것을 확인할 수 있다. 이제 이것을 Wireshark에서는 어떻게 찍혔는지 확인해보자.
localhost의 정의대로 ::1
(IPv6의 루프백 주소 축약 표현) 내에서 전송되는 것이 보이며 정상적인 리스폰스를 나타내는 상태 코드와 단순 문자열로 처리된 응답 데이터들을 확인할 수 있다.
일단은 네트워크 개념들을 좀 더 공부하고 실습할 수 있는 것들을 찾아 실습해 볼 예정