tracepoint原理(timsort原理)
traceroute原理
一、traceroute原理一
1、从源地址发出一个UDP探测包到目的地址,并将TTL设置为1;
2、到达路由器时,将TTL减1;
3、当TTL变为0时,包被丢弃,路由器向源地址发回一个ICMP超时通知(ICMP Time Exceeded Message),内含发送IP包的源地址,IP包的所有内容及路由器的IP地址;
4、当源地址收到该ICMP包时,显示这一跳路由信息;
5、重复1~5,并每次设置TTL加1;
6、直至目标地址收到探测数据包,并返回端口不可达通知(ICMP Port Unreachable);
7、当源地址收到ICMP Port Unreachable包时停止traceroute。
二、traceroute原理二
1、从源地址发出一个ICMP请求回显(ICMP Echo Request)数据包到目的地址,并将TTL设置为1;
2、到达路由器时,将TTL减1;
3、当TTL变为0时,包被丢弃,路由器向源地址发回一个ICMP超时通知(ICMP Time Exceeded Message),内含发送IP包的源地址,IP包的所有内容及路由器的IP地址;
4、当源地址收到该ICMP包时,显示这一跳路由信息;
5、重复1~5,并每次设置TTL加1;
6、直至目标地址收到探测数据包,并返回ICMP回应答复(ICMPEcho Reply);
7、当源地址收到ICMP Echo Reply包时停止tracert。
【traceroute】关于traceroute(路由追踪)的原理分析
traceroute 主要利用 IP 数据包的 TTL 字段值 + ICMP 来实现,它发送的用于探测网络路径的数据包的 IP 之上的协议可以是 UDP、TCP或ICMP。
协议表示该数据报文所携带的数据所使用的协议类型,占 8 位。
该字段可以方便目的主机的 IP 层知道按照什么协议来处理数据部分。不同的协议有专门不同的协议号。
例如,TCP 的协议号为 6,UDP 的协议号为 17,ICMP 的协议号为 1。
不同模式下,探测过程中设计的数据包如下:
UDP 探测数据包(目标端口大于 30000) + 中间网关发回 ICMP TTL 超时数据包 + 目标主机发回 ICMP Destination Unreachable 数据包
TCP [SYN] 探测数据包(默认目标端口为 80) + 中间网关发回 ICMP TTL 超时数据包 + 目标主机发回 TCP [SYN ACK] 数据包
ICMP Echo (ping) Request 探测数据包 + 中间网关发回 ICMP TTL 超时数据包 + 目标主机发回 ICMP Echo (ping) reply 数据包
UDP 端口扫描比较麻烦,它同TCP不一样,因为它不需要建立连接。
我们向 目标主机 的固定端口发送UDP数据包,可以得到 两种结果:
在运营商的路由器上,UDP 与 ICMP 的待遇大不相同。
为了利于 troubleshooting,ICMP ECHO Request/Reply 是不会封的,而 UDP 则不同。
UDP 常被用来做网络攻击,因为 UDP 无需连接,因而没有任何状态约束它,比较方便攻击者伪造源 IP、伪造目的端口发送任意多的 UDP 包,长度自定义。
所以运营商为安全考虑,对于 UDP 端口常常采用白名单 ACL,就是只有 ACL 允许的端口才可以通过,没有明确允许的则统统丢弃。比如允许 DNS/DHCP/SNMP 等。
当网络工程师用Ping时,Ping在偷摸做啥事儿?
ping命令是依托于 ICMP协议的, ICMP协议的存在就是为了更高效的转发 IP数据报和提高交付成功的机会。
ping命令除了依托于 ICMP,在局域网下还要借助于 ARP协议, ARP协议能根据 IP地址反查出计算机的 MAC地址。
另外 ARP是有缓存的,为了保证 ARP的准确性,计算机会更新ARP缓存。
有时我们traceroute 一台主机时,会看到有一些行是以星号表示的。
出现这样的情况,可能是防火墙封掉了ICMP的返回信息,所以我们得不到什么相关的数据包返回数据。
有些路由器会隐藏的自己的位置,不让ICMP Timeout的消息通过,结果就是在那一跳上始终会显示星号。此外服务器也可以伪造traceroute路径的,不过一般应用服务器也没有理由这么做,所以Traceroute的结果还是能够为网络分析提供一些参考的。
Linux下traceroute程序默认发送的探测包为UDP协议,windows下tracert、mtr,以及Linux下mtr默认都发送的是icmp的数据包,并不是所有网关都会如实返回 ICMP 超时报文。处于安全性考虑,大多数防火墙以及启用了防火墙功能的路由器缺省配置为不返回各种 ICMP 报文,其余路由器或交换机也可能被管理员主动修改配置变为不返回 ICMP 报文。因此 Traceroute 程序不一定能拿到所有的沿途网关地址。所以,当某个 TTL 值的数据包得不到响应时,并不能停止这一追踪过程,程序仍然会把 TTL 递增而发出下一个数据包。这个过程将一直持续到数据包发送到目标主机,或者达到默认或用参数指定的追踪限制(maximum_hops 默认最大为30)才结束追踪
如果在局域网中的不同网段之间,我们可以通过traceroute 来排查问题所在,是主机的问题还是网关的问题。
如果我们通过远程来访问某台服务器遇到问题时,我们用到traceroute 追踪数据包所经过的网关,提交IDC服务商,也有助于解决问题;但目前看来在国内解决这样的问题是比较困难的,就是我们发现问题所在,IDC服务商也不可能帮助我们解决。
动态图解traceroute(路由追踪)的原理与实现
IP数据报格式详解
解析为何traceroute探测的时候中间有些节点探测不到?
traceroute使用与实现原理分析
traceroute(路由追踪)的原理及实现
为什么目标地址ping能通,但是tracetoute不通?
只会用ping测试网络通不通?高级网工还会这么用
当网络工程师用Ping时,Ping在偷摸做啥事儿?
traceroute原理
TCP/UDP/ICMP Traceroute的原理及区别
traceroute
traceroute 是用来检测发出数据包的主机到目标主机之间所经过的网关数量的工具。traceroute 的原理是试图以最小的TTL发出探测包来跟踪数据包到达目标主机所经过的网关,然后监听一个来自网关ICMP的应答。发送数据包的大小默认为 38个字节。
tracert [-d] [-h maximum_hops] [-j computer-list] [-w timeout] target_name
SYNOPSIS
???????traceroute [-46dFITUnreAV] [-f first_ttl] [-g gate,...]
???????????????[-i device] [-m max_ttl] [-p port] [-s src_addr]
???????????????[-q nqueries] [-N squeries] [-t tos]
???????????????[-l flow_label] [-w waittime] [-z sendwait]
???????????????[-UL] [-P proto] [--sport=port] [-M method] [-O mod_options]
???????????????[--mtu] [--back]
???????????????host [packet_len]
traceroute [参数选项] hostname,域名或 IP地址
-i 指定网络接口,对于多个网络接口有用。比如 -i eth1 或-i ppp1等;
-m 把在外发探测试包中所用的最大生存期设置为max-ttl次转发,默认值为30次;
-n 显示IP地址,不查主机名。当DNS不起作用时常用到这个参数;
-p port 探测包使用的基本UDP端口设置为port ,默认值是33434
-q n 在每次设置生存期时,把探测包的个数设置为值n,默认时为3;
-r 绕过正常的路由表,直接发送到网络相连的主机;
-w n 把对外发探测包的等待响应时间设置为n秒,默认值为3秒;
用法实例:
traceroute? ?
pc:~$ traceroute?
traceroute: Warning: has multiple addresses; using 220.181.111.188
traceroute to (220.181.111.188), 64 hops max, 52 byte packets
1??bogon (10.x.x.x)??0.968 ms??0.711 ms??0.710 ms
2??bogon (172.x.x.x)??0.571 ms??0.545 ms??0.429 ms
3 129.x.x.x.broad.bj.bj.dynamic.163data.com .cn (219.x.x.x)??4.131 ms??3.252 ms??2.789 ms
4 25.x.x.x.static.bjtelecom.net (106.x.x.x)??2.565 ms??2.067 ms??2.133 ms
5??* * *
6??36.x.x.x (36.x.x.x)??3.360 ms
????219.x.x.x (219.x.x.x)??3.425 ms
????36.x.x.x (36.x.x.x)??3.304 ms
7??* * *
8??220.x.x.x (220.x.x.x)??2.803 ms??4.935 ms
????220.x.x.x (220.x.x.x)??3.736 ms
9??* * *
traceroute?-m?10? ? ? ? 设置跳数为10
pc:~ $ traceroute -m 10?
traceroute: Warning: has multiple addresses; using 220.181.111.188
traceroute to? (220.181.111.188), 10 hops max, 52 byte packets
1??bogon (10.x.x.x)??1.067 ms??4.024 ms??0.712 ms
2??bogon (172.x.x.x)??0.309 ms??0.337 ms??0.607 ms
3?? 129.x.x.x.broad.bj.bj.dynamic.163data.com .cn (219.x.x.x)??2.683 ms??3.353 ms??2.947 ms
4?? 25.x.x.x.static.bjtelecom.net (x.x.x.25)??2.179 ms??2.325 ms??2.043 ms
5??* * *
6??36.x.x.x (36.x.x.x)??3.590 ms??7.793 ms??6.461 ms
7??* * *
8??220.x.x.x (220.x.x.x)??3.175 ms??2.893 ms
????220.x.x.x (220.x.x.x)??5.538 ms
9??* * *
10??* * *
traceroute?-n? ? ? ?只显示ip
pc:~ $ traceroute -n?
traceroute: Warning: has multiple addresses; using 220.181.111.188
traceroute to? (220.181.111.188), 64 hops max, 52 byte packets
1??10.x.x.x??0.946 ms??0.761 ms??0.718 ms
2??172.x.x.x??0.452 ms??0.338 ms??0.389 ms
3??219.x.x.x??3.174 ms??4.038 ms??2.379 ms
4??106.x.x.x??2.910 ms??1.960 ms??1.654 ms
5??* * *
6??36.x.x.x??3.321 ms??4.275 ms??3.637 ms
traceroute?-p?6888? ?? ? 设置探测包使用的基本UDP端口
pc:~ $ traceroute -p 6888?
traceroute: Warning: has multiple addresses; using 220.181.111.188
traceroute to? (220.181.111.188), 64 hops max, 52 byte packets
1??bogon (10.x.x.x)??0.989 ms??0.752 ms??0.722 ms
2??bogon (172.x.x.x)??0.489 ms??0.399 ms??0.327 ms
3?? 129.x.x.x.broad.bj.bj.dynamic.163data.com .cn (219.x.x.x)??3.094 ms??3.442 ms??3.529 ms
4?? 25.x.x.x.static.bjtelecom.net (106.x.x.x)??1.837 ms??2.488 ms??2.516 ms
5??* * *
6??* 36.x.x.x (36.x.x.x)??4.876 ms
traceroute?-q?4? ? ?设置探测包的个数
pc:~$ traceroute -q 4?
traceroute: Warning: has multiple addresses; using 220.181.111.188
traceroute to? (220.181.111.188), 64 hops max, 52 byte packets
1??bogon (10.x.x.x)??0.970 ms??0.721 ms??4.360 ms??0.667 ms
2??bogon (172.x.x.x)??0.534 ms??0.640 ms??0.363 ms??0.449 ms
3?? 129.x.x.x.broad.bj.bj.dynamic.163data.com .cn (x.x.x.129)??2.831 ms??3.221 ms??2.878 ms??2.814 ms
4?? 25.x.x.x.static.bjtelecom.net (x.x.x.25)??1.921 ms??2.564 ms??2.472 ms??3.979 ms
5?? 177.x.x.x.static.bjtelecom.net (x.x.x.177)??2.465 ms * * *
6??219.x.x.x (219.x.x.x)??4.245 ms
????36.x.x.x (36.x.x.x)??3.681 ms??3.053 ms
????220.x.x.x (220.x.x.x)??3.444 ms
traceroute?-r? ? ? ?绕过正常的路由表直接发送到网络相连的主机
pc:~ $ traceroute -r?
traceroute: Warning: has multiple addresses; using 220.181.111.188
traceroute to? (220.181.111.188), 64 hops max, 52 byte packets
traceroute: sendto: Network is unreachable
1 traceroute: wrote 52 chars, ret=-1
*traceroute: sendto: Network is unreachable
traceroute: wrote 52 chars, ret=-1
*traceroute: sendto: Network is unreachable
traceroute: wrote 52 chars, ret=-1
*
traceroute: sendto: Network is unreachable
2 traceroute: wrote 52 chars, ret=-1
traceroute -w 3? ? ? ? ?把对外发探测包的等待响应时间设置为n秒,默认值为3秒
pc:~ $ traceroute -w 3
traceroute: Warning: has multiple addresses; using 220.181.111.188
traceroute to? (220.181.111.188), 64 hops max, 52 byte packets
1??bogon (10.x.x.x)??0.957 ms??0.710 ms??0.713 ms
2??bogon (172.x.x.x)??0.603 ms??0.616 ms??0.321 ms
3? 129.x.x.x.broad.bj.bj.dynamic.163data.com .cn (x.x.x.129)??3.744 ms??2.371 ms??2.625 ms
4? 25.x.x.x.static.bjtelecom.net (x.x.x.25)??2.022 ms *??3.474 ms
5??* * *
6??36.x.x.x (36.x.x.x)??4.408 ms??5.760 ms??3.091 ms
7??* * *
8??220.x.x.x (220.x.x.x)??3.482 ms
????220.x.x.x (220.x.x.x)??3.024 ms
????220.x.x.x (220.x.x.x)??3.377 ms
9??* *
traceroute -i eth0 -4? ?使用eth0网口以及IPV4协议
[root@ip-ops]# traceroute -i eth0 -4?
traceroute to (220.181.112.244), 30 hops max, 60 byte packets
1? compute.amazonaws.com .cn (54.x.x.x)??15.993 ms? compute.amazonaws.com .cn (54.x.x.x)??11.778 ms .compute.amazonaws.com .cn (54.x.x.x)??12.896 ms
2??100.x.x.x (100.x.x.x)??21.890 ms 100.x.x.x (100.x.x.x)??21.880 ms 100.x.x.x (100.x.x.x)??21.630 ms
3??100.x.x.x (100.x.x.x)??12.609 ms 100.x.x.x (100.x.x.x)??22.017 ms 100.x.x.x(100.x.x.x)??14.010 ms
4??100.x.x.x (100.x.x.x)??0.256 ms 100.x.x.x (100.x.x.x)??0.261 ms 100.x.x.x (100.x.x.x)??0.209 ms
5??54.x.x.x (54.x.x.x)??1.071 ms 54.x.x.x (54.x.x.x)??1.536 ms??1.639 ms
怎么使用trace point linux
每个追踪点都包含2个元素:
- 追踪点定义。位于头文件中。
- 追踪点声明。位于C文件中。
使用追踪点时,需要包含头文件linux/tracepoint.h.
例如,在文件[include/trace/subsys.h]中:
#include linux/tracepoint.h
DECLARE_TRACE(subsys_eventname,
TP_PROTO(int firstarg, struct task_struct *p),
TP_ARGS(firstarg, p));
在文件[subsys/file.c](添加追踪声明的地方)中:
#include trace/subsys.h
DEFINE_TRACE(subsys_eventname);
void somefct(void)
{
systrace实现原理
systrace是通过atrace和ftrace一起实现。
抓取systrace的adb命令如下:
adb shell atrace -t 8 -z gfx view wm am sched freq input atrace
python命令:
python systrace.py -b 10240 -t 10 wm am input ss power view freq workq sched idle sync gfx view hal dalvik disk -a com.tencent.mm -o PD1982_weixin.html
systrace抓取实质是通过atrace实现,下面以ATRACE_CALL()为例说明systrace实现
system/core/libutils/include/utils/Trace.h
system/core/libcutils/include/cutils/trace.h
system/core/libcutils/trace-dev.cpp
system/core/libcutils/trace-dev.inc
到这可以看出:
ATRACE_CALL其实就是往atrace_marker_fd写入函数名和进程pid等信息,其中atrace_marker_fd对应“/sys/kernel/debug/tracing/trace_marker”文件
systrace在内核层实质是通过ftrace来实现,systrace的内容是写入内核分配的ringbuffer里面的,开关的实质是disable/enable ringbuffer,ftrace的总开关/sys/kernel/debug/tracing/tracing_on
开关ftrace命令如下:
adb shell echo 1 /sys/kernel/debug/tracing/tracing_on
adb shell echo 0 /sys/kernel/debug/tracing/tracing_on
通过tracing_mark_write函数把内容写入ringbuffer
msm-4.19/kernel/trace/trace.c
大致原理参考下图:
ftrace就是function trace的缩写,每个函数的追踪都有一个对应的tracepoint结构来表示,这个结构存放在特殊的section内存中。
msm-4.19/include/linux/tracepoint-defs.h
3.1 tracepoint的probe函数注册
以高通gpu驱动ftrace为例,通过以下命令可以触发tracepoint的probe函数注册
adb shell echo 1 /sys/kernel/debug/tracing/events/kgsl/enable
msm-4.19/kernel/tracepoint.c
tracepoint的probe函数实质是在下面这个宏里面定义,通过这个函数ftrace往对应的ringbuffer里面写入函数追踪数据
msm-4.19/include/trace/trace_events.h
3.2 probe函数的调用
以高通gpu驱动入列一条绘制命令_queue_drawobj函数为例
msm-4.19/drivers/gpu/msm/adreno_dispatch.c
通过trace_adreno_cmdbatch_queued来追踪_queue_drawobj函数,调用tracepoint的probe函数
接下来看下trace_adreno_cmdbatch_queued的实现
msm-4.19/drivers/gpu/msm/adreno_trace.h
trace_adreno_cmdbatch_queued真正定义在下面这个宏里面
msm-4.19/include/linux/tracepoint.h
最终调用到tracepoint注册的probe函数
msm-4.19/include/linux/tracepoint.h
总结下:Native层调用内核的tracing_mark_write来往ftrace的ringbuffer里面写入数据,而内核函数调用其对应probe函数往ftrace ringbuffer写入数据。