어제 고객지원용 프로그램 소스를 보다가 개발팀 일부가 Ping의 역할을 잘못 이해하고 있어서 글을 적게 되었습니다.

발단은 고객 컴퓨터에서 우리가 서비스하는 API로의 연결이 안되는 경우가 있는 것 같은데, 그 경우를 테스트해서 로그를 보내주는 프로그램에서 네트워크 연결 테스트를 ping으로 하더라구요. 결론부터 말하면 Ping은 TCP 연결과는 무관합니다.

 

ICMP구현체, Ping

Ping은 ICMP 프로토콜을 구현한 프로그램입니다. ICMP는 RFC 792에 정의되어있죠. 해당 문서 Introduction 첫파트 내용만 따와서 읽어봅시다.

The Internet Protocol (IP)  is used for host-to-host datagram service in a system of interconnected networks called the Catenet. The network connecting devices are called Gateways. These gateways communicate between themselves for control purposes via a Gateway to Gateway Protocol (GGP). Occasionally a gateway or destination host will communicate with a source host, for example, to report an error in datagram processing. For such purposes this protocol, the Internet Control Message Protocol (ICMP), is used. ICMP, uses the basic support of IP as if it were a higher level protocol, however, ICMP is actually an integral part of IP, and must be implemented by every IP module.

IP(인터넷 프로토콜)은 Catenet이라는 상호 연결된 네트워크의 시스템에서 호스트-호스트 데이터그램 서비스용으로 사용되었다. 기기들을 네트워크로 연결하는 것을 게이트웨이라 부른다. 이 게이트웨이는 GCP(게이트웨이 프로토콜)로 통신을 제어한다. 종종 게이트웨이나 연결대상 호스트는 연결하려는 소스 호스트와 통신을 해야할 경우가 있는데, 예컨데 데이터그램 처리에 발생하는 오류를 알려주어야 한다. 이런 용도로 사용되는 규약이 ICMP이다. IP 프로토콜의 기본 기능을 이용하기 때문에 IP 프로토콜 상위 계층이기는 하지만, 실제로 IP의 일부로 통합되며, 모든 IP 모듈에서 구현되어야 한다.

위 설명에서 알 수 있듯이 ICMP는 실제로는 OSI 7 계층중 Network 계층에 속합니다. 네트워크 연결이라 부르는 것은 전송계층(Transport)계층을 이야기하는 것으로, ICMP는 TCP/UDP의 정보를 가지고 있지 않습니다. 즉 TCP/UDP가 가지는 source port 및 destination port 정보를 접근할 수 없습니다. IP의 연결성 관련 오류를 알려주기 위한 메커니즘으로 이해하는 것이 좋겠죠.

 

IPv4 헤더: 출처:위키피디아
ICMP 헤더 -출처:위키피디아
TCP 헤더: 출처 : 위키피디아

일반 사용자들 중에서는 네트워크 연결 여부를 ping(icmp)로 알아보는 경우도 있는데, 반쯤 맞는 말입니다. 목적지 IP 주소까지 연결이 되면 ping back이 될텐데, 대체로 호스트에서 echo를 보내주면 통신이 되겠죠. 하지만  ICMP 패킷 조차도 네트워크 장비들의 리소스를 사용하기 때문에 그 패킷이 내부망에 흘러들어오지 않도록 네트워크 관리자가 막아버리는 경우도 있습니다. (예: ping flooding)

 

Ping은 막혔지만, HTTP연결은 유효할 수도 있다.

예를 들어 봅시다. 아래 스크린샷은 naver와 cisco에 ICMP를 보내본 것입니다. 네이버 접속은 잘되지만, ICMP는 아예 막아버린 것을 알 수 있습니다. 하지만 네트워크 회사인 시스코는 열어두고 있지요.

따라서 네트워크 연결을 확인하고 싶다면 TCP/UDP 연결까지는 해봐야 합니다. HTTP REST API를 제공하고 있는 곳의 경우, 고객컴퓨터로부터 해당 API가 아무 문제없이 접근할 수 있는지 알아보려면  TCP연결프로그램인 telnet을 이용해서 확인해 봐야죠. 아쉽게도 telnet은 기본 프로그램에서 빠져있기에 별도 설치해야 합니다. 제어판> 프로그램 설치 > 윈도우 피쳐 켜기로 가서 Telnet Client를 설치해 줍시다.

 

 

telnet 설치후 아래 명령을 실행해 보면 연결이 맺어지는 것을 확인할 수 있습니다.

 

자, 이제 정리해 볼까요?

  • network connection을 확인하려면 ping으로는 알 수 없다.
  • ICMP는 네트워크 계층(+살짝 위)에 속하기 때문에 전송계층 TCP/UDP의 포트(port)라는 개념이 없다.
  • ICMP 실패는 네트워크 관리자가 막았기 때문일 수도 있다.

이제 고객지원 프로그램에서 통신 연결하는 코드를 수정하러 갑시다. :)

 

적고보니, 이 글도 토요일에 적고 있네요...

+ Recent posts