網(wǎng)絡(luò)連通性檢測
當(dāng)應(yīng)用出現(xiàn)網(wǎng)絡(luò)異常時,首先需要確認(rèn)的就是網(wǎng)絡(luò)的連通性是否正常,下面一組命令可快速檢測網(wǎng)絡(luò)的連通性,如下:
檢測DNS
dig www.baidu.combash
nslookup www.baidu.combash
host www.baidu.com
檢測主機(jī)是否可達(dá)
ping www.baidu.com
檢測port是否可達(dá)
#檢查tcp端口
telnet www.baidu.com 80
#檢查udp端口
nc -uvz ip port
檢測SSL
SSL認(rèn)證也經(jīng)常導(dǎo)致程序無法連接,主要出現(xiàn)在SSL握手過程中。
openssl s_client -connect www.baidu.com:443 -prexit
一鍵檢測
多數(shù)情況下,可以使用curl一鍵檢測所有過程,如果有問題,再使用上面的命令逐個排查。
curl -v http://www.baidu.com:80/
時間消耗分布
使用curl可檢測出http協(xié)議接口各階段花費(fèi)的時間。
$ curl -o /dev/null -s -w " time_namelookup:%{time_namelookup}sn time_connect:%{time_connect}sn time_starttransfer:%{time_starttransfer}sn time_total:%{time_total}sn speed_download:%{speed_download}n http_code:%{http_code}" "http://www.baidu.com"
time_namelookup:0.016542s
time_connect:0.038686s
time_starttransfer:0.063550s
time_total:0.063593s
speed_download:37793.000
http_code:200
time_namelookup:開始到DNS查詢完成的時間
time_connect:開始到TCP三次握手完成的時間
time_starttransfer:開始到收到服務(wù)端發(fā)來首字節(jié)數(shù)據(jù)的時間
time_total:開始到服務(wù)端數(shù)據(jù)接收完成的時間
檢查socket連接
由于網(wǎng)絡(luò)通信都需要靠socket,所以檢查一下socket連接以及它的分布情況也是非常有必要的。
檢查端口是否監(jiān)聽
服務(wù)端程序一定會監(jiān)聽至少一個端口,檢查監(jiān)聽socket是否存在,也是判斷服務(wù)進(jìn)程是否還存在的一種方法。
netstat -nltp|grep 8080
lsof -nP -i -sTCP:LISTEN|grep 8080
查看socket狀態(tài)分布
$ ss -s
$ netstat -nat | awk '/tcp/{print $6}'|sort|uniq -c
9 CLOSE_WAIT
102 ESTABLISHED
55 LISTEN
70 TIME_WAIT
需格外關(guān)注TIME_WAIT與CLOSE_WAIT這兩種狀態(tài)的數(shù)量,如果TIME_WAIT過多,可考慮優(yōu)化內(nèi)核網(wǎng)絡(luò)參數(shù)或使用連接池,如果CLOSE_WAIT過多,就需要檢查程序代碼中哪里出現(xiàn)了連接泄露,導(dǎo)致未關(guān)閉連接了。
誰連我最多
netstat -ant | awk '/tcp/{rl=split($5,r,":");printf "%16st%sn",$4,r[rl-1]}' | sort | uniq -c | sort -nrk1 | head -n10
我連誰最多
netstat -ant | awk '/tcp/{ll=split($4,l,":");printf "%11st%sn",l[ll-1],$5}' | sort | uniq -c | sort -nrk1 | head -n10
網(wǎng)絡(luò)使用率檢測
查看各連接網(wǎng)速
iftop -B -nNP
查看各進(jìn)程網(wǎng)速
nethogs
查看網(wǎng)卡網(wǎng)速
sar -n DEV 1
ifstat
查看網(wǎng)卡是否丟包
# ifconfig命令,觀察overrun/error/drop這幾項(xiàng)
ifconfig
# 同樣,觀察類似overflow、error、drop這些項(xiàng)
ethtool -S eth0
TCP層丟包與重傳
有時,網(wǎng)卡層未出現(xiàn)丟包,但網(wǎng)絡(luò)中間鏈路有可能出現(xiàn)丟包,這會導(dǎo)致tcp層重傳,另外,如果tcp層的內(nèi)核參數(shù)設(shè)置不合理,也可能導(dǎo)致丟包,比如backlog設(shè)置過小,服務(wù)器端網(wǎng)絡(luò)io處理不過來。
$ sar -n TCP,ETCP 1
$ sudo watch -d -n1 'netstat -s|grep -iE "listen|pruned|collapsed|reset|retransmit"'
2879 connection resets received
378542 segments retransmitted
3357875 resets sent
52 resets received for embryonic SYN_RECV sockets
5 times the listen queue of a socket overflowed
5 SYNs to LISTEN sockets dropped
TCPLostRetransmit: 235599
6337 fast retransmits
7877 retransmits in slow start
10385 connections reset due to unexpected data
1183 connections reset due to early user close
網(wǎng)絡(luò)抓包
純文本抓包
# ngrep比較適合抓包類似http這種的純文本協(xié)議
sudo ngrep -W byline port 3306
# 在無法使用抓包命令的情況下,也可使用nc、socat之類的網(wǎng)絡(luò)工具,做一個端口轉(zhuǎn)發(fā),同時將轉(zhuǎn)發(fā)流量打印出來
# 另外在抓包https時,也可以使用socat將https流量代理為http流量,再進(jìn)行抓包
socat -v TCP4-LISTEN:9999,bind=0.0.0.0,reuseaddr TCP4:remoteIp:9999
通用抓包工具
# tcpdump抓包給wireshark分析
sudo tcpdump tcp -i eth1 -s 0 -c 10000 and port 9999 -w ./target.cap
# 抓rst包,用于網(wǎng)絡(luò)經(jīng)常出現(xiàn)connection reset異常的情況
sudo tcpdump -ni any -s0 tcp and 'tcp[13] & 4 != 0 ' -vvv
# 抓fin包,用于網(wǎng)絡(luò)經(jīng)常斷連的情況
sudo tcpdump -ni any -s0 tcp and 'tcp[13] & 1 != 0 ' -vvv
MySQL抓包
$ sudo tshark -i eth0 -n -f 'tcp port 3306' -Y 'mysql' -T fields -e frame.number -e frame.time_epoch -e frame.time_delta_displayed -e ip.src -e tcp.srcport -e tcp.dstport -e ip.dst -e tcp.stream -e tcp.len -e tcp.nxtseq -e tcp.time_delta -e tcp.analysis.ack_rtt -e mysql.query
Running as user "root" and group "root". This could be dangerous.
Capturing on 'ens33'
4 1605412440.114466205 0.000000000 10.224.72.135 3306 59016 10.221.38.217 0 88 89 0.001027726
6 1605412440.160709874 0.046243669 10.221.38.217 59016 3306 10.224.72.135 0 185 186 0.000020998
8 1605412440.160929986 0.000220112 10.224.72.135 3306 59016 10.221.38.217 0 48 137 0.000211802
9 1605412440.213810997 0.052881011 10.221.38.217 59016 3306 10.224.72.135 0 24 210 0.052881011 0.052881011
11 1605412440.214178087 0.000367090 10.224.72.135 3306 59016 10.221.38.217 0 22 159 0.000341184
12 1605412440.258391363 0.044213276 10.221.38.217 59016 3306 10.224.72.135 0 37 247 0.044213276 0.044213276 select @@version_comment limit 1
14 1605412440.258812895 0.000421532 10.224.72.135 3306 59016 10.221.38.217 0 83 242 0.000395748
15 1605412440.303693157 0.044880262 10.221.38.217 59016 3306 10.224.72.135 0 13 260 0.044880262 0.044880262 select 1
16 1605412440.303955060 0.000261903 10.224.72.135 3306 59016 10.221.38.217 0 49 291 0.000261903 0.000261903
17 1605412440.351387241 0.047432181 10.221.38.217 59016 3306 10.224.72.135 0 5 265 0.047432181 0.047432181
grpc抓包
對于grpc抓包,可以先使用tcpdump抓下來,然后到wireshark中查看,也可使用我從github找到的這個項(xiàng)目https://github.com/rmedvedev/grpcdump
sudo grpcdump -i eth0 -p 9999 -proto-path ~/protos -proto-files order/v1/log_service.proto
傳輸文件
使用scp
#上傳文件到遠(yuǎn)程機(jī)器
scp test.txt root@remoteIp:/home/
#從遠(yuǎn)程機(jī)器下載文件
scp root@remoteIp:/home/test.txt .
使用ncat
ncat其實(shí)就是常說的nc,但由于netcat也叫nc且用法稍有不同(ubuntu上的nc就是netcat),避免混淆,這里直接使用ncat
# 接收文件端
ncat -l 9999 > test.txt
# 發(fā)送文件端
ncat remoteIp 9999 < test.txt
使用Python http server
python的http server經(jīng)常用于分享本機(jī)文件給其它人,非常方便。
python -m SimpleHTTPServer 8000
wget http://remoteIp:8000/test.txt
使用使用python ftp server
使用python可以快速搭建一個ftp server,這樣就即可以上傳,又可以下載了。
sudo pip3 install pyftpdlib
python3 -m pyftpdlib -p 2121 -w
#上傳到ftp
curl ftp://remoteIp:2121/files/ -T file.txt
#從ftp下載
curl -O ftp://remoteIp:2121/files/file.txt
總結(jié)
掌握常用的網(wǎng)絡(luò)命令,還是非常有必要的,畢竟網(wǎng)絡(luò)是如此復(fù)雜,必須要有東西能夠窺探一些內(nèi)部運(yùn)行信息。
原創(chuàng):打碼日記(微信公眾號ID:codelogs),歡迎分享,轉(zhuǎn)載請保留出處。