traceroute使用ICMP 和TTL,ICMP 用於回顯信息,包括IP,TTL,sequence number等。TTL字段是發送端初始設置的字段,RFC指定的值為64,對於每個處理數據包的路由器都需要把TTL的值減1或者減去在路由器中停留的時間,一般路由器轉發數據包的時延不超過1s,因此TTL可以作為跳數的計數值。
如果路由器收到的IP數據包的TTL值為0或者1,路由器將不會轉發數據包,將數據包丟棄並發送ICMP超時信息。包含ICMP信息的IP報文的源地址是該路由器的IP地址。Traceroute可以用做追溯網關的工具,只要設置合理設置TTL值。發送一份TTL值為1的數據報,第一個路由器將TTL值減1,丟棄該數據報,並發送ICMP超時信息,得到第一個路由器的IP,同理發送一份TTL值為2的數據報得到第二個路由器的地址。繼續這個過程直至該數據報到達目的主機,但是目的主機哪怕接收到TTL值為1的IP報文,也不會丟棄該數據報並發送ICMP報文,因為數據報已經到達目的地,如何判斷是否已經到達目的主機?發送一份UDP數據報給目的主機,其中UDP使用的端口號是不可達的端口,根據ICMP報文是超時還是端口不可達區分是否為目的主機。
linux系統 TTL值的修改位置是/proc/sys/net/ipv4/ip_default_ttl,
echo 128 > /proc/sys/net/ipv4/ip_default_ttl
(這是短暫性的)若要設置長久的可以:
修改/etc/sysctl.conf配置文件,添加如下一行
net.ipv4.ip_default_ttl=128