Tôi đã ngắt tcpdump
với Ctrl+ Cvà có tổng số tóm tắt này:
579204 packets captured
579346 packets received by filter
142 packets dropped by kernel
"Các gói bị bỏ bởi kernel" là gì? Tại sao điều đó xảy ra?
Tôi đã ngắt tcpdump
với Ctrl+ Cvà có tổng số tóm tắt này:
579204 packets captured
579346 packets received by filter
142 packets dropped by kernel
"Các gói bị bỏ bởi kernel" là gì? Tại sao điều đó xảy ra?
Câu trả lời:
Từ hướng dẫn của tcpdump:
các gói `` bị rớt bởi kernel '' (đây là số lượng gói bị bỏ, do thiếu không gian bộ đệm, bởi cơ chế bắt gói trong HĐH mà tcpdump đang chạy, nếu HĐH báo cáo thông tin đó cho các ứng dụng; nếu không, nó sẽ được báo cáo là 0).
Một chút giải thích:
Việc tcpdump
bắt các gói thô đi qua giao diện mạng. Các gói phải được phân tích cú pháp và lọc theo các quy tắc do bạn chỉ định trong dòng lệnh và phải mất một thời gian, do đó các gói đến phải được đệm (xếp hàng) để xử lý. Đôi khi có quá nhiều gói, chúng được lưu vào bộ đệm, nhưng chúng được lưu nhanh hơn xử lý, vì vậy cuối cùng bộ đệm hết dung lượng, do đó kernel bỏ tất cả các gói tiếp theo cho đến khi có không gian trống trong bộ đệm.
Bạn có thể tăng kích thước bộ đệm với tùy chọn -B
( --buffer-size
) như thế này:
tcpdump -B 4096 ....
Lưu ý rằng kích thước được chỉ định bằng kilobyte, do đó, dòng trên đặt kích thước bộ đệm thành 4MB.
tcpdump -B 4096
.
Một điều nữa cần xem xét / thử là tcpdump
có thể dành nhiều thời gian để thực hiện các truy vấn DNS để phân giải IP thành tên miền. Nếu bạn không cần những thứ đó, hãy thử ném -n
cờ (không tra cứu). ví dụ:
tcpdump -n port 80
-nn -B 4096
cho phép tôi có được0 packets dropped by kernel
Theo man tcpdump
:
các gói bị bỏ bởi kernel (đây là số lượng gói bị bỏ, do thiếu không gian bộ đệm, bởi cơ chế bắt gói trong HĐH mà tcpdump đang chạy, nếu HĐH báo cáo thông tin đó cho các ứng dụng; nếu không, nó sẽ sẽ được báo cáo là 0).
Hạt nhân đặt các gói bị bắt trong một bộ đệm kích thước cố định . Nếu tcpdump
không đủ bộ đệm đó đủ nhanh, kernel sẽ bắt đầu ghi đè các gói cũ trong bộ đệm và tăng tương ứng bộ đếm bị rơi . Giá trị của bộ đếm đó là những gì bạn thấy là "bị bỏ bởi kernel".
Bằng cách này, bạn có thể thay đổi kích thước bộ đệm chụp : Vượt qua tcpdump
các -B
tùy chọn với kích thước KiB.
Bên cạnh những gì trang man nói, dường như có thêm một số lý do tại sao các gói có thể bị bỏ bởi kernel. Tôi đã gặp phải tình trạng rớt gói 100% từ tcpdump
nơi lưu lượng duy nhất trên mạng là một gói PRBS 512B mỗi giây. Rõ ràng giải thích không gian bộ đệm không có ý nghĩa ở đây - Tôi nghĩ rằng hạt nhân có thể xử lý 0,5kiB / s.
Một cái gì đó đi kèm với bản phân phối của tôi (Ubuntu 14.04) có thể đã thực hiện một số loại lọc thông minh ở lớp liên kết không giống như các gói thử nghiệm của tôi. Cách giải quyết của tôi là tạo ra một không gian tên mạng mới như sau:
sudo -i
ip netns add debug
ip link set dev eth0 netns debug
ip netns exec debug bash
ifconfig eth0 1.2.3.4 up
Trong netns
lớp vỏ bên trong , bất kỳ quy trình HĐH nào gây ra sự cố trước đây đều nằm ngoài hình ảnh và tcpdump
hiển thị cho tôi tất cả các gói tôi mong đợi để xem.
Tôi thấy hữu ích khi sử dụng tcpdump -c
tùy chọn. Bằng cách này, bạn có thể đặt số lượng gói và sau đó dừng và bạn không thể điền vào bộ đệm.
Ví dụ, cái này sẽ nắm bắt các yêu cầu tcp trên localhost.
tcpdump -ni lo tcp -c 20