막연히 알고 있었던 네트워크 개념들을 제대로 짚고 넘어갈 수 있어 많은 부분에서 도움이 될 것 같았습니다.
특히 프론트 프록시 / 리버스 프록시는 정확히는 모르던 개념인데 업무 중 문득문득 나오길래 반드시 제대로 공부가 필요하다고 생각했었기 때문에 이번 기회로 확실히 공부하게 된 것 같습니다.
외부 IP:포트
는 미리 공유기의 포트포워딩 설정을 통해 공유기를 통해 구성되는 내부 네트워크의 자세한 목적지(최종적으로 도달하고자 하는 목적지)를 안내하게 됩니다.네트워크 계층
TCP : Transmission Control Protocol입니다. OSI 7계층 중 Transport Layer에 해당합니다. SYN, SYN-ACK, ACK 패킷을 주고 받는 3-Way HandShake를 통해 연결을 설정하고 통신을 시작합니다.
3-Way Handshake가 일어나는 과정입니다. 서버는 LISTEN 중이다가, 클라이언트가 SYN 패킷을 보내면 SYN-RECEIVED 상태로 전환되며 클라이언트에게 SYN-ACK 패킷을 보냅니다. SYN-ACK 패킷을 받기를 기다리던 클라이언트는 계속 SYN-SENT 상태에 있다가 해당 패킷을 받는 순간 Established 상태로 전환됩니다. 그 후 다시 서버에게 ACK 패킷을 보내 서버에게도 연결이 수립되었음을 전달해줍니다. 서버가 ACK 패킷을 받는 순간 클라이언트와 서버는 진짜 데이터 송수신을 시작합니다.
TCP 연결이 종료될 때는 4-Way Handshake라는 방법을 통해 종료가 이루어집니다.
3-Way Handshake와 비슷하지만 약간 다릅니다. 클라이언트가 서버에게 연결 종료를 위해 FIN 패킷을 보내면 서버가 ACK 패킷을 보내고, 다시 FIN 패킷을 보냄으로써 연결이 확실하게 종료되었음을 보장할 수 있게 이루어집니다. 서버가 클라이언트로부터 ACK 패킷을 받으면 TCP 연결이 종료되는 방식으로 이루어집니다.
IP : Internet Protocol입니다. 데이터 패킷들이 네트워크를 여행을 해서 정확한 목적지에 도달할 수 있게 하기 위한 규약입니다.
우리가 차를 타고 어딘가의 목적지로 의뢰 받은 물건을 전달하고자 하면 무엇이 가장 필요한가요? 정확한 목적지와, 목적지까지 도달하는 방법이 필요합니다. IP는 그 과정에서 비신뢰성과 비연결성이라는 특징을 가지고 있습니다. 전달 의뢰를 받은 물건 안에 무엇이 들어있는지 묻지 않고 (상태를 보장하지 않음 - Unreliablity) 목적지의 누구에게 전달하는지도 중요하지 않습니다. 그냥 문 앞에 놓고 오는 것입니다. (연결을 보장하지 않음 - Connectionless) 의뢰 받은 물건이 김아무개씨에게 제대로 전달했는지를 확인하려면, 앞서 서술한 TCP의 도움이 필요합니다.
IP
Packet
Header : OSI 7계층 중 3계층은 Network Layer입니다. IP가 OSI 계층 중 매핑 되는 곳이기도 하며, 라우터라는 장비가 대표적으로 3계층의 영역을 담당합니다. 그런데 이 라우터라는 장비가 어떤 일을 하는지 자세히 풀어보면, 패킷 단위로 전송되는 데이터를 해석해서 각각의 패킷에 담긴 목적지로 경로를 정해서 보내주는 (Routing) 역할을 합니다. 라우터가 패킷을 해석할 때, 헤더라는 패킷의 특정한 비트를 읽어서 어떤 프로토콜인지, 어디로 가야하는 지를 읽습니다. 즉 헤더는 택배의 '운송장' 역할을 한다고 이해하면 쉽습니다.
우체국 택배 운송장과 IP 헤더의 모습입니다. 보내는 사람, 받는 사람의 주소, 내용물의 길이, 운송장이 올바르게 쓰여졌는지 표시하는 부분이 있습니다.
Body : 패킷이 담고 있는 데이터 영역입니다.
IPv4 : Internet Protocol version 4입니다. 패킷 교환 네트워크에서 데이터를 교환하기 위한 규약입니다. 3계층에 속하기 때문에 데이터가 올바르게 잘 전달되는지에 대한 약속은 보다 상위 계층에서 이루어집니다. 3자리의 수가 4부분으로 구성되어 총 12자리입니다. 각 부분은 0~255까지의 수로 표현됩니다.
0.0.0.0~255.255.255.255까지 이론적으로 2^32개의 주소를 할당할 수 있습니다. 때문에 2011년부터는 IPv4 주소가 전부 소진되어 할당이 중지되었습니다. 특수 용도로 다음 몇 가지 주소는 미리 예약되어 있습니다. IPv4 Wiki
IPv6 : Internet Protocol version 6입니다. 주소가 다 소진된 IPv4의 대안으로써 적용되고 있습니다. IPv6는 16진수 4자리가 8부분으로 구성되어 이론적으로 2^(4x4x8) = 2^128개의 주소를 할당할 수 있습니다. 또 네트워크에 접속하는 순간 네트워크 주소를 할당 받고, 패킷 크기가 늘어났으며 인증 및 보안 기능이 향상되는 등 IPv4에 비해 여러 이점이 있기 때문에 향후 몇 십년 간은 IPv6을 대체할 인터넷 프로토콜은 등장하지 않을 것 같습니다. IPv6 Wiki
Domain : 인터넷을 할 때, 우리는 주소창에 IP주소와 포트의 조합으로 구성된 주소를 입력해서 이동할 수 있다는 것을 배웠지만 실제로는 어떻게 인터넷을 이용하고 있나요? 복잡한 숫자보단 naver.com이나 google.co.kr와 같은 외우기 쉬운 단어 조합을 주소창에 입력해서 사용하고 있습니다. 도메인이란 이런 단어 조합을 이야기 합니다. 우리가 만든 서비스를 도메인으로 사용하기 위해서는 상위 도메인의 레지스트리의 등록 위임을 받은 기관을 통해 구매하여 등록하여 사용합니다.
Port
서버에서 포트란? : 앞선 예시에서 병원의 '2번 방'에 해당하는 개념입니다. 서버에서 포트는 네트워크 서비스를 식별하는 논리 단위이기도 합니다. 보통 포트 하나에 서비스 하나를 올려 구분하여 사용합니다. OSI의 4번째 계층인 Transport Layer에 속합니다.
자주 쓰는 프로토콜별 포트 번호 정리
포트 번호 | 예약되어 있는 서비스 |
---|---|
20 | FTP (data) |
21 | FTP (control) |
22 | SSH, SFTP |
23 | Telnet |
80 | Http |
443 | Https |
3306 | MySQL |
8080 | Http Alternative |
https://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers 에서 더 자세한 목록을 볼 수 있었습니다.
포트리스닝 : TCP 연결에서 서버 역할을 하는 특정 프로세스는 할당된 포트에서 LISTENING 상태로 대기합니다. 클라이언트에게서 ACK 패킷을 받으면 ESTABLISHED 상태로 전환되어 연결 및 데이터 송수신을 시작합니다.
인바운드 / 아웃바운드 : 주로 방화벽 정책을 설정할 때 많이 등장하는 용어이지만 방화벽 뿐만 아니라 많은 곳에서 '인바운드는 들어오는, 아웃바운드는 나가는' 것에 대한 이야기입니다. 찾아보니 마케팅 용어에도 인/아웃 바운드가 있네요. 마찬가지로 방화벽에서 인바운드 정책은 내 컴퓨터로 들어오는 트래픽에 대한 제어 정책이고, 아웃바운드 정책은 내 컴퓨터에서 나가는 트래픽에 대한 제어 정책입니다.
데몬(Daemon) : 사용자의 제어를 떠나 백그라운드에서 여러 작업을 하는 프로그램을 말합니다. 리눅스에서는 프로세스 이름 뒤에 d를 붙여서 (sshd, httpd처럼) 표시합니다. 터미널에서 프로세스 실행 시 '&'를 끝에 붙여 백그라운드에서 실행하게 하여 사용자 프로그램을 daemonize 할 수 있습니다.
Port forwarding : 공인 중개사가 임대인과 임차인을 연결시켜주는 행위에 비유할 수 있겠습니다. 임차인 (서비스 요청자)는 특정 서비스를 필요로 하는데, 중개사가 임대인 (서비스 제공자)를 연결시켜 연결을 체결하고 데이터 교환(부동산 계약)이 이뤄지게 합니다. 공유기에 연결된 모든 기기는 전부 포트포워딩되어 인터넷을 사용한다고 할 수 있습니다. 포트 포워딩이란?
제가 주소창에 naver.com을 치게 되어 이동하면 제일 먼저 제 컴퓨터의 dns 서버에서 이를 알맞은 외부 IP 및 포트로 변환하여 이동시켜 줄 것입니다. 그 다음엔 해당 요청이 담긴 패킷을 라우터와 같은 기기들이 최적의 경로로 해당 외부 IP가 할당 된 네트워크까지 도달하게 해줍니다. 네이버 서버의 네트워크의 최전면 부분에는 리버스 프록시 서버가 위치해 있을 것입니다. 그 리버스 프록시 서버는 다시 내부 알고리즘을 통해 내가 원하는 서비스가 있는 내부 네트워크의 서버로 안내를 해주어 우리가 보는 네이버 홈페이지가 나타나게 될 것이라고 생각합니다.
그림 출처 : https://docs.oracle.com/cd/E19528-01/819-5493/adypr/index.html