ICMP屬於哪一層協議

一、什麼是ICMP

ICMP是Internet控制報文協議(Internet Control Message Protocol)的縮寫,是TCP/IP協議棧中的一個重要協議。

ICMP用於傳遞有關通信狀態、錯誤和網絡擁塞等信息。它主要是為了幫助網絡管理員診斷和解決網絡問題。

二、ICMP協議結構

ICMP報文是放在IP數據報的數據部分中,它通常包括ICMP報頭和ICMP數據兩部分。

ICMP報頭一般包含以下字段:

 0                   1                   2                   3   
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     Type      |     Code      |          Checksum             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     Identifier        |      Sequence Number                |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

具體字段含義:

  • Type:指示ICMP報文類型,CP1是回顯請求,CP2是回顯應答。
  • Code:對Type進行細分,類型為1時,Code可以是0(Echo Request)或8(Echo Reply)。
  • Checksum:ICMP頭部和數據的16位的校驗和。計算校驗和時採用補碼求和的方式。
  • Identifier:用於標識此請求的ID值。通常是惟一的,因此可以與其他回顯請求區分開來。
  • Sequence Number:序列號值。可以將該字段視為用於識別每個回顯請求的附加信息。

三、ICMP屬於哪一層協議

ICMP作為IP層的一個可選模塊,使用IP作為它的傳輸層協議。從這個角度來看,ICMP屬於網絡層協議。

ICMP主要用於網絡的控制與管理,在TCP/IP的體系結構中,應當歸類於網絡層,但從實現方式上看,ICMP作為IP的協議擴展模塊,天然屬於IP層。

四、ICMP應用示例

下面是一個使用Python實現ICMP PING命令的示例:

import os, struct, socket, select, time

ICMP_ECHO_REQUEST = 8

def checksum(source_string):
    sum = 0
    count_to = (len(source_string) / 2) * 2
    for count in xrange(0, count_to, 2):
        this_val = ord(source_string[count + 1]) * 256 + ord(source_string[count])
        sum = sum + this_val
        sum = sum & 0xffffffff

    if count_to > 16) + (sum & 0xffff)
    sum = sum + (sum >> 16)
    answer = ~sum
    answer = answer & 0xffff
    answer = answer >> 8 | (answer << 8 & 0xff00)
    return answer

def receive_one_ping(icmp_socket, ID, timeout):
    time_left = timeout

    while True:
        started_select = time.time()
        ready_to_read = select.select([icmp_socket], [], [], time_left)
        how_long_in_select = (time.time() - started_select)
        if ready_to_read[0] == []:  # Timeout
            return

        time_received = time.time()
        rec_packet, addr = icmp_socket.recvfrom(1024)

        icmp_header = rec_packet[20:28]
        type, code, checksum, packet_ID, sequence = struct.unpack(
            "bbHHh", icmp_header
        )
        # Filters out the echo request itself.
        if type != ICMP_ECHO_REQUEST or packet_ID != ID:
            continue
        return time_received - started_select

def send_one_ping(icmp_socket, dest_addr, ID):
    dest_addr = socket.gethostbyname(dest_addr)

    my_checksum = 0

    header = struct.pack("bbHHh", ICMP_ECHO_REQUEST, 0, my_checksum, ID, 1)
    data = struct.pack("d", time.time())

    my_checksum = checksum(header + data)

    if os.name == "nt":
        # 注意:不同的操作系統對於SOCK_RAW的定義不同
        # 而我們需要通過socket.IPPROTO_ICMP來獲取其中的ICMP協議
        protocol_type = socket.IPPROTO_ICMP
    else:
        protocol_type = socket.IPPROTO_ICMP

    header = struct.pack(
        "bbHHh", ICMP_ECHO_REQUEST, 0, socket.htons(my_checksum), ID, 1
    )
    packet = header + data

    while packet:
        # 發送數據報
        sent = icmp_socket.sendto(packet, (dest_addr, 1))

        packet = packet[sent:]

def ping(dest_addr, timeout=2, count=4):
    icmp = socket.getprotobyname("icmp")
    # 創建一個原始套接字
    icmp_socket = socket.socket(socket.AF_INET, socket.SOCK_RAW, icmp)

    my_ID = os.getpid() & 0xFFFF

    for i in xrange(count):
        send_one_ping(icmp_socket, dest_addr, my_ID)
        delay = receive_one_ping(icmp_socket, my_ID, timeout)
        if delay is None:
            print("Timeout")
        else:
            print("Reply from {}: delay={:.3f}ms".format(dest_addr, delay * 1000))
        time.sleep(1)

    icmp_socket.close()

ping("www.baidu.com")

原創文章,作者:IZQCM,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/371721.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
IZQCM的頭像IZQCM
上一篇 2025-04-23 18:08
下一篇 2025-04-23 18:08

相關推薦

  • 機智雲gagent屬於哪個協議?

    機智雲gagent主要是基於MQTT協議,同時支持TCP、TLS、WebSocket等多種協議。 一、MQTT協議介紹 MQTT全稱Message Queuing Telemetr…

    編程 2025-04-29
  • 使用Netzob進行網絡協議分析

    Netzob是一款開源的網絡協議分析工具。它提供了一套完整的協議分析框架,可以支持多種數據格式的解析和可視化,方便用戶對協議數據進行分析和定製。本文將從多個方面對Netzob進行詳…

    編程 2025-04-29
  • 如何取消火車票自動搶票協議

    火車票自動搶票協議,是一種利用技術手段在系統繁忙的情況下,自動刷取並搶購火車票的行為。雖然在某些情況下能夠提高購票成功率,但是也會影響其他乘客的購票權益。因此,取消火車票自動搶票協…

    編程 2025-04-29
  • USB協議棧

    USB(Universal Serial Bus)是一種常見的計算機外部接口,它已經被廣泛使用在各種設備中,例如打印機、鍵盤、鼠標等。在實現USB通信的過程中,USB協議棧起着非常…

    編程 2025-04-27
  • DR &amp; BDR:OSPF協議中的兩個重要角色

    一、什麼是DR & BDR? 在OSPF協議中,DR(Designated Router)和BDR(Backup Designated Router)是兩個非常重要的角色。…

    編程 2025-04-25
  • YModem協議在上位機中的應用

    一、YModem協議概述 YModem協議是一種常用於串口通信中的文件傳輸協議。它支持數據校驗和數據重傳功能,使得數據傳輸更加穩定可靠。YModem協議有多種不同的實現方式,其中最…

    編程 2025-04-25
  • 網絡層協議

    一、IP協議 Internet協議(IP)是網絡層中最為基礎的協議,它把數據包發送到網絡上的其他主機。IP包含兩種協議:IPv4和IPv6。 IPv4協議使用32位的地址來唯一地標…

    編程 2025-04-24
  • RIP協議在哪一層

    一、RIP協議簡介 RIP(Routing Information Protocol)是一種常見的動態路由協議,也是第一個廣泛使用的動態路由協議。它使用UDP協議,常用於小型網絡,…

    編程 2025-04-23
  • 深入探究SSH協議

    一、SSH協議的概述 Secure Shell(SSH)是一種加密網絡協議,用於在網絡上安全地傳輸數據。它最初是為取代Telnet和不安全的遠程Shell協議(例如rlogin)而…

    編程 2025-04-23
  • 趣談網絡協議

    一、網絡協議概述 網絡協議是指計算機網絡中控制信息傳輸、網絡設備之間通信機制、數據轉換和編碼方式、傳輸速率和誤差控制等方面的一種規範或標準。在網絡通信過程中,通信雙方必須遵循相同的…

    編程 2025-04-23

發表回復

登錄後才能評論