tcpdump工具
tcpdump命令:
選項字段:
過濾表達式:
實用命令:
TCP三次握手抓包命令:
#客戶端執行tcpdump 抓取數據包
tcpdump -i etho tcp and host 192.168.12.36 and port 80 -W timeout.pcap
netstat命令
netstat -a 命令可以顯?所有?絡連接
-t:TCP -u:UDP
-l :哪些端口正在監聽連接
-p :顯?與每個?絡連接關聯的進程ID和進程名
netstat -anp | grep
端口號 ?于查看指定端口的占?情況
-a:所有socket
-n:直接顯?數字類型的IP和端口
-p:顯?正在使?連接的進程ID和進程名稱
查看TCP連接狀態
netstat -napt | grep 192.168.12.37
查看TCP半連接隊列的大小
netstat -napt | grep SYN_RECV | wc -l
netstat -s
觀察半連接隊列溢出的情況:
netstat -s | grep "SYNS to LISTEN"
隔幾秒執行幾次,如果有上升的趨勢,說明當前存在半連接隊列溢出的現象。
查看TCP全連接隊列溢出情況
netstat -s | grep overflowed
ss命令:主要?于獲取socket統計信息,它可以顯?和 netstat 命令類似的輸出內容。但ss命令的優勢在于它能夠顯?更多更詳細的有關TCP和UDP連接狀態的信息,而且?netstat更快速更高效
查看服務端進程accept隊列的長度
ss -ltn
Wireshark 工具
命令: 把抓取的數據包保存到 ping.pcap 文件
tcpdump -i eth1 icmp and host 183.232.231.174 -W ping. pcap
將跑ping.pcap文件用wireshark打開
iptable防火墻配置規則
#客戶端配置的防火墻規則
iptables -I INPUT -S 192.168.12.36 -j DROP
在服務端配置防火墻,屏蔽客戶端 TCP 報文中標志位是 ACK 的包,也就是當服務端收到客戶端的 TCP ACK 的報文時就會丟棄。
iptables -I INPUT -s 192.168.12.37 -p tcp --tcp-flag ACK ACK -j DROP
客戶端設置了防火墻,屏蔽了服務端的網絡包,為什么 tcpdump 還能抓到服務端的網絡包?
添加 iptables 限制后, tcpdump 是否能抓到包 ,這要看添加的 iptables 限制條件:
- 如果添加的是
INPUT
規則,則可以抓得到包 - 如果添加的是
OUTPUT
規則,則抓不到包
網絡包進入主機后的順序如下:
- 進來的順序 Wire -> NIC -> tcpdump -> netfilter/iptables
- 出去的順序 iptables -> tcpdump -> NIC -> Wire
TCP內核參數以及優化策略
優化三次握手的參數
策略 | TCP內核參數 |
---|---|
調整SYN報文重傳次數 | tcp_syn_retries |
調整SYN半連接隊列的長度 | tcp_max_syn_backlog somaxconn backlog (非內核參數,NGINX配置參數) |
調整SYN+ACK報文的重傳次數 | tcp_synack_retries |
調整accept隊列的長度 | m i n ( b a c k l o g , s o m a x c o n n ) min(backlog, somaxconn) min(backlog,somaxconn) |
繞過三次握手(類似于長連接) | tcp_fastopen |
backlog
參數:也就是listen(int sockfd, int backlog)
的參數,也就是NGINX/Tomcat的參數
優化四次揮手的參數
策略 | TCP內核參數 |
---|---|
調整FIN報文重傳次數 | tcp_orphan_retries |
調整FIN_WAIT2狀態的時間 (只適用 close 函數關閉的連接) | tcp_fin_timeout |
調整孤兒連接的上限個數 (只適用 close 函數關閉的連接) | tcp_max_orphans |
調整TIME_WAIT狀態的上限個數 | tcp_max_tw_buckets |
復用TIME_WAIT狀態的連接 | tcp_tw_reuse (只適用客戶端)tcp_timestamps |
數據傳輸的優化
策略 | TCP內核參數 |
---|---|
擴大窗口大小 | tcp_window_scaling |
調整發送緩沖區范圍 | tcp_wmem |
調整接收緩沖區的范圍 | tcp_rmem |
打開接收緩沖區動態調節 | tcp_moderate_rcvbuf |
調整內存范圍 | tcp_mem |
TCP接收和發送緩沖區和Ring Buffer是一個東西嗎?
數據流從網卡到用戶空間的過程
一次數據流從網卡到用戶空間的過程:
- 數據到達網卡:數據包通過網絡到達網卡,網卡硬件將數據包放入環形緩沖區中。
- 硬件中斷:網卡生成一個硬件中斷通知CPU有新數據包到達。
- 中斷處理程序:CPU執行網卡驅動程序的中斷處理程序,讀取環形緩沖區中的數據包并將其傳遞給內核網絡棧。
- 網絡協議棧處理:內核網絡棧處理數據包,將其存放到對應的TCP接收緩沖區(受
tcp_rmem
參數限制)。 - 傳遞到用戶空間:用戶空間應用程序通過系統調用(如
recv
或read
)從TCP接收緩沖區讀取數據。
參考:
- https://blog.csdn.net/weixin_36338224/article/details/107035214
- 小林coding-圖解網絡