wireshark을 사용한 네트워크 분석
ping request 메시지는 다음과 같이 Frame 구조로 구성된다.
ping request 메시지 Frame 구조 중 두 번째 내용:
ping request 메시지 Frame 구조 중 세 번째 내용:
- Src와 Dst의 IP 주소
- Internet Protocol Version 4 프로토콜을 따름
- Src: 10.0.0.1
- Dst: 10.0.0.2


- IPv4에 대한 세부 내용이 포함됨
- Differentiated Service 여부
- T otal Length : 84
- Time to Live : 64
- Protocol : ICMP
- Header Checksum
- Src: 10.0.0.1
- Dst: 10.0.0.2
ping request 메시지 Frame 구조 중 네 번째 내용:
-
Ping Request 메시지
- Internet Control Message Protocol (ICMP) 프로토콜을 따름
-
Internet Control Message Protocol
- Echo (ping) request type=8
- Echo (ping) request code=0
- Echo (ping) request id=0x11a7
- Echo (ping) request seq=1/256
- Echo (ping) request ttl=64 (reply in 2)

-
Internet Control Message Protocol (ICMP) 헤더 표준
- Type: 8 (Ping Request)
- Code: 0
- Checksum
- Identifier : BE, 4519
- Identifier : LE, 42769
- Sequence Number: BE, 1
- Sequence Number: LE, 256
- Timestamp

-
Internet Control Message Protocol (ICMP) 헤더 표준 RFC
-
ICMP 패킷은 ICMP 폭주를 통해 DDoS 공격에 사용됨
- ping 폭주 또는 ICMP 폭주는 공격자가 ICMP 에코 요청 패킷으로 대상 장치를 압도하려고 시도하는 경우 발생

-
ping reply 메시지 Frame 구조.
-
Frame 1: 98 bytes on wire (784 bits), 98 bytes captured (784 bits) on interface 0
-
참조: 아래는 ping request 메시지임
- ping request: src address : 10.0.0.1 → dst address : 10.0.0.2
- ping reply: src address : 10.0.0.2 → dst address : 10.0.0.1

Frame 구조 중 첫 번째 내용:
Frame 구조 중 두 번째 내용:
-
Internet Protocol Version 4 프로토콜을 따르는 Src와 Dst의 IP 주소가 나타난다
-
Internet Protocol Version 4,
- Src: 10.0.0.2
- Dst: 10.0.0.1

-
참조: 아래는 ping request 메시지임
- Internet Protocol Version 4,
- Src: 10.0.0.1
- Dst: 10.0.0.2

Frame 구조 중 세 번째 내용:
-
Internet Control Message Protocol 프로토콜을 따르는 Ping Request
메시지가 나타난다
-
Internet Control Message Protocol
- Echo (ping) reply type = 0
- Echo (ping) reply code = 0

-
참조: 아래는 ping request 메시지임
- Echo (ping) request type = 8
- Echo (ping) request code = 0

RFP 표준의 코드화 -> (p. 11~20쪽 코드에서 강조된 부분만 따로 정리)
RFP (Request For Proposal) 표준에 따른 Ping Request/Reply 파이썬 코드 작성
- 첫 번째 코드
- ICMP_ECHO_REQUEST = 8
- def checksum
- def receive_one_ping
- type, code, checksum, packetID, sequence = struct.unpack("bbHHh", icmpHeader)
- timeSent = struct.unpack("d", recPacket[28:28 + bytesInDouble])[0]
- def send_one_ping(my_socket, dest_addr, ID):
- dest_addr = socket.gethostbyname(dest_addr)
- header = struct.pack("bbHHh", ICMP_ECHO_REQUEST , 0, my_checksum, ID, 1)
- my_checksum = checksum(header + data)
- ICMP_ECHO_REQUEST, 0, socket.htons
- packet = header + data
- def do_one
- my_socket.sendto(packet, (dest_addr, 1))
- icmp = socket.getprotobyname("icmp")
- my_socket = socket.socket(socket.AF_INET , socket.SOCK_RAW, icmp)
- send_one_ping(my_socket, dest_addr, my_ID)
- delay = receive_one_ping(my_socket, my_ID, timeout)
- def verbose_ping
- delay = do_one(dest_addr, timeout)

- 두 번째 코드
- adr = '127.0.0.1'
- icm_type = b'\x08' # header[0] Type = echo message
- icm_code = b'\x00' # header[1] Code = 0
- icm_csum = b'\x00\x00' # header[2:4] Checksum = 0x0000 計算前の初期値
- icm_idnt = b'\x00\x04' # header[4:6] Identifier
- icm_snum = b'\x00\x01' # header[6:8] Sequence Number
- def checksum_calc(payload):
~~ 더 채워넣어야 함..~~
OpenFlow 스위치와 컨트롤러의 역할
-
OpenFlow 컨트롤러와 OpenFlow 스위치의 위치

-
Ping Request, Reply 를 통해 보는 OpenFlow 컨트롤러와 OpenFlow 스위치의 역할
- 첫 번째 ICMP 패킷에 대한 응답 시간은 두 번째 ICMP 패킷에 비해 훨씬 길었다. 이는 발견 과정 때문.
-
h1과 h2 사이의 통신 프로세스에 관한 단계는 아래에 설명되어 있으며 아래 그림에 나와 있음.
- 오픈 스위치(s1)와 오픈 컨트롤러(c0) 사이에 생성되는 메시지 -> Packet In, Packet Out 메시지
- 호스트(h1, h2)와 오픈 스위치(s1) 사이에 생성되는 메시지 -> Ping Request, Ping Reply 메시지

Step 1: Ping 요청
- 호스트 h1이 h2와 통신하려고 Ping Request 메시지를 보냅니다.
- 이 메시지는 Open Switch s1의 인터페이스 1로 들어갑니다.
Step 2: OpenSwitch는 무엇을 해야 할지 모름
- Open Switch s1은 h2의 존재를 알지 못하고, Ping Request 메시지를 Open Controller c0에 전달합니다.
- 이때 Packet-in 메시지가 발생합니다. Packet-in은 Open Switch에서 Open Controller로 "이 패킷을 어떻게 처리해야 할지 모르겠다"라고 알려주는 메시지입니다.
Step 3: Controller는 MAC 주소를 찾음
- Open Controller c1은 h2의 IP 주소에 해당하는 MAC 주소를 찾아야 합니다.
- 이를 위해 Packet-out 메시지를 생성하여 Open Switch s1에 보냅니다.
- Packet-out 메시지는 Controller가 Switch에 "이렇게 해야 한다"고 지시하는 메시지입니다.
Step 4: Ping Request를 브로드캐스트
- Open Switch s1은 h2의 MAC 주소를 모르므로, Ping Request 메시지를 모든 포트로 브로드캐스트합니다.
- 이때 ICMP 폭주(Ping Flooding)가 발생할 수 있습니다.
- h1이 연결된 포트는 이미 알고 있으므로, h1을 제외한 다른 포트로만 브로드캐스트합니다.
Step 5: h2가 Ping Reply를 보냄
- h2는 Ping Request 메시지를 수신하고 Ping Reply 메시지를 보냅니다.
- h2는 자신이 존재한다고 응답을 보냅니다.
Step 6: Open Switch는 다시 Controller에 전달
- Open Switch s1은 Ping Reply를 어떻게 처리해야 할지 몰라 다시 Packet-in 메시지를 Open Controller c1에 전달합니다.
- 이때 Controller는 h2의 위치(어떤 포트에 연결되어 있는지)를 확인합니다.
Step 7: Controller는 Flow 설정
- Open Controller c1은 h2의 포트 번호를 파악하고, Flow mod 메시지를 Open Switch s1에 보냅니다.
- Flow mod 메시지는 Switch에 "이 패킷은 이렇게 처리해라"라고 지시하는 메시지입니다.
Step 8: Ping Reply를 h1로 전달
- Ping Reply 메시지는 이제 h1에게 정확히 전달됩니다.
- 이제 Ping Reply는 유니캐스트 방식(1:1 통신으로 브로드캐스트와 반대)으로 전송되므로, ICMP 폭주가 발생하지 않습니다.
-> 처음에는 Switch가 호스트 간의 통신에 대해 알지 못해 많은 메시지 교환이 일어납니다. 그러나 이후에는 Flow Table을 통해 패킷 처리 방식을 지정하고, 다시는 같은 메시지에 대해 반복적인 교환이 발생하지 않게 됩니다.
Quiz
1. Wireshark에서 분석한 첫 번째 ICMP 요청/응답의 딜레이가 두 번째 요청/응답보다 긴 이유는 무엇인가요?
첫 번째 패킷은 Discovery Process를 거치기 때문입니다.
2. Ping 패킷의 Frame 구조에서 Ethernet II 프로토콜의 역할은 무엇인가요?
데이터 링크 계층에서 Src와 Dst의 MAC 주소를 정의합니다.
3. Wireshark를 사용하여 ICMP Ping Request 메시지의 총 Frame 길이를 확인하는 방법을 설명하시오.
Wireshark에서 Frame 항목을 클릭하여 길이를 확인합니다.
4. ICMP Ping Reply 메시지의 Source와 Destination IP 주소가 Ping Request와 어떻게 다릅니까?
5. ICMP Echo Request/Reply 메시지에서 Type 필드의 역할과 값이 네트워크에서 어떤 정보를 제공하는지 설명하시오.
6. Wireshark에서 s1-eth1 인터페이스를 선택한 후, h1과 h2 간 Ping 통신의 두 번째 패킷을 캡처하여 RTT(Round Trip Time)를 계산하는 방법을 기술하시오.
7. ICMP 패킷의 Source와 Destination MAC 주소를 확인하기 위해 Wireshark에서 수행해야 할 단계는 무엇입니까?
8. 다음 중 ICMP Ping Request 메시지의 주요 프로토콜 계층과 그 역할이 바르게 짝지어진 것은 무엇인가요?
9. OpenFlow 컨트롤러와 스위치 간의 Packet-In 및 Packet-Out 메시지가 Ping 통신에서 발생하는 이유와 그 역할을 설명하시오.
10. Ping Request/Reply 패킷에서 TTL(Time To Live)의 역할과 기본 값이 무엇인지 설명하시오.