knetstat عبارة عن وحدة بسيطة لنواة Linux تضيف أربعة ملفات جديدة إلى /proc/net
: tcpstat
و tcp6stat
و udpstat
و udp6stat
. محتوى هذه الملفات يعادل تقريبًا مخرجات netstat
مع الخيارات -t4an
و -t6an
و -u4an
و -u6an
على التوالي، أي أنها توفر معلومات حول مقابس TCP وUDP في شكل يمكن قراءته بواسطة الإنسان. الفرق مع مخرجات netstat
المقابلة هو أن لديهم عمودًا إضافيًا يعرض (مجموعة فرعية) خيارات المقبس. كان هذا هو الدافع الأساسي لكتابة وحدة knetstat kernel: حاليًا، في Linux لا توجد طريقة يمكن للمسؤول من خلالها فحص الخيارات المحددة على مأخذ توصيل تم إنشاؤه بواسطة بعض العمليات (بخلاف استخدام strace
أو أداة مكافئة في تلك العملية عند إنشاء مأخذ التوصيل /وقت التكوين)، لأنه لا يتم عرض هذه المعلومات من خلال نظام الملفات /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 الحالي بنجاح مع إصدارات kernel 3.13 و3.18 و4.4 و4.8 و4.9 و4.15. وقد تعمل مع الإصدارات الأخرى أيضًا.
لبناء الوحدة، تأكد من أن لديك الترويسات للنواة التي تعمل حاليًا بالإضافة إلى أدوات البناء الأساسية مثل make وGC. على سبيل المثال على أوبونتو:
# apt-get install linux-headers-$(uname -r) make gcc
ثم تحقق من كود مصدر knetstat وقم بتنفيذ make
. يجب أن يؤدي هذا إلى إنشاء knetstat.ko
والذي يمكن تحميله باستخدام insmod
.
يوضح الجدول التالي المراسلات بين خيارات مأخذ التوصيل التي تم الإبلاغ عنها بواسطة knetstat وطرق الضبط المحددة بواسطة فئة 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
الذي ينتظر حتى تصبح البيانات متاحة للقراءة (أو يحدث خطأ).