knetstat เป็นโมดูลเคอร์เนล Linux ธรรมดาที่เพิ่มไฟล์ใหม่สี่ไฟล์ให้กับ /proc/net : tcpstat , tcp6stat , udpstat และ udp6stat เนื้อหาของไฟล์เหล่านี้เทียบเท่ากับเอาต์พุตของ netstat โดยมีตัวเลือก -t4an , -t6an , -u4an และ -u6an ตามลำดับ กล่าวคือ ให้ข้อมูลเกี่ยวกับซ็อกเก็ต TCP และ UDP ในรูปแบบที่มนุษย์สามารถอ่านได้ ความแตกต่างกับเอาต์พุต netstat ที่สอดคล้องกันคือมีคอลัมน์เพิ่มเติมที่แสดง (ชุดย่อยของ) ตัวเลือกซ็อกเก็ต นี่เป็นแรงจูงใจหลักในการเขียนโมดูลเคอร์เนล knetstat: ในปัจจุบัน บน Linux ไม่มีทางที่ผู้ดูแลระบบจะตรวจสอบตัวเลือกที่ตั้งค่าบนซ็อกเก็ตที่สร้างขึ้นโดยกระบวนการบางอย่าง (นอกเหนือจากการใช้ strace หรือเครื่องมือที่เทียบเท่ากับกระบวนการนั้นในการสร้างซ็อกเก็ต /configuration time) เนื่องจากข้อมูลนี้ไม่ได้ถูกเปิดเผยผ่านระบบไฟล์ /proc
knetstat นำโครงสร้างพื้นฐานที่ใช้โดยเคอร์เนลมาใช้ซ้ำภายในเพื่อสร้างเนื้อหาของไฟล์ /proc/net/tcp , /proc/net/tcp6 , /proc/net/udp และ /proc/net/udp6 ซึ่งหมายความว่ามีการโต้ตอบแบบหนึ่งต่อหนึ่งระหว่างรายการในไฟล์เหล่านี้และรายการในไฟล์ที่สร้างโดย knetstat เฉพาะการจัดรูปแบบและเนื้อหาข้อมูลเท่านั้นที่แตกต่างกันระหว่างทั้งสอง
นี่คือตัวอย่างผลลัพธ์บางส่วน:
$ cat /proc/net/tcpstat
Recv-Q Send-Q Local Address Foreign Address Stat Diag Options
0 0 127.0.0.1:6010 0.0.0.0:* LSTN SO_REUSEADDR=1,SO_KEEPALIVE=0,TCP_NODELAY=0
0 0 0.0.0.0:22 0.0.0.0:* LSTN SO_REUSEADDR=1,SO_KEEPALIVE=0,TCP_NODELAY=0
0 0 192.168.1.18:22 192.168.1.6:49537 ESTB SO_REUSEADDR=1,SO_KEEPALIVE=1,TCP_NODELAY=1
0 0 127.0.0.1:6010 127.0.0.1:45462 ESTB SO_REUSEADDR=1,SO_KEEPALIVE=0,TCP_NODELAY=1
0 0 127.0.0.1:45462 127.0.0.1:6010 ESTB SO_REUSEADDR=0,SO_KEEPALIVE=1,TCP_NODELAY=1
คอลัมน์ "Diag" สามารถแสดงตัวบ่งชี้การวินิจฉัยต่อไปนี้:
| ตัวบ่งชี้ | ความหมาย |
|---|---|
>| | หน้าต่างผู้ส่ง (เช่น หน้าต่างที่โฆษณาโดยปลายทางระยะไกล) มีค่าเป็น 0 ไม่สามารถส่งข้อมูลไปยังเพียร์ได้ |
|< | หน้าต่างตัวรับ (เช่น หน้าต่างที่โฆษณาโดยปลายทางในเครื่อง) คือ 0 ไม่สามารถรับข้อมูลจากเพียร์ได้ |
># | มีแพ็กเก็ตที่ไม่ได้รับการตอบรับและได้รับ ACK ล่าสุดมากกว่าหนึ่งวินาทีที่แล้ว นี่อาจเป็นข้อบ่งชี้ว่ามีปัญหาเครือข่ายหรือเพียร์ขัดข้อง |
SO_REUSEADDR , SO_REUSEPORT , SO_KEEPALIVE (TCP), TCP_KEEPIDLE (TCP), TCP_KEEPCNT (TCP), TCP_KEEPINTVL (TCP), SO_RCVBUF , SO_SNDBUF , SO_RCVTIMEO , SO_SNDTIMEO , SO_LINGER (TCP), TCP_NODELAY , TCP_FASTOPEN , TCP_DEFER_ACCEPT , SO_BROADCAST (UDP) TCP_KEEPIDLE, TCP_KEEPCNT และ TCP_KEEPINTVL สอดคล้องกับค่า tcp_keepalive_time, tcp_keepalive_probes และ tcp_keepalive_intvl ที่อธิบายไว้ใน tcp(7) และ sysctls ที่เกี่ยวข้อง หากค่าเหล่านั้นถูกแทนที่ที่ระดับซ็อกเก็ต (โดยการตั้งค่าเป็นค่าอื่นที่ไม่ใช่ศูนย์) ค่าเหล่านั้นจะถูกพิมพ์โดย knetstat มิฉะนั้นเคอร์เนลจะใช้ sysctls และโมดูลจะเพิกเฉยต่อค่าเหล่านั้นในขณะที่พิมพ์เอาต์พุต
รหัส knetstat ปัจจุบันได้รับการทดสอบเรียบร้อยแล้วกับเคอร์เนลเวอร์ชัน 3.13, 3.18, 4.4, 4.8, 4.9 และ 4.15 อาจทำงานร่วมกับเวอร์ชันอื่นได้เช่นกัน
ในการสร้างโมดูล ตรวจสอบให้แน่ใจว่าคุณมีส่วนหัวสำหรับเคอร์เนลที่ทำงานอยู่ในปัจจุบัน รวมถึงเครื่องมือสร้างพื้นฐาน เช่น make และ GCC เช่นบน Ubuntu:
# apt-get install linux-headers-$(uname -r) make gcc
จากนั้นตรวจสอบซอร์สโค้ด knetstat และดำเนินการ make สิ่งนี้ควรสร้าง knetstat.ko ซึ่งสามารถโหลดได้โดยใช้ insmod
ตารางต่อไปนี้แสดงความสอดคล้องระหว่างตัวเลือกซ็อกเก็ตที่รายงานโดย knetstat และวิธี setter ที่กำหนดโดยคลาส java.net.Socket ข้อมูลนี้สามารถใช้เพื่ออนุมานการกำหนดค่าที่กระบวนการ Java ใช้กับอินสแตนซ์ java.net.Socket โดยอิงตามเอาต์พุตของ knetstat การแมปนั้นตรงไปตรงมา ยกเว้น setSoTimeout
| วิธีการจาวา | ตัวเลือกซ็อกเก็ตรายงานโดย knetstat |
|---|---|
setKeepAlive | SO_KEEPALIVE |
setReceiveBufferSize | SO_RCVBUF |
setReuseAddress | SO_REUSEADDR |
setSendBufferSize | SO_SNDBUF |
setSoLinger | SO_LINGER |
setSoTimeout | ไม่มี [*] |
setTcpNoDelay | TCP_NODELAY |
[*] ตรงกันข้ามกับสิ่งที่ Javadoc แนะนำ เมธอด setSoTimeout ไม่ได้ตั้งค่าตัวเลือกซ็อกเก็ตใด ๆ บน Linux ตามค่าเริ่มต้น อินสแตนซ์ java.net.Socket จะได้รับการสนับสนุนโดย java.net.SocksSocketImpl (แม้ว่าจะไม่ได้กำหนดค่าพร็อกซี SOCKS ก็ตาม) คลาสนี้ขยาย java.net.AbstractPlainSocketImpl ซึ่งจัดเก็บการหมดเวลาไว้ภายในเพื่อใช้ในภายหลังโดยวิธีการอ่านใน java.net.SocketInputStream จากนั้นจะส่งผ่านระยะหมดเวลาไปยังการเรียกใช้การเรียกระบบ poll ที่รอจนกว่าข้อมูลจะพร้อมสำหรับการอ่าน (หรือมีข้อผิดพลาดเกิดขึ้น)