Netstat、私のデータグラムはどこにありますか?

Netstatと同様に有用で文書化されていない別のプログラムを見つけることは難しいと思われます。これは、ネットワークデータフロー統計を表示するオプションを意味します。 単一のLinuxホストでネットワークステータスを検査する場合、このユーティリティが使用可能であることを常に確認できます。 そして、ネットワークスタック負荷に対処しているか、実際にはアプリケーションのビジネスロジックの車輪が集中しているOSIの上層階の問題に対処しているを理解したいと思います。




 (5:562)$ netstat -s |wc -l 124 

おっと、私たちは多くの有用な情報を手に入れました。 そのようなtimeout in transitどのような獣であるかを理解するだけtimeout in transit 、明らかに悪いことがあります。


 Icmp: 11475275 ICMP messages received 327527 input ICMP message failed. ICMP input histogram: detination unreachable: 2233840 timeout in transit: 5612259 

次に、マニュアルを見ていきます。


 # man netstat |grep timeout # 

空のセットは、Yandex、Google、さらにはDuckDuckGoを調べる時が来たことを示しています。 検索結果はほぼ同じでしたが、Googleのみが空のセットの111,000のバリアントを発行し、Yandexは326のバリアントに簡潔に制限されていました。


しかし、オープンソースソフトウェアを選択したわけではありません。いつでもソースを確認できます。 この場合、ソースコード Net-toolsパッケージのnertstat.cファイルにあります。


以下は、統計を表示するアクションを定義するint main関数の一部です。


  case '?': usage(E_OPTERR); case 'h': usage(E_USAGE); case 's': flag_sta++; ... if (flag_sta) { if (!afname[0]) safe_strncpy(afname, DFLT_AF, sizeof(afname)); if (!strcmp(afname, "inet")) { #if HAVE_AFINET parsesnmp(flag_raw, flag_tcp, flag_udp, flag_sctp); 

parsesnmp関数parsesnmp statistics.cファイルで定義され、ファイルを解析します。


 /proc/net/netstat /proc/net/snmp /proc/net/sctp/snmp 

明らかに、/ proc / net / snmpを調べてtimeout in transit背後にあるものを確認できることを意味します。


 # cat /proc/net/snmp |grep -iw icmp Icmp: InMsgs InErrors InCsumErrors InDestUnreachs InTimeExcds InParmProbs InSrcQuenchs InRedirects InEchos InEchoReps InTimestamps InTimestampReps InAddrMasks InAddrMaskReps OutMsgs OutErrors OutDestUnreachs OutTimeExcds OutParmProbs OutSrcQuenchs OutRedirects OutEchos OutEchoReps OutTimestamps OutTimestampReps OutAddrMasks OutAddrMaskReps Icmp: 127 2 0 90 0 0 0 0 25 0 8 0 4 0 1763 0 1730 0 0 0 0 0 25 0 8 0 0 InSrcQuenchs InRedirects InEchos InEchoReps InTimestamps InTimestampReps InAddrMasks InAddrMaskReps OutMsgs OutErrors OutDestUnreachs OutTimeExcds OutParmProbs OutSrcQuenchs OutRedirects OutEchos OutEchoReps OutTimestamps OutTimestampReps OutAddrMasks OutAddrMaskReps # cat /proc/net/snmp |grep -iw icmp Icmp: InMsgs InErrors InCsumErrors InDestUnreachs InTimeExcds InParmProbs InSrcQuenchs InRedirects InEchos InEchoReps InTimestamps InTimestampReps InAddrMasks InAddrMaskReps OutMsgs OutErrors OutDestUnreachs OutTimeExcds OutParmProbs OutSrcQuenchs OutRedirects OutEchos OutEchoReps OutTimestamps OutTimestampReps OutAddrMasks OutAddrMaskReps Icmp: 127 2 0 90 0 0 0 0 25 0 8 0 4 0 1763 0 1730 0 0 0 0 0 25 0 8 0 0 

これらの値をnetstatコマンドの出力と比較するとtimeout in transitは変数InTimeExcds対応し、チェーンはさらにこれらすべてのフィールドが定義されているファイル/usr/include/linux/snmp.hつながると結論付けることができます。


 /* icmp mib definitions */ /* * RFC 1213: MIB-II ICMP Group * RFC 2011 (updates 1213): SNMPv2 MIB for IP: ICMP group */ enum { ICMP_MIB_NUM = 0, ICMP_MIB_INMSGS, /* InMsgs */ ICMP_MIB_INERRORS, /* InErrors */ ICMP_MIB_INDESTUNREACHS, /* InDestUnreachs */ ICMP_MIB_INTIMEEXCDS, /* InTimeExcds */ ICMP_MIB_INPARMPROBS, /* InParmProbs */ ICMP_MIB_INSRCQUENCHS, /* InSrcQuenchs */ ICMP_MIB_INREDIRECTS, /* InRedirects */ ICMP_MIB_INECHOS, /* InEchos */ ICMP_MIB_INECHOREPS, /* InEchoReps */ ICMP_MIB_INTIMESTAMPS, /* InTimestamps */ ICMP_MIB_INTIMESTAMPREPS, /* InTimestampReps */ ICMP_MIB_INADDRMASKS, /* InAddrMasks */ ICMP_MIB_INADDRMASKREPS, /* InAddrMaskReps */ ICMP_MIB_OUTMSGS, /* OutMsgs */ ICMP_MIB_OUTERRORS, /* OutErrors */ ICMP_MIB_OUTDESTUNREACHS, /* OutDestUnreachs */ ICMP_MIB_OUTTIMEEXCDS, /* OutTimeExcds */ ICMP_MIB_OUTPARMPROBS, /* OutParmProbs */ ICMP_MIB_OUTSRCQUENCHS, /* OutSrcQuenchs */ ICMP_MIB_OUTREDIRECTS, /* OutRedirects */ ICMP_MIB_OUTECHOS, /* OutEchos */ ICMP_MIB_OUTECHOREPS, /* OutEchoReps */ ICMP_MIB_OUTTIMESTAMPS, /* OutTimestamps */ ICMP_MIB_OUTTIMESTAMPREPS, /* OutTimestampReps */ ICMP_MIB_OUTADDRMASKS, /* OutAddrMasks */ ICMP_MIB_OUTADDRMASKREPS, /* OutAddrMaskReps */ ICMP_MIB_CSUMERRORS, /* InCsumErrors */ __ICMP_MIB_MAX }; 

それは誰のようなものですが、化学者としてのRFC 1213では、周期表を知る必要があります。これは、ネットワークデバイスの監視の基礎の1つです。 RFC 1213の要素の定義を次に示します メモリからの書き込み


 icmpInTimeExcds OBJECT-TYPE SYNTAX Counter ACCESS read-only STATUS mandatory DESCRIPTION "The number of ICMP Time Exceeded messages received." ::= { icmp 4 } 

これまでのところ、バターとしてのこれらすべての定義は本質を開示していないようですが、幸いにもICMP Time ExceededICMPプロトコル定義の一部です。


データグラムを処理するゲートウェイが、TTLフィールドにヌル値が含まれていることを確認した場合、データグラムは破棄される必要があります。 ゲートウェイは、時間超過メッセージでデータグラムの送信者に通知できます。

それで、探していたものが見つかりました。 この不可解なフィールドがあったnetstatコマンド出力は、 TTLがゼロのドロップされたICMPパケットの数を意味します 。 IRL [1]これは、パケットがTTL [2]全体をプロファイルしたリングがネットワークにあることを意味します。


 timeout in transit: 5612259 

Linux MIB


Linuxカーネルのジャングルに飛び込む間、SNMPサブシステムを見つけて驚いた。 いいえ、SNMPエージェントではなく、Alan Cox、つまり小さなSNMPスタックを節約します。 これは、ファイル/usr/src/linux/include/net/snmp.hコメントに記述されています。


 /* * SNMP MIB entries for the IP subsystem. * Alan Cox <gw4pts@gw4pts.ampr.org> * * We don't chose to implement SNMP in the kernel (this would * be silly as SNMP is a pain in the backside in places). We do * however need to collect the MIB statistics and export them * out of /proc (eventually) */ 

SNMPはSimple Network Management Protocolの略ですが、ひげを生やしたジョークが言うように、Sという文字は略語で嘘をついたことはありません。 コンピューターネットワークとネットワークノードのすべての監視ソフトウェアが回転しているため 、このブレイングラインダーについて個別に作成する予定です。 それまでの間、必要な最小値は、 netstat統計変数のnetstat明確にすることです。




最も単純なケースでは、 MRTGまたはMuninがクライアントとして機能できるクライアントサーバーアーキテクチャがあり、サーバー部分はネットワークノード上のSNMPエージェントです。 ほぼすべての最新のネットワークデバイスには、ホームWiFiルーターを含むSNMPエージェントが搭載されています。 Windowsには独自のSNMP Service 、LinuxおよびオープンUnixシステムはNet-SNMP使用しNet-SNMP


SNMPクライアントとサーバーはメッセージを交換します。クライアントは要求を送信し、サーバーは応答を返します。 通常、この交換は次のようになります。


K.-チェブラーシカ、電化製品!
S.-40
K.-40とは何ですか?
S.-アプライアンスはどうですか?

クライアントは、Great Dictionaryから変数の値を要求します。 サーバーは太陽を見て、変数を見つけ、レジストリを調べて値を返します。 Great Dictionaryは、図のMIB [3]データベースです。


以下は、システム変数、 uptimeポーリングがmanページでどのように見えるかを示しています


 snmpwalk -Os -c public -v 1 zeus system sysDescr.0 = STRING: "SunOS zeus.net.cmu.edu 4.1.3_U1 1 sun4m" sysObjectID.0 = OID: enterprises.hp.nm.hpsystem.10.1.1 sysUpTime.0 = Timeticks: (155274552) 17 days, 23:19:05 sysContact.0 = STRING: "" sysName.0 = STRING: "zeus.net.cmu.edu" sysLocation.0 = STRING: "" sysServices.0 = INTEGER: 72 

数十のRFCとそれらの可能な実装の深areが、大辞書、レジストリ、SNMPプロトコル自体のe曲表現の背後に隠されていることを理解すべきです。 snmp.hファイルに戻ると、氷山の表面部分のみが表示されています。


 # grep RFC /usr/include/linux/snmp.h * RFC 1213: MIB-II * RFC 2011 (updates 1213): SNMPv2-MIB-IP * RFC 2863: Interfaces Group MIB * RFC 2465: IPv6 MIB: General Group * RFC 1213: MIB-II ICMP Group * RFC 2011 (updates 1213): SNMPv2 MIB for IP: ICMP group * RFC 2466: ICMPv6-MIB * RFC 1213: MIB-II TCP group * RFC 2012 (updates 1213): SNMPv2-MIB-TCP * RFC 1213: MIB-II UDP group * RFC 2013 (updates 1213): SNMPv2-MIB-UDP LINUX_MIB_TCPMINTTLDROP, /* RFC 5082 */ 

そして、それがすべてであれば、 netstat統計のデコードは次のようになります。


   netstat -->     /proc: * /proc/net/snmp * /proc/net/netstat * /proc/net/sctp/snmp -->  RFC --> . 

ただし、そのような多段階の復号化でも十分ではありません。そのsnmp.hは、RFCおよびGreat Dictionary-MIB Databaseで変数が定義されていない神秘的なLinux MIBsnmp.h重要な部分をsnmp.hからsnmp.h


 /* linux mib definitions */ enum { LINUX_MIB_NUM = 0, LINUX_MIB_SYNCOOKIESSENT, /* SyncookiesSent */ LINUX_MIB_SYNCOOKIESRECV, /* SyncookiesRecv */ LINUX_MIB_SYNCOOKIESFAILED, /* SyncookiesFailed */ LINUX_MIB_EMBRYONICRSTS, /* EmbryonicRsts */ LINUX_MIB_PRUNECALLED, /* PruneCalled */ LINUX_MIB_RCVPRUNED, /* RcvPruned */ LINUX_MIB_OFOPRUNED, /* OfoPruned */ ... LINUX_MIB_TCPMTUPSUCCESS, /* TCPMTUPSuccess */ __LINUX_MIB_MAX }; 

ダイビングの次の段階に進む準備ができました。次の記事では、バッファーメモリエラーの背後に隠れているものと、tcpでキューブレーカーが崩壊する方法を見つけようとします。




  1. 実生活で、実生活での英語から。
  2. 英語からライブまでのパッケージの有効期間
  3. 管理情報ベース-ノードオブジェクトの制御情報の構造化されたセット。 詳細はこちら


Source: https://habr.com/ru/post/J312710/


All Articles