Bộ lệnh để trả lời "mạng chậm/đứt ở đâu". Gói trên Ubuntu: iperf3, mtr-tiny (hoặc mtr), iputils-ping, iputils-tracepath, netcat-openbsd, curl. Lệnh xem IP/route/socket nằm ở Linux network cheatsheet.
iperf3 – băng thông
| Mục đích | Lệnh |
|---|---|
| Chạy server (port mặc định 5201) | iperf3 -s |
| Server chỉ phục vụ 1 lần rồi thoát | iperf3 -s -1 |
| Client TCP 10 giây (client → server) | iperf3 -c 203.0.113.5 |
| Chiều ngược lại (server → client) | iperf3 -c 203.0.113.5 -R |
| Cả hai chiều cùng lúc (iperf3 3.7+) | iperf3 -c 203.0.113.5 --bidir |
| 4 luồng song song, 30 giây | iperf3 -c 203.0.113.5 -P 4 -t 30 |
| UDP 100 Mbit/s, xem jitter và loss | iperf3 -c 203.0.113.5 -u -b 100M |
| Port khác / ép IPv6 | iperf3 -c 2001:db8::5 -p 5202 -6 |
| Bind source IP (máy nhiều uplink) | iperf3 -c 203.0.113.5 -B 198.51.100.10 |
| Xuất JSON | iperf3 -c 203.0.113.5 -J > result.json |
TCP một luồng thấp mà -P 4 cao: thường do RTT lớn + window nhỏ, không phải link yếu. UDP: tăng dần -b đến khi loss xuất hiện để tìm trần.
mtr – loss và latency theo hop
| Mục đích | Lệnh |
|---|---|
| Báo cáo 100 vòng, không DNS, kèm IP | mtr -rwn -c 100 203.0.113.5 |
| Hiển thị AS number mỗi hop | mtr -rwz -c 50 203.0.113.5 |
| Dùng TCP SYN tới port 443 (qua firewall chặn ICMP) | sudo mtr -T -P 443 -rwn -c 50 203.0.113.5 |
| Dùng UDP | mtr -u -rwn -c 50 203.0.113.5 |
| Hiện nhãn MPLS (ICMP extension) | mtr -e -rwn 203.0.113.5 |
| Xuất JSON | mtr -j -c 20 203.0.113.5 |
| Khoảng cách giữa probe (root mới được < 1 s) | sudo mtr -i 0.2 -rwn -c 200 203.0.113.5 |
Loss ở một hop giữa nhưng các hop sau 0% = router đó rate-limit ICMP, không phải mất gói thật. Chỉ tin loss kéo dài tới hop cuối.
Ping, MTU, path
| Mục đích | Lệnh |
|---|---|
| Ping 5 gói, timeout mỗi gói 1 s | ping -c 5 -W 1 203.0.113.5 |
| Ping nhanh để thấy loss (cần root khi < 0.2 s) | sudo ping -i 0.05 -c 500 -q 203.0.113.5 |
| Kiểm tra MTU 1500 (IPv4: 1472 + 28 header, cấm phân mảnh) | ping -M do -s 1472 -c 3 203.0.113.5 |
| Kiểm tra jumbo 9000 | ping -M do -s 8972 -c 3 203.0.113.5 |
| IPv6 MTU 1500 (1452 + 48 header) | ping -6 -M do -s 1452 -c 3 2001:db8::5 |
| Ping từ source / interface cụ thể | ping -I eth1 203.0.113.5 |
| Dò PMTU theo hop, không cần root | tracepath -n 203.0.113.5 |
ping -M do báo message too long, mtu=1400 → có hop MTU nhỏ hơn (tunnel, PPPoE, GRE/VXLAN). Đối chiếu với ip link MTU của interface.
nc – port và kết nối thô
| Mục đích | Lệnh |
|---|---|
| Port TCP có mở không (timeout 3 s) | nc -zv -w 3 203.0.113.5 443 |
| Quét dải port | nc -zv -w 1 203.0.113.5 20-25 |
| Kiểm tra UDP (chỉ tin khi có phản hồi) | nc -zuv -w 2 203.0.113.5 161 |
| Mở listener để test firewall | nc -l 5000 (đầu kia: nc 203.0.113.5 5000) |
| Gửi một dòng rồi đóng | echo test | nc -q 1 203.0.113.5 5000 |
| Đẩy file qua TCP | nc -l 5000 > out.bin / nc -N 203.0.113.5 5000 < in.bin |
Cú pháp trên là netcat-openbsd (mặc định Ubuntu). Bản ncat (nmap) và netcat-traditional khác flag.
curl – thời gian từng pha
curl -o /dev/null -s -w 'code=%{http_code} dns=%{time_namelookup} tcp=%{time_connect} tls=%{time_appconnect} ttfb=%{time_starttransfer} total=%{time_total}\n' https://example.com/Các mốc tính cộng dồn từ lúc bắt đầu: TLS handshake = time_appconnect - time_connect, thời gian server xử lý ≈ time_starttransfer - time_appconnect.
| Mục đích | Lệnh |
|---|---|
| Chỉ xem header + verbose TLS | curl -sv -o /dev/null https://example.com/ |
| Ép IP đích, giữ SNI/Host (test backend cụ thể) | curl --resolve example.com:443:203.0.113.5 https://example.com/ |
| Chuyển host:port sang đích khác | curl --connect-to example.com:443:203.0.113.5:8443 https://example.com/ |
| Giới hạn thời gian connect / tổng | curl --connect-timeout 3 -m 10 https://example.com/ |
| Ra bằng interface / source IP | curl --interface eth1 https://example.com/ |
| Lặp 20 lần lấy total time | for i in $(seq 20); do curl -o /dev/null -s -w '%{time_total}\n' https://example.com/; done | sort -n |
Lỗi TLS/chứng chỉ chi tiết: xem TLS troubleshooting. Giả lập mạng xấu để thử: tc netem.