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
ที่รอจนกว่าข้อมูลจะพร้อมสำหรับการอ่าน (หรือมีข้อผิดพลาดเกิดขึ้น)