要想追一個包在系統哪里丟失了, 就要了解 一個應用層的包在送出時 要經歷那些 檢查點 和被丟掉的點。
1. 在傳輸層,如果是 tcp 包 會有contrack 的 buf 的限制 可能會導致 packets 的丟失。
? ? ? ?? ? ? => 檢查辦法:查看dmesg日志有報錯:kernel: nf_conntrack: nf_conntrack: table full, dropping packet? , cat /proc/net/nf_conntrack.?
? ? ? ? ? ? ?nf_conntrack 的作用時記錄tcp 的 連接狀況表。
? Linux系統nf_conntrack連接跟蹤機制簡介_nf conntrack-CSDN博客
2. 在傳輸層 如果是tcp 每個系統都有tcp 的最大連接數? (tcp_max_syn_backlog 是 Linux 系統中用于控制 TCP 三次握手期間半連接(SYN_RCVD 狀態)的最大隊列長度的參數。在 TCP 三次握手過程中,服務器在收到客戶端的 SYN 包后,會將對應的半連接放入一個隊列中,等待完成三次握手的過程。當這個隊列滿了之后,新的連接請求將會被丟棄,這可能會導致客戶端連接超時或者請求失敗。為了避免這種情況,可以通過調整 tcp_max_syn_backlog 參數來增加該隊列的長度,從而允許更多的半連接在隊列中等待完成握手)
? ? => 檢查方法:?cat /proc/sys/net/ipv4/tcp_max_syn_backlog??
3. 在傳輸層 如果是tcp 每個系統的session 的time_wait 都不同,這樣導致packets 的先手順序亂了 導致丟包 ( 這個問只在當系統開啟了tcp_tw_recycle時有)??該配置項可用于快速回收處于TIME_WAIT狀態的socket以便重新分配。默認是關閉的,必要時可以開啟該配置。但是開啟該配置項后,有一些需要注意。
? ? =>我們可以查看cat /proc/sys/net/ipv4/tcp_max_tw_buckets 最大條數, 然后如果cat /proc/sys/net/ipv4/tcp_rw_recycle 開啟時,? 我們可以用netsta -at | grep "TIME_WAIT" | wc -n 來統計有多少半連接, 然后 在抓包 如果會的RST 那基本就是這個導致的。
4. 在IP層packets 要經過 iptable 的過濾。
? ? ?
?=>iptables -nvL 查看所有 規則
? ? ? ? ? ? ? ? ? iptables -A INPUT -j LOG –log-prefix=”iptables-”? 然后 dmesg 查看 iptables 的包的匹配情況。? ? ? ??
5.在ip 層還有的系統開啟了反向路由檢查rp_filter, 當 source 不能再 本地從收報的口路由出去時就drop。
? ? =? > 反向路由也還是一種保護機制, 就是我必須能把source 地址從我的端口送出去。
? ? ? ? ???cat /proc/sys/net/ipv4/conf/all/rp_filter
? ? ? ?https://www.cnblogs.com/lipengxiang2009/p/7446388.html
6. 再網卡層nic,由于現在都使用dma 技術 所以 nic 的ring buffer 滿的時候 就會drop packets
? ? ? ?=> cat /proc/net/dev? ?其中的fifo 就是指的時ring buffer full 的drop count
? ? ? ? ? ?ethtool -g eth0?
? ? ? ? ? ?ethtool -G eth0 rx 4096 tx 4096? 更改ring buffer
? ? ? ??
? ? ? ? ifconfig 中的overruns 也是統計ring buffer 滿了drop 的count
7. 在進入每個協議棧前 會有一個緩存隊列,比如ip->tcp , 每個cpu 都有一個 協議棧緩存隊列,當隊列滿了時 就會drop packets。 也就是軟中斷 響應不夠。?
? =>通過查看 /proc/net/softnet_stat 可以確定是否發生了 netdev backlog 隊列溢出
每一行代表每個 CPU 核的狀態統計,從 CPU0 依次往下;每一列代表一個 CPU 核的各項統計:第一列代表中斷處理程序收到的包總數;第二列即代表由于 netdev_max_backlog 隊列溢出而被丟棄的包總數。
查看這個隊列大小?cat /proc/sys/net/core/netdev_max_backlog??
8. MTU 設置 不合理 導致的packets drop
? ?=> ifconfig eth0 去查看 mtu 大小
? ?由于 mtu 設置不和里導致 分片和重組 變得很多導致cpu 和一些buf 滿了, 導致performance 低。?
網絡問題 多用ethtoool,ifconfig 工具, /proce/sys/net 下是一些 設定,proc/net 下多是一些統計信息
reference:https://zhuanlan.zhihu.com/p/692288382