前言
上次發了linux命令總結之後,很多朋友說想看網路命令歸納總結,今天他來了,別廢話,給我收藏起來。
推薦一下自己的linuxC/C++交流群:973961276!整理了一些個人覺得比較好的學習書籍、視訊資料以及大廠面經視訊共享在群檔案裡面,有需要的小夥伴可以自行新增哦!~
網路連通性檢測
當應用出現網路異常時,首先需要確認的就是網路的連通性是否正常,下面一組命令可快速檢測網路的連通性,如下:
檢測DNS
dig www.baidu.combash
nslookup www.baidu.combash
host www.baidu.com
檢測主機是否可達
ping www.baidu.com
檢測port是否可達
#檢查tcp埠
telnet www.baidu.com 80
#檢查udp埠
nc -uvz ip port
檢測SSL
SSL認證也經常導致程式無法連線,主要出現在SSL握手過程中。
openssl s_client -connect www.baidu.com:443 -prexit
一鍵檢測
多數情況下,可以使用curl一鍵檢測所有過程,如果有問題,再使用上面的命令逐個排查。
curl -v http://www.baidu.com:80/
時間消耗分佈
使用curl可檢測出http協議介面各階段花費的時間。
$ curl -o /dev/null -s -w " time_namelookup:%{time_namelookup}s\n time_connect:%{time_connect}s\n time_starttransfer:%{time_starttransfer}s\n time_total:%{time_total}s\n 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:開始到收到服務端發來首位元組資料的時間
time_total:開始到服務端資料接收完成的時間
零基礎和大三大四的朋友看這裡>>c/c++ 企業級專案實戰
已經工作了想繼續自我提升跳槽漲薪的工程師看這裡>>c/c++ linux伺服器高階
檢查socket連線
由於網路通訊都需要靠socket,所以檢查一下socket連線以及它的分佈情況也是非常有必要的。
檢查埠是否監聽
服務端程式一定會監聽至少一個埠,檢查監聽socket是否存在,也是判斷服務程式是否還存在的一種方法。
netstat -nltp|grep 8080
lsof -nP -i -sTCP:LISTEN|grep 8080
檢視socket狀態分佈
$ ss -s
$ netstat -nat | awk '/tcp/{print $6}'|sort|uniq -c
9 CLOSE_WAIT
102 ESTABLISHED
55 LISTEN
70 TIME_WAIT
需格外關注TIME_WAIT與CLOSE_WAIT這兩種狀態的數量,如果TIME_WAIT過多,可考慮優化核心網路引數或使用連線池,如果CLOSE_WAIT過多,就需要檢查程式程式碼中哪裡出現了連線洩露,導致未關閉連線了。
誰連我最多
netstat -ant | awk '/tcp/{rl=split($5,r,":");printf "%16s\t%s\n",$4,r[rl-1]}' | sort | uniq -c | sort -nrk1 | head -n10
我連誰最多
netstat -ant | awk '/tcp/{ll=split($4,l,":");printf "%11s\t%s\n",l[ll-1],$5}' | sort | uniq -c | sort -nrk1 | head -n10
網路使用率檢測
檢視各連線網速
iftop -B -nNP
檢視各程式網速
nethogs
檢視網路卡網速
sar -n DEV 1
ifstat
檢視網路卡是否丟包
# ifconfig命令,觀察overrun/error/drop這幾項
ifconfig
# 同樣,觀察類似overflow、error、drop這些項
ethtool -S eth0
TCP層丟包與重傳
有時,網路卡層未出現丟包,但網路中間鏈路有可能出現丟包,這會導致tcp層重傳,另外,如果tcp層的核心引數設定不合理,也可能導致丟包,比如backlog設定過小,伺服器端網路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
網路抓包
純文字抓包
# ngrep比較適合抓包類似http這種的純文字協議
sudo ngrep -W byline port 3306
# 在無法使用抓包命令的情況下,也可使用nc、socat之類的網路工具,做一個埠轉發,同時將轉發流量列印出來
# 另外在抓包https時,也可以使用socat將https流量代理為http流量,再進行抓包
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包,用於網路經常出現connection reset異常的情況
sudo tcpdump -ni any -s0 tcp and 'tcp[13] & 4 != 0 ' -vvv
# 抓fin包,用於網路經常斷連的情況
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找到的這個專案github.com/rmedvedev/grpcdump
sudo grpcdump -i eth0 -p 9999 -proto-path ~/protos -proto-files order/v1/log_service.proto
傳輸檔案
使用scp
#上傳檔案到遠端機器
scp test.txt root@remoteIp:/home/
#從遠端機器下載檔案
scp root@remoteIp:/home/test.txt .
使用ncat
ncat其實就是常說的nc,但由於netcat也叫nc且用法稍有不同(ubuntu上的nc就是netcat),避免混淆,這裡直接使用ncat
# 接收檔案端
ncat -l 9999 > test.txt
# 傳送檔案端
ncat remoteIp 9999 < test.txt
使用python http server
python的http server經常用於分享本機檔案給其它人,非常方便。
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
總結
掌握常用的網路命令,還是非常有必要的,畢竟網路是如此複雜,必須要有東西能夠窺探一些內部執行資訊。
本作品採用《CC 協議》,轉載必須註明作者和本文連結