Contents

【TroubleShooting】故障排除的工具介紹與使用方式--Slowly

簡單提一下網路緩慢時的處理方式與工具。

前言

自己在處理網路緩慢的問題經驗並不多,但基本上自己會先往幾個方向去思考問題點在哪:

  • 高延遲(High Latency),想一想我們前面提到 3 way handshake 時,假設一來一往,每一個步驟都要花 1000ms,建立一個連線要 3 秒鐘,這樣當然會慢啦。
  • 使用較小的 MSS,意味著在同樣的時間內所輸的資料較少,這樣也會感覺慢慢的。
  • 太多人使用,壅塞了!
  • 其他我可能沒想到的原因。

因為緩慢可能會有很多原因,可以透過一些工具來幫助自己釐清這些問題。
以下會對這些工具做一些簡單的介紹。

  • mtr
  • tcpdump, wireshark
  • iperf

mtr

mtr 就是把 traceroute(tracert) 跟 ping 組合起來,主要是用來觀察 latancy 或是 packet loss% 的工具。
其實就很像 traceroute,但 mtr 顯示的資訊更豐富,並會計算所有 hop 回應的百分比與回應時間。

$ mtr 8.8.8.8

那他會帶你進入一個介面做觀察,按 q 可以離開。

/posts/troubleshooting/%E6%95%85%E9%9A%9C%E6%8E%92%E9%99%A4%E7%9A%84%E5%B7%A5%E5%85%B7%E4%BB%8B%E7%B4%B9%E8%88%87%E4%BD%BF%E7%94%A8%E6%96%B9%E5%BC%8F-slowly/mtr_1.png
第一次看到 mtr 大概是這樣子

主要可以觀察到 packet 的遺失率,如果說有幾個不連續的幾個 node 掉了幾個封包,其實是不會造成太大的影響,但如果是某一個 node 後所有的 node 都有封包遺失,那一個 node 則會對整個傳輸造成影響,也就會讓使用者感受到緩慢,可以推測那個 node 上有問題。

另外可以觀察 icmp 封包的傳輸延遲,雖然 traceroute 也做得到,但 mtr 他提供的資訊比較多啦。

  • Last : 最後一次的延遲數值
  • Avg : 平均的延遲數值
  • Best : 最佳的延遲數值(最短)
  • Wrst : 最糟的延遲數值(最長)
  • StDev : 標準偏差(Standard Deviation),愈大代表這個 node 愈不穩定。

以上圖的例子來說,第二個點的延遲就有點糟且不太穩定。

另外可以加入一些參數做不同的使用:

## -n 可以強制以 IP address 顯示所有 node
$ mtr -n 8.8.8.8
/posts/troubleshooting/%E6%95%85%E9%9A%9C%E6%8E%92%E9%99%A4%E7%9A%84%E5%B7%A5%E5%85%B7%E4%BB%8B%E7%B4%B9%E8%88%87%E4%BD%BF%E7%94%A8%E6%96%B9%E5%BC%8F-slowly/mtr_2.png

前面我們提到 tcptraceroute,那在 mtr 上可以使用 tcp 或 udp 嗎?
可以的 !! 有時候也需要觀察 tcp 或 udp 資料在這段網路上的傳輸品質。

$ mtr --tcp 8.8.8.8 
$ mtr --udp 8.8.8.8

我想改變封包的 size 可以嗎? -s 會幫助你!
可以透過更改封包的大小來觀察網路使用狀況。

$ mtr -s [PACKETSIZE] 8.8.8.8

最後,可以透過 -r 這個參數做紀錄。

### 預設會送 10 次做觀察。
$ mtr -r 8.8.8.8 > [filename] 
### 透過 -c 調整次數,這樣他就會送 100 次。
$ mtr -r -c 100 8.8.8.8 > [filename] 
### 這樣他就會在背景送 1000 次,然後你可以去喝咖啡。
$ mtr -r -c 1000 8.8.8.8 > [filename] & 

tcpdump, Wireshark

tcpdump 是一個功能強大的,而且也是使用最廣泛的 sniffer 與分析工具,用來捕捉或過濾在特定介面上接收或傳輸的 TCP/IP packet。
基本上在多數的環境中都可以使用,並且可以將捕捉的結果儲存為 .pcap 格式,可以透過 Wireshark 做更進一步的分析。
坦白說,tcpdump 也是會在網路無法連線時使用到,像是 ssl 無法建立,或是 VLAN tag 設定錯之類的情形,我會把它放在這是因為,我自己在看 MSS 時會用到。MMS 的大小會影響傳輸效能。或觀察封包的往來時間。
Wireshark 也具有相同的功能,並提供圖形化介面做更容易的使用。 這邊只會介紹 tcpdump,基本上,環境預設是不會有這個工具,所以我們要先自行安裝。

# macOS(OSX)
$ brew install tcpdump
# Debian, Ubuntu
$ sudo apt-get install tcpdump

首先,我們可以選擇指定的介面捕捉封包。透過 -i 這個參數可以指定介面。

$ tcpdump -i eth0
16:59:22.920016 IP 172.20.10.4.50011 > a104-115-254-134.deploy.static.akamaitechnologies.com.https: Flags [.], ack 213539838, win 2048, length 0
16:59:22.920017 IP 172.20.10.4.50007 > a173-222-181-125.deploy.static.akamaitechnologies.com.https: Flags [.], ack 2165220779, win 2048, length 0
16:59:22.920017 IP 172.20.10.4.50003 > 137.155.120.34.bc.googleusercontent.com.https: Flags [.], ack 281486443, win 2048, length 0

那我們要如何知道,有哪些介面可以監聽呢?ifconfig
tcpdump 提供 -D 這個參數,讓我們可以知道可以使用哪些介面。

$ tcpdump -D

1.en0 [Up, Running, Wireless, Associated]
2.p2p0 [Up, Running, Wireless, Not associated]
3.awdl0 [Up, Running, Wireless, Associated]
4.llw0 [Up, Running, Wireless, Associated]
5.utun0 [Up, Running]
6.utun1 [Up, Running]
7.lo0 [Up, Running, Loopback]
8.en1 [Up, Running, Disconnected]
9.en2 [Up, Running, Disconnected]
10.gif0 [none]
11.stf0 [none]
12.XHC20 [none]
13.bridge0 [none, Disconnected]
14.en4 [none, Disconnected]

並可以透過 -n 再進一步,只捕獲這個介面上 IP 的封包。

$ tcpdump -n -i en0

另外還可以透過 -XX 這個參數,顯示封包的數據內容,並以 HEX 與 ASCII 格式顯示。

$ tcpdump -XX -i en0

17:04:15.996062 IP6 2001-b400-e35d-11b9-e87c-0c6e-2d6e-27bf.emome-ip6.hinet.net.50145 > 2403:300:a41:b02::7.https: Flags [P.], seq 3353679317:3353679348, ack 252170061, win 2048, options [nop,nop,TS val 2584095760 ecr 718123086], length 31
	0x0000:  feaa 8116 f864 80e6 501d eed8 86dd 602b  .....d..P.....`+
	0x0010:  0700 003f 0640 2001 b400 e35d 11b9 e87c  ...?.@.....]...|
	0x0020:  0c6e 2d6e 27bf 2403 0300 0a41 0b02 0000  .n-n'.$....A....
	0x0030:  0000 0000 0007 c3e1 01bb c7e5 15d5 0f07  ................
	0x0040:  cf4d 8018 0800 0bba 0000 0101 080a 9a06  .M..............
	0x0050:  2c10 2acd b04e 1503 0300 1a00 0000 0000  ,.*..N..........
	0x0060:  0000 022b 2353 39dc 701e eb0a d4f2 219e  ...+#S9.p.....!.
	0x0070:  6eca 679d 37                             n.g.7

前面提到,可以將這些紀錄儲存為 .pcap 格式,只需要透過 -w 即可使用。

$ tcpdump -w myFileName.pcap -i en0

既然可以寫入,那應該也可以讀取吧?
沒錯,透過 -r 這個參數可以讀取 .pcap 檔案。

$ tcpdump -r myFileName.pcap

接下來是一些更細部的參數,可以讓我們根據情境做調整:

# 只抓 TCP
$ tcpdump -i en0 tcp

# 只抓某個 port number 
$ tcpdump -i en0 port 22

# 只抓來源 IP 為 8.8.8.8 的
$ tcpdump -i en0 src 8.8.8.8
# 只抓目的 IP 為 168.95.1.1 的
$ tcpdump -i en0 src 168.95.1.1

因為這篇文章,主要是工具的使用,更細一步的分析,往後有時間會再撰寫吧。

iperf

iperf 是一種測量網路上最大頻寬的工具,可以調整 timing, buffer 與 protocol(TCP, UDP, ICMP …),並產生頻寬與損耗等相關報告。
一般來說,使用 iperf 要有兩個端點(node),透過兩個端點進行測量。(Server, Client)

# Server
$ iperf3 -s

# Client
$ iperf3 -c [Server IP address]

可…可是我只有一台電腦,那也可以透過公開的 iperf server 做測試。連結
不過我自己用了幾個,都是在忙碌中…

比較常用的參數有 -p, -u-t 等。

$ iperf -p 8888 -c [server] # 改 port number
$ iperf -u 8888 -c [server] # 改用 UDP,預設是 TCP
$ iperf -t 60 -c [server] # 更改傳輸的總時間

但這個工具我會建議用在做單個點的驗證,因為多個點時,使用 iperf 只會容易知道整體鏈路情況,但實際哪個點或哪幾個點有問題,可能還是要用 mtr 或類似的工具做補助。

參考資料

  1. mtr
  2. tcpdump
  3. wireshark
  4. iperf
  5. 各個工具的 -h, --help 指令,man 的說明。