ICMP的应用之路由追踪程序(Tracert)

Tracert程序通过利用IP头部的TTL字段实现路由追踪。初始设置TTL为1,当数据包到达第一个路由器时,TTL减为0,触发ICMP超时错误响应。随着TTL逐渐增加,数据包逐步经过各个路由器,直到到达目的地。目的地主机返回ICMP回显应答报文,揭示整个路径。此过程帮助源主机获取从源到目标的完整路由信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实现原理:

Tracert 程序关键是对 IP 头部生存时间(time to live)TTL 字段的使用,程序实现是向目的主机发送一个 ICMP 回显请求报文,初始时 TTL 等于 1 ,这样当该数据报抵达途中的第一个路由器时,TTL 的值就被减为 0,导致发送超时错误,因此该路由生成一份 ICMP 超时差错报文返回给源主机。随后,主机将数据报的 TTL 值递增 1 ,以便 IP 报能传送到下一个路由器,并由下一个路由器生成 ICMP 超时差错报文返回给源主机。不断重复这个过程,直到数据报达到目的主机或超过跳数限制,到达目的主机后,目的主机返回 ICMP 回显应答报文。这样,源主机只需要对返回的每一份 ICMP 报文进行解析处理,就可以掌握数据报从源主机到达目的主机途中所经过的路由信息。

#include <iostream>
#include <winsock2.h>       
#include <ws2tcpip.h>
using namespace std;

#pragma comment(lib, "Ws2_32.lib")

//IP报头
typedef struct IP_HEADER
{
    unsigned char hdr_len:4;       //4位头部长度
    unsigned char version:4;       //4位版本号
    unsigned char tos;             //8位服务类型
    unsigned short total_len;      //16位总长度
    unsigned short identifier;     //16位标识符
    unsigned short frag_and_flags; //3位标志加13位片偏移
    unsigned char ttl;             //8位生存时间
    unsigned char protocol;        //8位上层协议号
    unsigned short checksum;       //16位校验和
    unsigned long sourceIP;        //32位源IP地址
    unsigned long destIP;          //32位目的IP地址
} IP_HEADER;

//ICMP报头
typedef struct ICMP_HEADER
{
    BYTE type;    //8位类型字段
    BYTE code;    //8位代码字段
    USHORT cksum; //16位校验和
    USHORT id;    //16位标识符
    USHORT seq;   //16位序列号
} ICMP_HEADER;

//报文解码结构
typedef struct DECODE_RESULT
{
    USHORT usSeqNo;        //序列号
    DWORD dwRoundTripTime; //往返时间
    in_addr dwIPaddr;      //返回报文的IP地址
}DECODE_RESULT;

//计算网际校验和函数
USHORT checksum( USH
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值