<IT엔지니어를 위한 네트워크 입문> 책을 함께 읽는 스터디를 진행하며 올리는 포스팅입니다.
스터디 repository
지난 포스팅에서 2계층에서 사용하는 MAC 주소와 3계층에서 사용하는 IP 주소에 대해 알아보았습니다.
두 주소 모두 도착지를 정확히 찾아간다는 목적이 있었지만, 4계층에서 동작하는 프로토콜의 목적은 이와 조금 다릅니다.
이번 포스팅에서는 먼저 4계층 프로토콜인 TCP, UDP에 대해 알아봅니다. 그리고 물리적 주소인 MAC 주소와 논리적 주소인 IP를 연계시켜주는 메커니즘인 ARP에 대해 공부합니다. 마지막으로, ARP는 원격지 네트워크에서는 사용할 수 없기 때문에, 원격지 네트워크에서 사용하는 게이트웨이에 대해 알아봅니다.
4계층의 프로토콜은 통신해야 할 목적지 프로세스를 정확히 찾아가고, 패킷 순서가 바뀌지 않도록 잘 조합해 원래 데이터를 잘 만들어내기 위한 역할을 합니다.
4계층 헤더에는 두 가지의 정보가 포함됩니다.
일반적으로 TCP/IP에서는 클라이언트 - 서버 방식으로 서비스를 제공하기 때문에 포트 번호는 출발지와 목적지를 구분
해야 합니다.
서버 포트번호 중 잘 알려진 포트를 웰 노운(Well Known) 포트
라고 하는데, HTTP TCP 80, HTTPS TCP 443, SMTP TCP 25 등이 그 예입니다. 이 포트들을 1023번 이하의 포트번호를 사용합니다.
따라서 다양한 애플리케이션에 포트 번호를 할당하기 위해 1024 ~ 49151의 범위인 Registered Port 범위를 사용합니다.
서비스 요청 시와 응답 시에는 출발지와 도착지 포트 번호가 서로 반대가 됩니다.
TCP는 패킷을 잘 분할하고, 수신 측이 잘 조합하도록 패킷에 순서를 주고 응답 번호를 부여합니다.
패킷에 순서를 부여하는 것을 시퀀스 번호
, 응답 번호를 부여하는 것을 ACK 번호
라고 부릅니다.
두 번호가 상호작용해 순서가 바뀌거나 중간에 패킷이 손실된 것을 파악할 수 있습니다.
상호작용은 아래와 같은 순서로 진행됩니다.
TCP는 상대가 패킷을 잘 받았는지 확인하기 위해 ACK 번호를 확인하고 다음 패킷을 전송합니다. 이 자체로도 통신 시간이 늘어나고, 송신자와 수신자 간 거리가 멀어질 수록 왕복 지연시간(Round Trip Time, RTT)
이 늘어납니다.
따라서 데이터를 보낼 때 많은 패킷을 한꺼번에 보내고 응답을 하나만 받는데, 이 때 한 번에 받을 수 있는 데이터의 크기를 윈도 사이즈
라고 합니다. 그리고 네트워크 상황에 따라 이 윈도 사이즈를 조절하는 것을 슬라이딩 윈도
라고 합니다.
TCP 헤더에서 윈도 사이즈로 표현할 수 있는 최대 크기는 2^16
입니다. 이후 점점 회선이 고속화, 안정화 되면서 윈도 사이즈를 이보다 더 늘려 통신할 수 있게 되었습니다.
하지만 TCP 헤더는 변경이 불가능하기 때문에 헤더 사이즈를 늘리지 않고 뒤의 숫자를 무시하는 방법
으로 윈도 사이즈를 증가시켜 통신하는 방법을 사용하고 있습니다.
TCP는 데이터에 유실이 발생하면 윈도 사이즈를 절반으로 떨어뜨리고
, 정상적인 통신이 되는 경우 서서히 하나씩 늘립니다
. 따라서 네트워크 경합이 발생해 패킷 드롭이 생기면 작아진 윈도 사이즈로 인해 데이터 통신 속도가 느려져 회선을 제대로 사용하지 못하는 상황이 발생할 수 있습니다.
이러한 현상을 막기 위해 버퍼가 큰 네트워크 장비를 사용하거나 TCP 최적화 솔루션을 사용할 수 있습니다.
TCP는 안전한 통신을 위해 통신 시작 전, 사전 연결작업을 진행합니다. 이 때, 3번의 패킷을 주고 받으면서 통신을 서로 준비하므로 3방향 핸드 셰이크
라고 부릅니다.
3방향 핸드셰이크의 과정은 아래와 같습니다.
LISTEN
상태로 대기SYN-SENT
상태)SYN-RECEIVE
상태로 변경되고, 클라이언트로 Syn, Ack로 응답ESTABLISHED
상태로 변경되고, Ack로 응답ESTABLISHED
상태로 변경되며 연결 완료이 때, 어떤 패킷이 새로운 연결 시도이고 기존 통신에 대한 응답인지 구분하기 위해 헤더에 플래그 값을 넣어 통신합니다. TCP 플래그
는 총 6가지가 있으며, 통신의 성질을 나타냅니다.
TCP 플래그 6가지는 아래와 같습니다.
TCP와 달리, UDP는 데이터 전송을 보장하지 않는 프로토콜
이므로 제한된 용도로만 사용됩니다. 특히 실시간 스트리밍 등 시간에 민감
한 프로토콜이나 단방향으로 다수의 단말과 통신해 응답을 받기 어려운 환경
에 주로 사용합니다.
또한, UDP는 데이터가 일부 유실되더라도 그냥 유실된 상태로 데이터를 처리합니다.
UDP는 TCP의 3방향 핸드셰이크와 같이 사전에 연결을 확립하는 절차가 없습니다
. 대신 첫 데이터는 리소스 확보를 위해 인터럽트를 거는 용도로 사용되고 유실됩니다.
따라서 UDP를 사용하는 애플리케이션은 대부분 연결 확립은 TCP를 사용하고, 모든 준비를 마친 뒤 실제 데이터만 UDP를 이용합니다.
2계층의 MAC 주소와 3계층의 IP 주소는 실제로 아무 관계도 없습니다. 실제로 통신은 IP 주소 기반으로 일어나기 때문에, 상대방의 MAC 주소를 알아내기 위해 ARP 프로토콜이 사용됩니다.
처음 통신을 시도할 때, 상대방의 MAC 주소를 알 수 없어 2계층 캡슐화를 수행할 수 없습니다. 이 때, 상대방의 주소를 알아내기 위해 ARP 브로드캐스트
를 이용해 네트워크 전체에 상대방의 MAC 주소를 질의합니다.
ARP 브로드캐스트를 받은 목적지는 ARP 프로토콜을 이용해 자신의 MAC 주소를 응답하고, 이를 통해 출발지와 목적지가 모두 상대방의 MAC 주소를 학습해 패킷이 정상적으로 인캡슐레이션될 수 있게 됩니다.
이 때, 패킷을 보낼 때마다 ARP 브로드캐스트를 수행하면 효율이 떨어지기 때문에 메모리에 ARP 테이블
을 저장해두고 재사용합니다. 이 테이블은 일정 시간 동안 통신이 없으면 삭제됩니다.
ARP 작업은 CPU에서 직접 수행
하기 때문에, 짧은 시간에 많은 ARP 요청이 들어오면 큰 부하로 작용합니다. 이러한 특징을 이용한 공격들이 많이 이뤄졌기 때문에, 이에 대응하기 위해 네트워크 장비는 ARP 테이블 저장 기간을 일반 PC보다 길게 설정하거나 ARP 요청을 필터링하는 식으로 대응합니다.
ARP 패킷에서는 송신자 하드웨어 MAC 주소, 송신자 IP 프로토콜 주소, 대상자 하드웨어 MAC 주소, 대상자 IP 프로토콜 주소
의 4개의 필드가 중요하게 사용됩니다.
ARP의 자세한 동작 방식은 다음과 같습니다.
ARP 요청을 브로드캐스트
합니다.ARP 필드를 채워 응답
합니다.유니캐스트
로 응답합니다.ARP 캐시테이블을 갱신
합니다.자신의 IP와 MAC 주소를 알릴 목적으로 사용됩니다.
대상자 IP 필드에 자신의 IP 주소
를 채우고, 대상자 MAC 주소는 브로드캐스트 MAC 주소(00:00:00:00:00:00)
를 넣어 네트워크에 브로드캐스트 합니다.
GARP를 사용해 동일 네트워크에 자신의 IP 주소와 MAC 주소를 알려주는 이유는 다음과 같습니다.
IP 충돌 때문에 통신이 안되는 것을 예방하기 위해 자신에게 할당된 IP가 네트워크에서 이미 사용되고 있는지 GARP를 통해 확인합니다.
만약 GARP 응답이 오면 해당 IP를 이미 사용 중인 단말이 있다는 것을 알 수 있습니다.
가상 MAC 주소를 사용하지 않은 데이터베이스 HA(고가용성) 솔루션에서 주로 사용합니다.
데이터베이스 HA는 주로 두 데이터베이스 서버가 하나의 가상 IP 주소로 서비스하는데, 이 때 한 대만 동작하고 한 대는 대기하는 액티브-스탠바이로 동작합니다.
액티브 상태인 서버가 가상 IP 주소 요청에 응답해 서비스하지만 MAC 주소는 실제 MAC 주소
를 사용합니다. 따라서 액티브 장비가 변경된 후에도 이전 액티브 장비의 MAC 주소가 ARP 캐시 테이블에 남아있어
정상적으로 동작하지 않게 됩니다.
이러한 현상을 예방하기 위해 스탠바이 장비가 액티브 상태가 되면 GARP 패킷을 네트워크에 보내 액티브 장비가 변경되었음을 알립니다. 이후 로컬 네트워크 단말들의 ARP 테이블의 MAC 주소가 갱신되어 통신됩니다.
최근에는 GARP를 이용해 패킷을 가로채는 기법이 많이 사용되는 점, GARP를 받아도 ARP 캐시테이블이 갱신되지 않을 수 있는 점 등으로 인해 가상 MAC을 사용하는 HA 솔루션이 사용되고 있습니다.
가상 MAC 을 사용하는 클러스터링, VRRP, HSRP와 같은 FHRP(First Hop Redundancy Protocol)에서도 GARP가 사용됩니다.
이 때 GARP는 네트워크에 있는 스위치 장비의 MAC 테이블 갱신을 목적으로 사용됩니다.
VRRP(Virtual Router Redundancy Protocol), HSRP(Hot Standby Router Protocol)은 FHRP의 일종입니다.
디폴트 게이트웨이에 장애가 발생할 경우, 해당 네트워크에 속한 단말이 외부 네트워크로 통신할 수 없는 문제를 해결하기 위한 프로토콜입니다.
두 대의 디폴트 게이트웨이 라우터를 사용하여 한 대에 문제가 생겨도 다른 한 대에서 서비스를 지속할 수 있게 해줍니다.
클러스터링에서 가상 MAC 주소를 사용하는 경우, 단말의 ARP 테이블은 갱신할 필요가 없지만, 스위치의 MAC 테이블
은 업데이트가 되어야 합니다. 마스터 장비가 변경되는 시점에 GARP를 전송해 스위치의 MAC 테이블을 갱신합니다.
클러스터링이나 HA 솔루션에서 빠른 시간안에 정상적으로 페일오버(장애 극복)가 되지 않을 경우, GARP를 보내는 시간이나 횟수를 조절하거나 스위치와 연결된 포트를 순간적으로 리셋(플랩)해 스위치의 MAC 테이블을 초기화시키는 방법을 사용하기도 합니다.
RARP는 Reverse ARP의 줄임말로, IP 주소가 정해져있지 않은 단말이 IP 할당을 요청할 때 사용합니다.
나 자신의 MAC 주소는 알지만 IP가 아직 할당되지 않아 IP를 할당해주는 서버에 어떤 IP주소를 써야하는 지 물어볼 때 사용됩니다.
현재는 BOOTP와 DHCP로 대체되어 사용되지 않습니다.
원격지 네트워크와의 통신에 사용하는 장비를 게이트웨이라고 부르고, 3계층 장비(라우터, L3 스위치)가 이 역할을 할 수 있습니다.
브로드캐스트 통신은 네트워크를 넘어 전달되지 못하기 때문에, 원격 네트워크에서는 네트워크 장비의 도움이 필요합니다. 이 장비를 게이트웨이
라 하고, 게이트웨이에 대한 정보를 PC나 네트워크 장비에 설정하는 항목이 기본 게이트웨이
입니다.
기본 게이트웨이는 여러 네트워크와 연결되면서 적절하 경로를 지정해주는 역할을 합니다.
출발지와 목적지 네트워크가 동일한 LAN 내의 통신인지, 다른 네트워크 간의 통신인지에 따라 통신 방식이 달라집니다. 따라서 출발지에서는 목적지가 속한 네트워크의 범위를 확인해야 합니다. 이 때 서브넷 마스크
를 통해 확인합니다.
외부 네트워크와의 통신이 필요할 때는 ARP 요청을 기본 게이트웨이의 IP 주소로 요청합니다.
게이트웨이에서 ARP 응답을 받은 단말은 도착지 MAC 주소에 응답받은 기본 게이트웨이의 MAC 주소를 담아 통신을 시작합니다.
따라서 원격지 통신에서의 도착지 IP 주소는 통신의 실제 도착지
이고, 도착지 MAC 주소는 디폴트 게이트웨이의 MAC 주소
가 사용됩니다.
기본 게이트웨이에 프록시 ARP가 활성화된 경우, 원격지 통신이어도 로컬에 ARP 브로드캐스트를 보내 통신할 수 있습니다.
프록시 ARP가 활성화된 기본 게이트웨이는 ARP 브로드캐스트가 들어오면 자신이 대행해 ARP 응답을 해줍니다.