เหตุใดเคอร์เนลจึงปล่อยแพ็กเก็ต


49

ฉันถูกขัดจังหวะtcpdumpด้วยCtrl+ Cและได้รับบทสรุปทั้งหมดนี้:

579204 packets captured
579346 packets received by filter
142 packets dropped by kernel

"แพ็คเก็ตที่ถูกลดลงโดยเคอร์เนล" คืออะไร? ทำไมถึงเกิดขึ้น?


ในกรณีของฉันฉันใช้ตัวเลือก -s0 การเปลี่ยนเป็น -s1600 (ขวาเหนือ MTU) แก้ไขให้ฉัน
LatinSuD

คำตอบ:


48

จากคู่มือของ tcpdump:

แพ็คเก็ต `` ดร็อปโดยเคอร์เนล '' (นี่คือจำนวนแพ็กเก็ตที่ถูกดร็อปเนื่องจากการขาดพื้นที่บัฟเฟอร์โดยกลไกการดักจับแพ็กเก็ตในระบบปฏิบัติการที่ tcpdump ทำงานอยู่หากระบบปฏิบัติการรายงานข้อมูลไปยังแอปพลิเคชัน มิฉะนั้นจะถูกรายงานเป็น 0)

คำอธิบายเล็กน้อย:

tcpdumpจับแพ็กเก็ตดิบผ่านอินเตอร์เฟซเครือข่าย แพ็กเก็ตต้องถูกวิเคราะห์คำและกรองตามกฎที่ระบุโดยคุณในบรรทัดคำสั่งและใช้เวลาพอสมควรดังนั้นแพ็กเก็ตที่เข้ามาจะต้องถูกบัฟเฟอร์ (เข้าคิว) เพื่อการประมวลผล บางครั้งมีแพ็คเก็ตมากเกินไปพวกเขาจะถูกบันทึกลงในบัฟเฟอร์ แต่พวกเขาจะถูกบันทึกไว้เร็วกว่าการประมวลผลดังนั้นในที่สุดบัฟเฟอร์หมดพื้นที่ดังนั้นเคอร์เนลจะลดลงแพ็คเก็ตต่อไปทั้งหมดจนกว่าจะมีพื้นที่ว่างในบัฟเฟอร์

คุณสามารถเพิ่มขนาดบัฟเฟอร์ด้วยตัวเลือก-B( --buffer-size) ดังนี้:

tcpdump -B 4096 ....

โปรดทราบว่าขนาดที่ระบุเป็นกิโลไบต์ดังนั้นบรรทัดด้านบนจะตั้งค่าขนาดบัฟเฟอร์เป็น 4MB


1
นอกจากนี้ฉันตั้งใจเปลี่ยน kibi- / mebi- เป็น kilo- / mega- และละเว้นคำเกี่ยวกับ libpcap เพื่อไม่ให้ผู้อื่นสับสน
Dmitry Vasilyanov

4
โปรดทราบว่าการรองรับ "ตัวเลือกแบบยาว" ใน tcpdump นั้นค่อนข้างใหม่ ในรุ่นเก่า (ยกเว้นรุ่นเก่ามากที่ไม่สนับสนุนการตั้งค่าขนาดของบัฟเฟอร์) tcpdump -B 4096ที่คุณสามารถทำได้

อีกข้อสังเกตมันต้องใช้เวลาในการติดตั้งบัฟเฟอร์ขนาดใหญ่ หากคุณตั้งค่าบัฟเฟอร์เป็นบางสิ่งที่บ้าคุณอาจพลาดแพ็กเก็ต (tcpdump รายงานว่าเป็น "แพ็กเก็ตที่ทิ้งโดยเคอร์เนล") ในช่วงเวลาเริ่มต้น
dgreene

26

อีกสิ่งหนึ่งที่ควรพิจารณา / ลองใช้คือtcpdumpอาจใช้เวลาทำแบบสอบถาม DNS เพื่อแก้ไข IP เป็นชื่อโดเมน หากคุณไม่ต้องการสิ่งเหล่านั้นลองโยน-nธง (ไม่มีการค้นหา) เช่น:

tcpdump -n port 80

1
นี่คือผู้กอบกู้ ไม่ทราบว่า tcpdump มีความละเอียดย้อนกลับเมื่อทิ้งลงในไฟล์ !! ใช้-nn -B 4096อนุญาตให้ฉันได้รับ0 packets dropped by kernel
Blanka

11

ตามman tcpdump:

แพ็กเก็ตที่ถูกปล่อยโดยเคอร์เนล (นี่คือจำนวนของแพ็กเก็ตที่ถูกดร็อปเนื่องจากพื้นที่บัฟเฟอร์ไม่เพียงพอโดยกลไกการดักจับแพ็กเก็ตในระบบปฏิบัติการที่ tcpdump ทำงานอยู่หาก OS รายงานข้อมูลนั้นไปยังแอปพลิเคชันถ้าไม่ใช่ จะถูกรายงานเป็น 0)

เคอร์เนลทำให้จับแพ็กเก็ตในขนาดคงที่บัฟเฟอร์การจับภาพ หากtcpdumpไม่ล้างบัฟเฟอร์นั้นเร็วพอเคอร์เนลจะเริ่มเขียนทับแพ็กเก็ตเก่าในบัฟเฟอร์และเพิ่มตัวนับที่ลดลงตามลำดับ ค่าของตัวนับนั้นคือสิ่งที่คุณเห็นว่า "ตกหล่นโดยเคอร์เนล"

โดยวิธีการที่คุณสามารถปรับขนาดบัฟเฟอร์จับภาพ : ผ่านตัวเลือกที่มีขนาดโอเคtcpdump-B


2

นอกจากสิ่งที่ man page พูดแล้วมีเหตุผลเพิ่มเติมว่าทำไมแพ็กเก็ตอาจถูกดร็อปโดยเคอร์เนล ฉันพบแพ็กเก็ตลดลง 100% จากtcpdumpจุดที่ปริมาณการใช้งานเฉพาะบนเครือข่ายคือหนึ่งแพ็คเก็ต PRB 512B ต่อวินาที เห็นได้ชัดว่าคำอธิบายพื้นที่บัฟเฟอร์ไม่สมเหตุสมผลที่นี่ - ฉันคิดว่าเคอร์เนลสามารถจัดการ 0.5kiB / s

บางสิ่งที่มาพร้อมกับ distro ของฉัน (Ubuntu 14.04) อาจทำการกรองอัจฉริยะบางอย่างที่เลเยอร์ลิงก์ที่ไม่ชอบแพ็คเก็ตทดสอบของฉัน วิธีแก้ปัญหาของฉันคือการสร้างเนมสเปซเครือข่ายใหม่ดังนี้

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

ในnetnsเปลือกด้านในสิ่งที่กระบวนการระบบปฏิบัติการที่ก่อให้เกิดปัญหาก่อนที่จะออกจากภาพและtcpdumpแสดงให้ฉันเห็นทุกแพ็กเก็ตที่ฉันคาดหวัง


1

ฉันพบว่ามีประโยชน์โดยใช้tcpdump -cตัวเลือก วิธีนี้คุณสามารถตั้งค่าจำนวนแพ็คเก็ตแล้วหยุดและคุณไม่สามารถกรอกบัฟเฟอร์ได้

ตัวอย่างเช่นอันนี้จะจับคำขอ tcp บน localhost

tcpdump -ni lo tcp -c 20
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.