Tại sao kernel lại bỏ gói?


50

Tôi đã ngắt tcpdumpvớ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?


Trong trường hợp của tôi, tôi đã sử dụng tùy chọn -s0, việc thay đổi nó thành -s1600 (ngay phía trên MTU) đã giải quyết nó cho tôi.
LatinSuD

Câu trả lời:


50

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 tcpdumpbắ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.


1
Ngoài ra, tôi cố tình thay đổi kibi- / mebi- thành kilo- / mega- và bỏ qua một từ về libpcap để không gây nhầm lẫn cho mọi người.
Dmitry Vasilyanov

4
Cũng lưu ý rằng hỗ trợ cho "tùy chọn dài" trong tcpdump là tương đối mới; trong các phiên bản cũ hơn (ngoại trừ các phiên bản cũ hơn, không hỗ trợ cài đặt kích thước bộ đệm) bạn có thể làm tcpdump -B 4096.

Một lưu ý khác, cần có thời gian để thiết lập bộ đệm lớn. Nếu bạn đặt bộ đệm thành một thứ gì đó điên rồ, bạn có thể bỏ lỡ các gói (tcpdump báo cáo chúng là "các gói bị bỏ bởi kernel") trong thời gian khởi tạo đó.
dgreene

27

Một điều nữa cần xem xét / thử là tcpdumpcó 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 -ncờ (không tra cứu). ví dụ:

tcpdump -n port 80

2
Đây là một vị cứu tinh. Không nhận ra tcpdump đã giải quyết ngược lại khi đổ vào một tệp !! Sử dụng -nn -B 4096cho phép tôi có được0 packets dropped by kernel
Blanka

11

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 tcpdumpkhô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 tcpdumpcác -Btùy chọn với kích thước KiB.


2

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ừ tcpdumpnơ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 netnslớ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à tcpdumphiển thị cho tôi tất cả các gói tôi mong đợi để xem.


1

Tôi thấy hữu ích khi sử dụng tcpdump -ctù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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.