基于traceroute实现目标路径的追踪

合集下载

跟踪域名路由顺序的命令

跟踪域名路由顺序的命令

跟踪域名路由顺序的命令全文共四篇示例,供读者参考第一篇示例:在网络管理和运维工作中,跟踪域名路由的顺序是一项非常重要的任务。

通过对域名路由的跟踪分析,可以更好地了解网络的结构和性能情况,及时发现和解决网络问题。

在日常工作中,我们可以通过一些命令来跟踪域名路由的顺序,下面详细介绍一些常用的命令及其用法。

1. tracert命令tracert命令显示的路由路径一般包括每个路由器的IP地址、主机名(如果有)和响应时间。

通过观察这些信息,可以判断网络中是否存在延迟或丢包问题,及时采取措施进行优化。

traceroute命令是类Unix系统(包括Linux、Mac OS等)中用来跟踪域名路由的命令。

在终端中输入traceroute加上要跟踪的域名或IP地址,同样可以显示到达目标地址的路由路径。

输入“traceroute ”就可以查看到达谷歌网站的路由路径。

3. mtr命令mtr命令是一种结合了traceroute和ping功能的网络诊断工具,可以连续地跟踪域名路由的路径并显示每个节点的延迟情况。

在终端中输入mtr加上要跟踪的域名或IP地址,就可以实时监控路由路径的性能情况。

mtr命令会显示出每个节点的IP地址、主机名、丢包率和延迟,以直观的方式展示网络路由的情况。

通过mtr命令,我们可以更全面地了解网络的性能状况,及时发现和解决问题。

4. winMTR工具winMTR是Windows系统下的一款网络诊断工具,结合了traceroute和ping的功能,可以显示出到达目标地址的路由路径和每个节点的性能情况。

通过winMTR工具,我们可以更直观地了解网络的运行情况。

在winMTR工具中,输入要跟踪的域名或IP地址,点击“Start”按钮即可开始跟踪路由路径。

winMTR会显示出每个节点的IP地址、主机名、丢包率和延迟情况,帮助我们及时监控网络的性能。

总结通过以上介绍的命令和工具,我们可以更方便地跟踪域名路由的顺序,及时发现网络问题并进行处理。

linux的路由追踪命令

linux的路由追踪命令

linux的路由追踪命令Linux系统下traceroute命令用来追踪网络数据包的路由路径,下面由店铺为大家整理了linux的路由追踪命令的相关知识,希望对大家有帮助!linux路由追踪命令详解Linux traceroute命令用于显示数据包到主机间的路径。

traceroute指令让你追踪网络数据包的路由途径,预设数据包大小是40Bytes,用户可另行设置。

语法traceroute [-dFlnrvx][-f<存活数值>][-g<网关>...][-i<网络界面>][-m<存活数值>][-p<通信端口>][-s<来源地址>][-t<服务类型>][-w<超时秒数>][主机名称或IP地址][数据包大小]参数说明:-d 使用Socket层级的排错功能。

-f<存活数值> 设置第一个检测数据包的存活数值TTL的大小。

-F 设置勿离断位。

-g<网关> 设置来源路由网关,最多可设置8个。

-i<网络界面> 使用指定的网络界面送出数据包。

-I 使用ICMP回应取代UDP资料信息。

-m<存活数值> 设置检测数据包的最大存活数值TTL的大小。

-n 直接使用IP地址而非主机名称。

-p<通信端口> 设置UDP传输协议的通信端口。

-r 忽略普通的Routing Table,直接将数据包送到远端主机上。

-s<来源地址> 设置本地主机送出数据包的IP地址。

-t<服务类型> 设置检测数据包的TOS数值。

-v 详细显示指令的执行过程。

-w<超时秒数> 设置等待远端主机回报的时间。

-x 开启或关闭数据包的正确性检验。

linux路由追踪命令实例显示到达目的地的数据包路由# traceroute traceroute: Warning: has multiple addresses; using 66.249.89.99traceroute to (66.249.89.99), 30 hops max, 38 byte packets1 192.168.0.1 (192.168.0.1) 0.653 ms 0.846 ms 0.200 ms2 118.250.4.1 (118.250.4.1) 36.610 ms 58.438 ms 55.146 ms3 222.247.28.177 (222.247.28.177) 54.809 ms 39.879 ms 19.186 ms4 61.187.255.253 (61.187.255.253) 18.033 ms 49.699 ms 72.147 ms5 61.137.2.177 (61.137.2.177) 32.912 ms 72.947 ms 41.809 ms6 202.97.46.5 (202.97.46.5) 60.436 ms 25.527 ms 40.023 ms7 202.97.35.69 (202.97.35.69) 40.049 ms 66.091 ms 44.358 ms8 202.97.35.110 (202.97.35.110) 42.140 ms 70.913 ms 41.144 ms9 202.97.35.14 (202.97.35.14) 116.929 ms 57.081 ms 60.336 ms10 202.97.60.34 (202.97.60.34) 54.871 ms 69.302 ms 64.353 ms11 * * *12 209.85.255.80 (209.85.255.80) 95.954 ms 79.844 ms 76.052 msMPLS Label=385825 CoS=5 TTL=1 S=013 209.85.249.195 (209.85.249.195) 118.687 ms 120.905 ms 113.936 ms14 72.14.236.126 (72.14.236.126) 115.843 ms 137.109 ms 186.491 ms15 (66.249.89.99) 168.024 ms140.551 ms 161.127 ms。

tracert 用法

tracert 用法

tracert 用法tracert(traceroute)是一个用于跟踪数据包在 IP 网络中的路径的实用工具。

它通过发送 ICMP(Internet Control Message Protocol)数据包到目标主机,以及测量每个数据包经过的路由节点的时间,来确定数据包在网络中的传输路径和传输时间。

这个工具可以帮助系统管理员和网络工程师分析网络故障和网络延迟问题。

tracert 命令是多平台上 universally used 的网络工具之一。

它可以在 Windows、Linux 和 macOS 等操作系统上使用。

为了使用 tracert 命令,只需在命令提示符中键入 "tracert",紧接着输入目标主机的 IP 地址或域名。

tracert 命令会发送一系列的ICMP 回显请求(ping)数据包到目标主机,并逐个显示每个数据包经过的路由节点的 IP 地址和 Round-Trip Time(RTT,RTT 是数据包从源主机发送到目标主机并返回源主机所需的时间)。

tracert 命令可以帮助管理员诊断网络故障和优化网络性能。

以下是 tracert 命令的一些常见用法:1. 诊断网络延迟:当用户报告网络延迟过高时,管理员可以使用 tracert 命令来确定数据包在网络中的传输路径,以及在哪个路由节点上出现延迟。

管理员可以根据 tracert 的结果,逐个检查每个路由节点,找出延迟的原因,并采取相应的措施来解决延迟问题。

2. 网络故障排查:当用户报告无法访问某个网站或某个服务时,管理员可以使用 tracert 命令来确定问题出现在哪个节点上。

tracert 命令会显示每个数据包经过的路由节点的 IP 地址,如果某个节点无法响应 ICMP 请求,或出现数据包丢失,那么管理员可以将问题定位到此节点,并进行进一步的排查。

3. 追踪网络数据包路由路径:tracert 命令可以用于追踪数据包在网络中的路径。

traceroute,C源代码实现

traceroute,C源代码实现

traceroute,C源代码实现路由跟踪原理,traceroute,C源代码实现Traceroute允许我们确定IP数据报从本地主机游历到某个远地主机所经过的路径。

它使用IPv4的TTL字段或IPv6的跳字段以及两种ICMP消息。

它一开始向目的地发送一个TTL(或跳限)为1的UDP数据报。

这个数据报导致第一跳路由器返送一个ICMP“time exceeded in transit(传输中超时)”错误。

它接着没递增TTL一次发送一个UDP数据报,从而逐步确定下一个路由器。

当某个UDP数据报到达最终目的地时,目标是由这个主机返送一个ICMP “port unreachable(端口不可达)”错误。

这个目标通过向一个随机选取的但愿未被目的地主机使用的端口发送UDP数据报得以实现。

早期版本的traceroute程序只能通过设置IP_HDRINCL套接口选项直接构造自己的IPv4头部来设置TTL字段。

然而如今的系统却提供IP_TTL套接口选项,它允许我们指定外出数据报所用的TTL。

(这个套接口选项随4.3BSD Reno 版本引入。

)设置这个套接口选项比构造完整的IPv4头容易的多。

IPv6的IPV6_UNICAST_HOPS套接口选项允许我们控制IPv6数据报的跳限字段。

注意:该程序运行时需要root权限!以下便是在该原理指导下的C源代码实现:/*yongsheng zhang 20081010*/#include <netinet/in_systm.h>#include <netinet/ip.h>#include <netinet/ip_icmp.h>#include <netinet/udp.h>#include <sys/socket.h>#include <sys/time.h>#include <errno.h>#include <signal.h>#include <string.h>#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <netdb.h>#include <sys/un.h>#define BUFSIZE 1500struct rec /* format of outgoing UDP data */{u_short rec_seq; /* sequence number */u_short rec_ttl; /* TTL packet left with */struct timeval rec_tv; /* time packet left */char msg[32]; /*message*/};/* globals */char recvbuf[BUFSIZE]; /*receive databuffer*/char sendbuf[BUFSIZE]; /*send databuffer*/int datalen; /* # bytes of data following ICMP header */ char *host; /* local hostname/IP */u_short sport, dport; /* source and destination */int nsent; /* add 1 for each sendto() */pid_t pid; /* our PID */int probe, nprobes; /* groups */int sendfd, recvfd; /* send on UDP sock, read on raw ICMP sock */int gotalarm;int optind;//获得<hostname>在argv[]中的索引/* function prototypes */const char *icmpcode_v4(int);/* determine the diffrent conditions when routing */int recv_v4(int, struct timeval *);void sig_alrm(int);/*timer-signal */void traceloop(void);/* main loop */void tv_sub(struct timeval *, struct timeval *);/* calculate tima */char *Sock_ntop_host(const struct sockaddr *sa, socklen_t salen);/* change the netseq to hostseq */char *sock_ntop_host(const struct sockaddr *sa, socklen_t salen);/* change the netseq to hostseq */void sock_set_port(struct sockaddr *sa, socklen_t salen, int port);/* set port */int sock_cmp_addr(const struct sockaddr *sa1, const struct sockaddr *sa2,socklen_t salen);/* compare the last IP with this time */struct addrinfo *Host_serv(const char *host, const char *serv, int family, int socktype);/* get the destination IP */struct proto{const char *(*icmpcode)(int);/* pointer which point to function icmpcode_v4()*/int (*recv)(int, struct timeval *);/* pointer which point tofunction recv_v4() */struct sockaddr *sasend; /* sockaddr{} for send, from getaddrinfo */struct sockaddr *sarecv; /* sockaddr{} for receiving */struct sockaddr *salast; /* last sockaddr{} for receiving */struct sockaddr *sabind; /* sockaddr{} for binding source port */socklen_t salen; /* length of sockaddr{}s */int icmpproto; /* IPPROTO_xxx value for ICMP */int ttllevel; /* setsockopt() level to set TTL */int ttloptname; /* setsockopt() name to set TTL */} *pr;struct proto proto_v4 = { icmpcode_v4, recv_v4, NULL, NULL, NULL, NULL, 0,IPPROTO_ICMP, IPPROTO_IP, IP_TTL };/* init struct proto */int datalen = sizeof(struct rec); /* defaults */int max_ttl = 30;/* the max nops */int nprobes = 3;/* three groups */u_short dport = 32768 + 666;/* desthost port which not want to be connected */int main(int argc, char **argv){int c;struct addrinfo *ai;char *h;/*getopt(argc, argv, "a");*/if (argc!=2){perror("usage: traceroute <hostname/IP>");return 0;}host = argv[optind];/* get IP/hostname */signal(SIGALRM, sig_alrm);/* send signal and set gotalarm */ai = Host_serv(host, NULL, AF_INET, 0);/* get the destination IP */h = Sock_ntop_host(ai->ai_addr, ai->ai_addrlen);/* change the netseq to hostseq */printf("traceroute to %s (%s): %d hops max, %d byte packets\n",/* print */ai->ai_canonname ? ai->ai_canonname : h,h, max_ttl, datalen);/* initialize according to protocol */if (ai->ai_family == AF_INET) {/* if it is IPv4 ,then pr=&proto */pr = &proto_v4;} else/* else print error massage */printf("unknown address family %d", ai->ai_family);pr->sasend = ai->ai_addr; /* contains destination address */ pr->sarecv = calloc(1, ai->ai_addrlen);pr->salast = calloc(1, ai->ai_addrlen);pr->sabind = calloc(1, ai->ai_addrlen);pr->salen = ai->ai_addrlen;traceloop();/* call main loop function */exit(0);}const char *icmpcode_v4(int code)/* determine the diffrent conditions when routing */{static char errbuf[100];switch (code) {case 0: return("network unreachable");case 1: return("host unreachable");case 2: return("protocol unreachable");case 3: return("port unreachable");case 4: return("fragmentation required but DF bit set");case 5: return("source route failed");case 6: return("destination network unknown");case 7: return("destination host unknown");case 8: return("source host isolated (obsolete)");case 9: return("destination network administratively prohibited");case 10: return("destination host administratively prohibited");case 11: return("network unreachable for TOS");case 12: return("host unreachable for TOS");case 13: return("communication administratively prohibitedby filtering");case 14: return("host recedence violation");case 15: return("precedence cutoff in effect");default: sprintf(errbuf, "[unknown code %d]", code);return errbuf;}}void sig_alrm(int signo){gotalarm = 1; /* set flag to note that alarm occurred */return; /* and interrupt the recvfrom() */}void traceloop(void)/* mian loop */{int seq, code, done;double rtt;int ttl;struct rec *rec;struct timeval tvrecv;char *str;recvfd = socket(pr->sasend->sa_family, SOCK_RAW, pr->icmpproto);/* SOCK_RAW */if(recvfd==-1){perror("socket error");exit(0);}setuid(getuid()); /* don't need special permissions anymore */sendfd = socket(pr->sasend->sa_family, SOCK_DGRAM, 0);/* SOCK_DGRAM */pr->sabind->sa_family = pr->sasend->sa_family;/* init */sport = (getpid() & 0xffff) | 0x8000; /* our source UDP port # */sock_set_port(pr->sabind, pr->salen, htons(sport));bind(sendfd, pr->sabind, pr->salen);/*bind UDP socket with source port*/sig_alrm(SIGALRM);/*build signal de*/seq = 0;done = 0;for (ttl = 1; ttl <= max_ttl && done == 0; ttl++) {setsockopt(sendfd, pr->ttllevel, pr->ttloptname, &ttl, sizeof(int));bzero(pr->salast, pr->salen);printf("%2d ", ttl);fflush(stdout);for (probe = 0; probe < nprobes; probe++) {rec = (struct rec *) sendbuf;rec->rec_seq = ++seq;rec->rec_ttl = ttl;gettimeofday(&rec->rec_tv, NULL);sock_set_port(pr->sasend, pr->salen, htons(dport + seq)); sendto(sendfd, sendbuf, datalen, 0, pr->sasend, pr->salen);if ( (code = (*pr->recv)(seq, &tvrecv)) == -3)printf(" *"); /* timeout, no reply */else {char str[NI_MAXHOST];if (sock_cmp_addr(pr->sarecv, pr->salast, pr->salen) != 0) { if (getnameinfo(pr->sarecv, pr->salen, str, sizeof(str), NULL, 0, 0) == 0)printf(" %s (%s)", str,sock_ntop_host(pr->sarecv, pr->salen));elseprintf(" %s",sock_ntop_host(pr->sarecv, pr->salen));memcpy(pr->salast, pr->sarecv, pr->salen);}tv_sub(&tvrecv, &rec->rec_tv);rtt = _sec * 1000.0 + _usec / 1000.0; printf(" %.3f ms", rtt);if (code == -1) /* port unreachable; at destination */ done++;else if (code >= 0)printf(" (ICMP %s)", (*pr->icmpcode)(code));}fflush(stdout);}printf("\n");}}void tv_sub(struct timeval *out, struct timeval *in){if ( (out->tv_usec -= in->tv_usec) < 0) { /* out -= in */--out->tv_sec;out->tv_usec += 1000000;}out->tv_sec -= in->tv_sec;}struct addrinfo *Host_serv(const char *host, const char *serv, int family, int socktype){int n;struct addrinfo hints, *res;bzero(&hints, sizeof(struct addrinfo));hints.ai_flags = AI_CANONNAME; /* always return canonical name */hints.ai_family = family; /* 0, AF_INET, AF_INET6, etc. */hints.ai_socktype = socktype; /* 0, SOCK_STREAM, SOCK_DGRAM, etc. */if ( (n = getaddrinfo(host, serv, &hints, &res)) != 0)printf("host_serv error for %s, %s: %s",(host == NULL) ? "(no hostname)" : host,(serv == NULL) ? "(no service name)" : serv,gai_strerror(n));return(res); /* return pointer to first on linked list */}/*return: -3 on timeout-2 on ICMP time exceeded in transit (caller keeps going)-1 on ICMP port unreachable (caller is done)>= return value is some other ICMP unreachable code*/int recv_v4(int seq, struct timeval *tv){int hlen1, hlen2, icmplen, ret;socklen_t len;ssize_t n;struct ip *ip, *hip;struct icmp *icmp;struct udphdr *udp;gotalarm = 0;alarm(3);for ( ; ; ) {if (gotalarm)return(-3); /* alarm expired */len = pr->salen;n = recvfrom(recvfd, recvbuf, sizeof(recvbuf), 0, pr->sarecv, &len);if (n < 0) {if (errno == EINTR)continue;elseperror("recvfrom error");}ip = (struct ip *) recvbuf; /* start of IP header */hlen1 = ip->ip_hl << 2; /* length of IP header */icmp = (struct icmp *) (recvbuf + hlen1); /* start of ICMP header */if ( (icmplen = n - hlen1) < 8)continue; /* not enough to look at ICMP header */if (icmp->icmp_type == ICMP_TIMXCEED &&icmp->icmp_code == ICMP_TIMXCEED_INTRANS) {if (icmplen < 8 + sizeof(struct ip))continue; /* not enough data to look at inner IP */hip = (struct ip *) (recvbuf + hlen1 + 8);hlen2 = hip->ip_hl << 2;if (icmplen < 8 + hlen2 + 4)continue; /* not enough data to look at UDP ports */udp = (struct udphdr *) (recvbuf + hlen1 + 8 + hlen2);if (hip->ip_p == IPPROTO_UDP &&udp->source == htons(sport) &&udp->dest == htons(dport + seq)) {ret = -2; /* we hit an intermediate router */break;}} else if (icmp->icmp_type == ICMP_UNREACH) {if (icmplen < 8 + sizeof(struct ip))continue; /* not enough data to look at inner IP */hip = (struct ip *) (recvbuf + hlen1 + 8);hlen2 = hip->ip_hl << 2;if (icmplen < 8 + hlen2 + 4)continue; /* not enough data to look at UDP ports */udp = (struct udphdr *) (recvbuf + hlen1 + 8 + hlen2);if (hip->ip_p == IPPROTO_UDP &&udp->source == htons(sport) &&udp->dest == htons(dport + seq)) {if (icmp->icmp_code == ICMP_UNREACH_PORT)ret = -1; /* have reached destination */elseret = icmp->icmp_code; /* 0, 1, 2, ... */break;}}/* Some other ICMP error, recvfrom() again */}alarm(0); /* don't leave alarm running */gettimeofday(tv, NULL); /* get time of packet arrival */return(ret);}char *sock_ntop_host(const struct sockaddr *sa, socklen_t salen)static char str[128]; /* Unix domain is largest */if (sa->sa_family==AF_INET) {struct sockaddr_in *sin = (struct sockaddr_in *) sa;if (inet_ntop(AF_INET, &sin->sin_addr, str, sizeof(str)) == 0) return(NULL);return(str);}else{snprintf(str, sizeof(str), "sock_ntop_host: unknown AF_xxx: %d, len %d",sa->sa_family, salen);return(str);}return (NULL);}char *Sock_ntop_host(const struct sockaddr *sa, socklen_t salen){char *ptr;if ( (ptr = sock_ntop_host(sa, salen)) == NULL)perror("sock_ntop_host error"); /* inet_ntop() sets errno */return(ptr);}void sock_set_port(struct sockaddr *sa, socklen_t salen, int port){if (sa->sa_family==AF_INET){struct sockaddr_in *sin = (struct sockaddr_in *) sa;sin->sin_port = port;return;}return;}int sock_cmp_addr(const struct sockaddr *sa1, const struct sockaddr *sa2,socklen_t salen){if (sa1->sa_family != sa2->sa_family)return(-1);if(sa1->sa_family==AF_INET) {return(memcmp( &((struct sockaddr_in *) sa1)->sin_addr,&((struct sockaddr_in *) sa2)->sin_addr,sizeof(struct in_addr)));}return (-1);}。

windows traceroute用法

windows traceroute用法

windows traceroute用法Windows Traceroute用法详解什么是Traceroute?Traceroute是一个用于诊断网络问题的命令行工具。

它可以测量数据包在互联网上的传输路径,并显示出每个节点的延迟情况。

在Windows系统中,Traceroute命令被称为“tracert”。

如何使用Traceroute?以下是一些常见的Windows Traceroute用法的详细讲解:1.基本用法Traceroute命令的基本使用语法如下:tracert [目标地址]例如,要跟踪到“tracertTraceroute将显示出到达目标地址所经过的节点的完整路径。

每个节点都有一个IP地址和延迟时间。

2.设置最大跳数所有节点。

如果您只想跟踪有限跳数的路径,可以使用“-h”参数设置最大跳数。

tracert -h [最大跳数] [目标地址]例如,要设置最大跳数为30,可以运行以下命令:tracert -h 30这将限制Traceroute到达目标地址的路径跳数不超过30个节点。

3.使用时间戳Traceroute命令还可以用时间戳显示每个节点的延迟时间。

通过使用“-d”参数,您可以显示每个节点的时间戳。

tracert -d [目标地址]例如,要显示延迟时间的时间戳,可以运行以下命令:tracert -d这将在输出中显示每个节点的IP地址和以毫秒为单位的延迟。

4.查找特定端口每个节点的延迟时间。

如果您希望仅检查到达目标地址上特定端口的延迟,可以使用“-p”参数。

tracert -p [端口号] [目标地址]例如,要跟踪到达目标地址上的端口80的路径,可以运行以下命令:tracert -p 80这将只检查通过端口80到达目标地址的节点的延迟。

5.保存输出结果默认情况下,Traceroute命令的输出将直接在命令提示符窗口中显示。

如果您希望将输出结果保存到文件中进行进一步分析,可以使用重定向操作符“>”。

traceroute命令的作用和原理

traceroute命令的作用和原理

traceroute命令的作用和原理概述:在网络中,数据包的传输是通过一系列的路由器进行转发的。

traceroute命令是一种网络诊断工具,用于追踪数据包从源主机到目标主机的路径。

它通过发送一系列的探测数据包,利用数据包的TTL(Time to Live)字段和ICMP(Internet Control Message Protocol)回显报文来测量每个中间路由器的往返时间,从而获得整个数据传输路径。

作用:traceroute命令的主要作用是帮助网络管理员或用户诊断网络连接问题,了解数据包在传输过程中经过的路由器,以及每个路由器的响应时间。

通过分析traceroute的输出结果,可以判断网络连接是否畅通,找到网络故障的根源,并采取相应的措施来解决问题。

原理:当执行traceroute命令时,源主机会发送一系列的UDP数据包,每个数据包的TTL值依次递增。

TTL是IP协议中的一个字段,用于限制数据包在网络中的生存时间,避免数据包无限循环。

每经过一个路由器,TTL值就会减1。

当TTL值为0时,路由器会将数据包丢弃,并向源主机发送ICMP超时报文。

源主机通过接收到的ICMP超时报文,就可以确定该路由器的IP地址。

traceroute命令通过反复发送TTL值递增的数据包,并根据每个数据包的回复来确定数据包的路径。

在输出结果中,traceroute会显示每个中间路由器的IP地址和响应时间。

通常,每个TTL值对应一行输出,最终输出结果包括了源主机到目标主机的完整路径。

使用traceroute命令时,可以通过一些选项来控制其行为。

例如,可以指定每个TTL值发送的数据包数量、数据包的TTL初始值、数据包的目标端口等。

这些选项可以根据具体的需求进行调整,以便更好地诊断网络问题。

总结:traceroute命令是一种非常有用的网络诊断工具,通过测量数据包的路径和响应时间,可以帮助我们了解网络连接的质量和稳定性。

它的原理是利用数据包的TTL字段和ICMP回显报文来追踪数据包的传输路径。

linux服务器traceroute用法

linux服务器traceroute用法

linux服务器traceroute用法
为了使用traceroute命令来追踪到达目标服务器的网络路径,
您可以按照以下步骤进行操作:
1. 打开终端窗口,登录到Linux服务器上。

2. 在终端窗口中输入以下命令:`traceroute 目标服务器地址`。

替换“目标服务器地址”为您要追踪的服务器的IP地址或域名。

3. 按下回车键后,traceroute会开始运行,并显示到达目标服
务器所经过的网络跳数以及每个跳点的延迟时间。

4. 运行结束后,您将看到目标服务器的网络路径和延迟时间的列表。

注意事项:
- 在某些Linux发行版中,您可能需要以管理员权限运行该命令,可以使用`sudo`命令来获取管理员权限。

- 可以使用`-T`选项将traceroute命令设置为使用TCP协议而不是默认的UDP协议。

例如,`traceroute -T 目标服务器地址`。

- 可以使用`-p`选项来指定使用的端口号。

例如,`traceroute -p
端口号目标服务器地址`。

希望这些信息能够帮助您使用traceroute命令来追踪Linux服
务器的网络路径!。

tcptraceroute使用方法

tcptraceroute使用方法

TCP Traceroute是一种网络诊断工具,用于跟踪TCP数据包在网络中的传输路径。

以下是使用TCP Traceroute的基本方法:1. 打开终端或命令提示符窗口。

2. 输入"tcptraceroute 目标IP地址",其中目标IP地址是要追踪的远程主机的IP地址。

3. 按下回车键执行命令。

4. TCP Traceroute会显示一系列的跃点(Hop)信息,包括目标主机的IP地址、跃点时间、协议类型等。

这些信息表示数据包在网络中的传输路径。

5. 可以使用"Ctrl + C"终止命令的执行。

请注意,使用TCP Traceroute需要具备管理员权限或以管理员身份运行命令提示符窗口。

此外,某些操作系统可能没有预装TCP Traceroute工具,您需要安装第三方工具或使用网络扫描器来获取目标主机的IP地址。

在执行TCP Traceroute时,还可以使用一些技巧来获取更详细的路径信息:* 调整跃点时间阈值:通过调整跃点时间阈值,可以控制命令返回更详细路径信息的数量。

默认情况下,阈值通常设置为500毫秒。

您可以尝试增加该值以获取更详细的路径信息,但请注意不要设置得太低,以免消耗过多的系统资源。

* 使用其他协议:除了跟踪TCP数据包,TCP Traceroute还可以用于跟踪UDP数据包。

通过在命令中添加"-u"选项,您可以同时追踪TCP和UDP数据包。

这有助于您了解在不同网络环境中不同协议的性能差异。

* 查看路由表:在某些情况下,您可以使用其他命令查看目标主机的路由表,以了解数据包可能的传输路径。

例如,在Linux上,可以使用"ip route"命令查看路由表。

总之,使用TCP Traceroute可以帮助您了解网络中数据包的传输路径,并帮助您识别网络故障和性能问题。

通过调整跃点时间阈值、使用其他协议以及查看路由表,您可以获得更详细的信息并更好地了解网络环境。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Xx 师范学院计算机与信息技术学院计算机网络原理 课程设计报告书课题名称 基于traceroute 实现目标路径的跟踪姓 名学 号院、系 计算机与信息技术专 业 计算机科学与技术指导教师2012年 12 月 27 日※※※※※※※※※ ※※ ※※ ※※ ※ ※※※※※※ 2010级学生计算机网络原理课程设计目录一、设计目的 (1)二、设计要求 (1)三、设计的理论基础、原理 (1)四、设计关键相关技术、算法及设计实现过程 (5)五、设计总结 (11)六、参考文献 (12)一、设计目的1.熟悉原始套接字编程。

2.了解网络的结构。

3.了解网络传输底层协议。

4.熟悉掌握 ICMP协议的工作原理和路由跟踪原理。

5.掌握vc6.0下程序调试、运行的基本方法。

6.通过实验熟悉协议的应用。

二、设计要求1、通过实验,可以使程序记录并显示了数据报从源端机器传送到目标机器的过程中所经过的路由器的IP地址,并且记录了数据报到达每个路由器所需要的时间。

认真观察到达每个路由器的时间有什么区别,从而熟练掌握tracert 的工作原理和ICMP报文协议。

2、当我们不能通过网络访问目的设备时,网络管理员就需要判断是哪里出了问题。

问题不仅仅会出现在最终目的设备,也可能出现在转发数据包的中间路由器。

三、设计理论基础、原理1、Dos命令Traceroute跟踪路由详解-d防止traceroute 试图将中间路由器的IP 地址解析为它们的名称。

这样可加速显示traceroute 的结果。

-h MaximumHops指定搜索目标(目的)的路径中存在的跃点的最大数。

默认值为30 个跃点。

-j HostList指定回显请求消息将IP 报头中的松散源路由选项与HostList 中指定的中间目标集一起使用。

使用松散源路由时,连续的中间目标可以由一个或多个路由器分隔开。

HostList 中的地址或名称的最大数量为9。

HostList 是一系列由空格分隔的IP 地址(用带点的十进制符号表示)。

仅当跟踪IPv4 地址时才使用该参数。

-w Timeout指定等待“ICMP 已超时”或“回显答复”消息(对应于要接收的给定“回现请求”消息)的时间(以毫秒为单位)。

如果超时时间内未收到消息,则显示一个星号(*)。

默认的超时时间为4000(4 秒)。

-R指定IPv6 路由扩展标头应用来将“回显请求”消息发送到本地主机,使用目标作为中间目标并测试反向路由。

-S指定在“回显请求”消息中使用的源地址。

仅当跟踪IPv6 地址时才使用该参数。

-4指定Traceroute.exe 只能将IPv4 用于本跟踪。

-6指定Traceroute.exe 只能将IPv6 用于本跟踪。

TargetName指定目标,可以是IP 地址或主机名。

-?在命令提示符下显示帮助。

2、Traceroute工作原理(1)Ttaceroute从源主机向目的主机发送一连串的IP数据报,数据报中封装的是无法交付的UDP用户数据报,第一个数据报p1的生存时间TTL设置为1。

当P1到达路径上的第一个路由器R1时,路由器R1先收下它,接着TTL的值减一。

由于TTL等于0了。

R1就把P1丢弃了,并向源主机发送一个ICMP时间超过差错报告报文。

(2)源主机接着发送第二个数据报P2,并把TTL设置为2。

P2先到达路由器R1,R1收下后把TTL减1再转发给路由器R2。

R2收到P2时TTL为1,但减1后TTL变为零了。

R2就丢弃P2,并向源主机发送一个ICMP时间超过差错报告报文。

这样一直继续下去。

但最后一个数据包刚刚到达目的主机时,数据报TTL是1.主机不转发数据报,也不把TTL值减1.但因IP数据报中封装的是无法交付的运输层的UDP用户数据报,因此目的主机要向源主机发送ICMP终点不可达差错报告报文。

(3)这样,源主机到达了自己的目的,因为这些路由器和最后目的主机发来的ICMP报文正好给出了源主机想知道的路由信息—达到目的主机所经过的路由器的IP地址,以及到达其中的每一个路由器的往返时间。

3、ICMP协议简介所有的互联网服务都使用一个底层无连接的分组交付系统,其中,一种称为IP路由器或者IP网关的计算机提供了物理网络之间的所有互连,它用来选择用于发送分组的路径。

当一台路由器收到一个分组后,分析分组中的源地址和目标地址,借助路由器内部的路由表,选择一条最合适的路径,将该分组交付给路径中的下一台主机或者路由器。

那么,当我们从一台主机发送数据报到另外一台主机时,有时为了了解网络结构或者分析故障,需要了解数据报所经过的网络路径,这时采用的办法就是路由跟踪,这样的过程也被称作TraceRoute。

为了让互联网中的路由器报告错误或者提供有关意外情况的信息,设计人员在TCP/IP中加入了一种具有特殊用途的报文机制,这种报文机制称为网际控制报文协议ICMP(Internet Control Message Protocol)。

在正常的IP数据报传输中,当路由器发现某个数据报有错误或者无法转发时,会向发出该IP数据报的原始站点发送ICMP报文,描述IP数据报中所存在的错误。

需要注意的是,ICMP 报文和其他协议报文(如UDP报文、TCP报文)一样,也是封装在IP数据报中的。

4、ICMP原理ICMP(Internet Control Message Protocal)是为了让互联网中的路由器报告错误或提供有关意外情况的信息而设计的一个特殊报文机制。

它是IP协议的附属协议,是封装在IP数据报内部传送的,如图1所示:ICMP的报文格式如图2所示:尽管每个ICMP报文都有自己的格式,但它们开始的三个字段都是一样的:一个8位的报文类型(type)用来标识报文,一个8位的代码(code)用来提供有关类型的进一步信息,一个16位的校验和(checksum)。

(ICMP采用和IP相同的校验和算法,但ICMP校验和只覆盖ICMP报文。

4、在创建套接字的时候可以使用函数:socket(int af, int type, int pr otocol)。

其中type为SOCK_STREAM或SOCK_DAGRAM; protocol一般取0,表示默认TCP/IP协议。

Winsock2中除了现有的地址簇,套接字类型和协议标识外,还添加了一些地址簇,套接字类型和协议标识。

可以通过创建原始套接字来访问控制底层传输协议,比如ICMP协议,IGMP 协议。

在本实验中,将使用ICMP协议来模拟tracert程序,也就是跟踪数据报在网络中传输时所经过的路由器。

5、以下列举几种常见的ICMP报文格式,也是TraceRoute中会遇到到的几种格式(1)回送请求和应答报文格式通常用这种报文格式来判断对方主机是否可达。

主机或者路由器向指定的目的站发送ICMP回送请求报文,任何收到此报文的计算机形成一个回送应答报文,将其返回给最初的发送者。

ping命令其实就是发送这种回送请求报文,然后等待接收回送应答报文。

当类型值为8时,表示回送请求报文,当类型值为0时,表示回送应答报文。

在发送端,一般约定通过标识符来标识该报文属于哪个进程(一般以进程ID作为标识符),通过序号来标识该报文属于该进程发送的第几个报文。

(2)目的站不可达报文格式当路由器无法转发或者直接交付IP数据报时,就会产生上述格式的目的站不可达报文。

根据其中代码值可以分为13种情况,需要特别提及的是当代码为3时,表示的含义为“端口不可达”,但事实上此时数据报已经到达目标主机,只是目标端口未响应,所以目标主机产生“端口不可达”的报文,仅仅从命名上容易产生误解,一定要注意。

当给目标主机的一个无法响应的端口发送UDP报文时,目标主机就会产生这种报文,其中代码值为3。

(3)数据报超时报文格式当路由器的选路表出现差错时,可能会形成一个选路循环,为了避免进入该循环的数据报在循环中无休止的传输下去,每个数据报都包含了一个寿命计时器,也就是IP数据报中的TTL字段。

只要路由器处理了某个数据报,就会将其中的TTL值减1,并且在该值减到0时丢弃该数据报,同时产生这样一个数据报超时报文,其中类型值为11,代码值为0。

下面举一个例子来描述TraceRoute的实现原理。

假设从源主机向目标主机发送一个IP数据报,当该数据报到达目标主机时,一共经过10个路由器转发,显然源主机发出的IP数据报中的TTL值应该是大于10的,否则该数据报会在途中超时,无法到达目标主机。

如果源主机向目标主机发送一个TTL值为n(1≤n≤10)的IP数据报,那么该数据报是无法到达目标主机的,会在途中第n个路由器超时,该路由器会向源主机发送一个ICMP超时报文,源主机则可以根据该超时报文获取途中第n个路由器的IP地址。

如果源主机向目标主机发送一个TTL值为m(m≥11)的IP数据报,那么该数据报可以到达目标主机。

如果在该IP数据报中封装不同类型的协议报文,目标主机则会做出不同的反应:a、如果该IP数据报内封装的是ICMP回送请求报文,目标主机就会向源主机发送一个ICMP回送应答报文。

b、如果该IP数据报内封装的是UDP报文,在这种报文中会指定目标端口,如果此时目标主机上的目标端口并没有与某个UDP套接字绑定,那么目标主机就会向源主机发送一个ICMP端口不可达报文,但是,如果此时目标主机上的目标端口已经和某个UDP套接字绑定,那么该UDP报文会被发给相关套接字,系统将不会产生ICMP端口不可达报文,因此在采用这种协议时,必须注意目标端口的选择。

c、如果该IP数据报内封装的是TCP报文,该报文也要指定目标端口,并将其中SYN标志置1,作为第一次握手。

如果此时目标主机上的目标端口正处在监听状态,那么目标主机会向源主机回应一个TCP报文,其中SYN和ACK标志位置1,确认号为上一次握手的序列号加1,但是如果此时目标主机上的目标端口不处在监听状态,那么目标主机也会向源主机回应一个TCP报文,不过将其中RST和ACK标志位置1,表示复位,不过确认号为上一次握手的序列号加上收到的字节数再加上1,这里收到的字节数指的是TCP报文中的数据部分字节数,为了验证这一点,程序中为第一次握手的TCP报文加上了10个字节的数据部分。

那么,为了获取源主机到目标主机沿途所经过的路由器地址,源主机只需依次发送TTL值为1、TTL值为2、TTL值为3……的IP数据报,接收沿途路由器返回的ICMP超时报文,从中提取路由器地址,直到最后收到目标主机的回应为止。

另外,当路由器无法将数据报交付给目标主机时,可能是因为选路失败或者网络故障,路由器会产生ICMP目的站不可达报文发送给源主机。

此时TraceRoute过程也应该终止。

6、利用原始socket实现及其要点为了能够方便的构造上文提到的各种报文,可以采用原始socket,自行填充IP数据报和内部封装的报文的所有字段。

相关文档
最新文档