ICMP(Internet Control Message Protocol)

[복습]
SARK_PERM : 실패한 것만 다시 보내기(전송실패패킷 재전송), 이것이 마크되어 있으면 실패한 것만 보내고 마크되어 있지 않으면 전부 다시 보내는 것이다.

 

ICMP(Internet Control Message Protocol)

3계층 프로토콜에는 IP, ARP, RARP, ICMP 등이 있습니다. ICMP는 IP의 단점을 보완하기 위해 만들어진 프로토콜입니다. 

IP header 부분에서 데이터가 잘 전송되었는지 알 수 없습니다. checksum의 경우도 헤더에 대한 오류검출이지 데이터에 대한 오류검출이 아닙니다. IP protocol은 송수신 시스템 상의 패킷을 최적 경로를 전달하는 것이 주된 목적입니다. 신뢰성이 없고 비연결형입니다. 이러한 단점을 보완하기 위해 ICMP가 만들어졌습니다. 

ICMP는 독립적으로 운행되는 것이 아니라 IP와 함께 합니다. IP data 부분에 들어갑니다.

 

ICMP는 메시지를 전달해주는 프로토콜입니다. 메시지는 2 종류가 있는데 하나는 IP 패킷 처리 도중 발생한 문제를 보고하는 오류보고 메시지(Error Reporting Message), 하나는 다른 호스트로부터 특정정보를 획득하고 네트워크 문제를 진단하는 질의메시지(Query Message)가 있습니다.

 

ICMP Header

ICMP 헤더는 총 8바이트로 구성되어 있습니다. Type은 ICMP의 업무, 즉 어떠한 용도로 사용되는 ICMP를 나타냅니다. Code는 type의 세부내용을 나타내며 이 부분은 type과 조합을 이루어 ICMP 메시지의 목적과 용도를 나타냅니다. Checksum은 메시지의 이상 유무를 판단합니다.

 

[실습 ACL.pkt]

ping테스트할 때 ping을 4번을 보내는데, 첫 번째, 두 번째 패킷은 희생양이라고 할 수 있습니다. 1,2번이 길을 닦아 놓습니다. ping테스트는 payload 된 데이터가 없는데도 있는 것처럼 테스트합니다. 그래서 byte가 32로 나타납니다. request timeout, reply from~과 같은 메시지들은 ICMP가 보내주는 것입니다.

tracert : 목적지 까지 가기 위해 걸칠수있는 게이트웨이를 확인하는 명령어로, 데이터 연결이 안 되면 어느 지점에서 문제가 있는지 확인합니다.

 

ICMP Code

ICMP code

echo reqeust : 질의 8,0
echo reply : 질의 0,0

 

에러 보고 메시지

에러 보고 메시지

 

ping 보내기 실습 1(WireShark, cmd 활용)

 IP 자체만으로는 데이터가 잘 전송되었는지 확인할 수 없습니다. 그래서 ICMP로 IP 헤더들의 필드값을 변경시켜 가면서 테스트해보는 것입니다.

 

1) cmd 창에 ipconfig 입력 > 게이트웨이 확인 : 192.168.0.1

2) WireShark에서 와이파이 or 이더넷 열고 정지합니다.

3) cmd 창에 ping 192.168.0.1 입력 > (아직 실행 x)

4) WireShark를 정지했던 것을 다시 실행 하고 cmd 창에서 ping 보내기

5) cmd 창에서 ping이 다 보내지면 WireShark 정지

6) WireShark 필터에 ICMP 입력하여 해당 값만 보기

 

 

ping 보내기 실습 2(옵션 사용)

cmd창에서 ping -? 입력 > ping의 도움말

 

1) -n

옵션  n은 핑을 몇 개 보낼지 설정할 수 있습니다.

cmd 창에 ping -n 3 192.168.0.1 입력 >

 

2) -t

옵션 t는 무한대로 핑을 보내는 명령어 입니다.

cmd 창에 ping -t 192.168.0.1 입력 >

 

3) -l

cmd 창에 ping -l 500 192.168.0.1 입력 >

옵션 l은 데이터 바이트를 설정하여 테스트하는 것입니다. 원래 기본값은 32인데, 전송하고자하는 데이터의 사이즈를 늘려서 테스트하는 옵션입니다.

 

4) -l (단편화)

cmd 창에 ping -l 4000 192.168.0.1 입력 >

데이터 4000짜리를 전송하는 테스트입니다. 그런데 이 정도 사이즈면 단편화를 하지 않을까요??

WireShark 테스트 필터에 ip.addr==192.168.0.1를 입력합니다.

 

 

핑이 나가기 전에단편화가 진행이 되어 나감을 확인할 수 있습니다. (id가 동일하고, offset확인하고, flag 확인)
단편화는 ip헤더에서 진행됩니다.

단편화 진행

 

5) -f

cmd 창에 ping -f 192.168.0.1 입력 >

flag는 3비트로 구성되어 있습니다. 마지막 3번째에 값이 들어오는데, f를 사용하면 2번째에 값이 들어오면서 3계층에서 단편화를 하지 못하도록 합니다.

 

6) -l -f

cmd 창에 ping -l 4000 -f 192.168.0.1 입력 >

4000짜리 데이터는 단편화가 필요한데 f로 인해 단편화를 하지 못하도록 설정해서 핑이 안보내집니다.

 

7) tracert

tracert는 ping의 확장이라고 보면 됩니다.

cmd 창에 tracert 203.241.132.34  입력 >
중간에 *이 나오는 것은 방화벽이 대답을 하지 않고 보내주는 경우입니다. 해당 사이트에 가기 위해 필요한 경로 수를 볼 수 있습니다.

 

8) -i 

cmd 창에 ping -i 8 203.241.132.34 입력 >
IP헤더의 TTL 값을 줄이고 ICMP를 보내는 것입니다.

 

Ethernet Frame 구조

2계층 PDU는 frame이라고 합니다.
- host에서 발생하는 frame ==> DIX frame(type)

- 장비에서 발생하는 frame ==> IEEE 802.3 frame(length)

 

ARP(Address Resolution Protocol)

4계층 : TCP, UDP
3계층 : IP, ICMP, ARP, RARP, IGMP(LAN 구간의 멀티캐스트 프로토콜)

2계층 : Ethernet frame

 

ARP는 송신지 주소와, 수신지 주소가 들어갑니다. 이때 hardware address는 2계층 주소를 의미하고, protocol address는 3계층 주소를 의미합니다. 

ARP 패킷은 2개로 request와 reply가 있습니다.

 

ARP Request

request는 브로드캐스트 방식으로 진행됩니다. 43.20에서 43.25와 통신하고 싶은데 43.24의 MAC주소를 모른다면, ART request를 진행합니다. 

 

ARP Reply

reply는 유니캐스트 방식으로 진행됩니다. ARP는 3계층이지만 기본적으로 2계층을 끼고 돌아가야 합니다. 파란색 칸이 숫자 2면 reply, 1이면 request입니다.

 

ARP 수행 후 캐시테이블

1.10이 1.20과 통신하고 싶어 합니다. 수신자(1.20)의 MAC 주소를 모르니 캐시테이블을 먼저 조회합니다. 캐시테이블에 없으니 ARP Request 가 나갑니다. ARP request는 브로드캐스트 방식으로 나가고, 이 request를 스위치가 받습니다. 스위치는 플러딩으로 다 내보내게 됩니다.

 

수신자(1.30) 입장에서는 받은 데이터를 역캡슐화를 하는데, 3계층 데이터 해더를 보고 수신지가 다르므로 drop하게 됩니다.

수신자(1.20) 입장에서는 데이터 역캡슐화를 통해 수신지 IP를 보니 나에게 온 게 맞으므로 먼저 송신지 주소를 ARP chche table에 저장합니다. reply만 하면 되는데, 왜 등록할까요? 서로 통신할 건데 저장하지 않는다면 나도 request를 해야하므로 미리 등록하는 것입니다. reply는 유니캐스트로 나갑니다. ARP reply가 오면 나에게 오는건지 확인(2계층주소, mac)을 하고 3계층 주소 확인하고 맞다면 ARP cache table에 등록합니다.

나는 request를 보내지 않았는데 reply가 왔다!! 그럼 이걸 캐시에 저장할까? 저장합니다!!