目錄
- 前言
- 理解
前言
面試靈魂一問:說說對 IP 數據報中 TTL 的理解?
我們都知道,IP 數據報由首部和數據兩部分組成,首部又分為兩部分:固定部分和可變部分,共占 20 字節,而即將討論的 TTL 就位于首部的固定部分,這個 TTL 指的就是數據報在網絡環境中的“生存時間”
。
理解
TTL 是“生存時間”
的英文縮寫(Time To Live),共占 8 位,由發出數據報的源點進行設置,目的是為了防止無法交付的數據報無限制存在于互聯網中,從而耗費網絡資源。TTL 最初的設計是以“秒”
為單位,數據報每進過一個路由器就把 TTL 減去數據報在路由器所消耗的時間。當 TTL 值減為 0 時,就丟棄這個數據報。
而現在的計算機網絡中 TTL 的單位已經不再是“秒”
,而是“跳數”
,其含義就是數據報在互聯網中可以經過的路由器數量,由于 TTL 占 8 位,因此,數據報可在互聯網中可經過的路由器數量的最大值為 255。
不同操作系統中,默認的 TTL 不一樣,常見默認值如下:
操作系統 / 設備 | 默認 TTL 值 |
---|---|
Windows | 128 |
Linux / Unix | 64 |
Cisco 路由器 | 255 |
Solaris | 255 |
FreeBSD / macOS | 64 |
Android | 64 |
TTL 默認值是否可修改?答案是“可以”
,以 Linux 系統為例。
查看當前值:
cat /proc/sys/net/ipv4/ip_default_ttl
臨時修改:
echo 128 > /proc/sys/net/ipv4/ip_default_ttl
永久修改:
echo 'net.ipv4.ip_default_ttl = 128' >> /etc/sysctl.conf
sysctl -p
那如何直觀理解 TTL 跳數?我們繼續舉個例子,比如我 ping www.baidu.com
上圖顯示 TTL=52
表示 ICMP 數據報經過了 64 - 52 = 12
個路由器。
驗證是不是 12 個路由器:
[root@ism ~]# traceroute -T www.baidu.com
traceroute to www.baidu.com (183.2.172.17), 30 hops max, 60 byte packets1 _gateway (172.17.10.1) 0.482 ms * *2 192.168.11.1 (192.168.11.1) 0.418 ms * *3 * * *4 * * *5 * * *6 * * *7 113.96.4.234 (113.96.4.234) 38.721 ms * *8 * * *9 14.29.117.178 (14.29.117.178) 30.439 ms 32.970 ms 34.381 ms
10 * * *
11 * * *
12 * * *
13 183.2.172.17 (183.2.172.17) 34.743 ms 35.205 ms *
在 traceroute
輸出中,最后成功到達目標主機 183.2.172.17
是在第 13 跳
說明:
172.17.10.1:這是我本地的三層交換機,具備網絡層,所以這里 TTL 會 -1
192.168.11.1:這是我本地的路由器,這里 TTL 也會 -1
所以:
- 數據報在到達目標前經過了 12 個路由器(即跳數為 12);
- 第 13 個 TTL 的數據包才到達目標主機;
- TTL 初始值如果是 64,那么最終在目標返回時,你會在
ping
等工具里看到ttl=52
(64 - 12),如上圖所示; - 實際中,跳數大于 30 就很少見了,一般公網路徑 10~20 跳是常見范圍。