Linux のネットワークワーキングと関連ツール

IT

CPUやメモリと同様にネットワーク機能もスマホやパソコンに搭載されており、ほぼ毎日利用しているかと思います。

そこでアンドロイドなどを含むLinuxでネットワーキングがどのように機能しているか簡単にご紹介していきます。

ネットワーキングの概要

アプリケーションからネットワーク インターフェース カード(NIC)までどのようにデータが移動しているか、こちらをご覧ください。

Source: BPF Performance Tools

主なコンポーネント:

Socket: データの送信/受信のエンドポイント。TCPで利用される送信/受信のバッファも含まれます。

TCP(Transmission Control Protocol): トランスポート層のプロトコル(お約束事)で、コネクション型の転送サービスを提供します。。エラーチェック、フロー制御、整列機能を含みます。

UDP(User Datagram Protocol): 一方的にメッセージを送る、メッセージ指向型のプロトコル。

IP(Internet Protocol): ホスト間を通信するときに使うプロトコルのひとつ。IPv4やIPv6があります。

ICMP(Internet Control Message Protocol): 通信状態の確認をするために使われるプロトコルです。「ping」コマンドで使われているプロトコルです。

Queueing discipline (qdisc): パケットを一時的に格納し、順番を並べ替えたり、遅延させたり、破棄したりします。

Device Driver: デバイスを動かすためのソフトです。ドライバーキュー(NIC RX ring/TX ring)も含みます。

NIC( Network Interface Card): ネットワークポートを含む物理的なデバイスです。

TCP/IPだけで、1冊の本になるぐらなので、ここでは説明を割愛しますが、これからネットワーキングに関連するLinuxツールを紹介していきます。

基本ツール

基本的なツールを使ってネットワーキングに関する調査をはじめてみましょう。

ss

sshは、開いている全てのソケットを表示するコマンドです。

# ss
Netid State      Recv-Q Send-Q                                                           Local Address:Port                                  Peer Address:Port    Process
udp   ESTAB      0      0                                                         192.168.1.102%wlp2s0:bootpc                                 192.168.1.1:bootps          
tcp   ESTAB      0      0                                                                192.168.1.102:50142                                54.71.139.232:https           
tcp   ESTAB      0      0                                                                192.168.1.102:60928                               35.186.227.140:https           
tcp   ESTAB      0      0                                                                192.168.1.102:56256                                34.213.247.36:https           
tcp   ESTAB      0      0                                                                10.64.242.133:60740                                   10.0.14.87:ircu-3          
tcp   ESTAB      0      0                                                                192.168.1.102:41230                                 104.244.42.1:https 

このコマンドによって、いくつのクライアント接続が同時にされているか?という情報がわかります。

例えば、-tでTCP socket、-iでinternal info、-eでextended socket info、-pでprocess info、-mでmemory infoを表示させることもできます。

# ss -tiepm
State             Recv-Q        Send-Q                                         Local Address:Port                                             Peer Address:Port           Process                                                                                                                                                                   
ESTAB             0             0                                              192.168.1.102:50142                                           54.71.139.232:https           users:(("GeckoMain",pid=337851,fd=148)) timer:(keepalive,7min21sec,0) uid:1000 ino:1995055 sk:1003 cgroup:/user.slice/user-1000.slice/user@1000.service/app.slice/app-gnome-firefox-337851.scope <->
	 skmem:(r0,rb131072,t0,tb87040,f0,w0,o0,bl0,d0) ts sack cubic wscale:8,7 rto:394 rtt:193.102/33.748 ato:40 mss:1402 pmtu:1500 rcvmss:536 advmss:1448 cwnd:10 bytes_sent:8379 bytes_acked:8380 bytes_received:6951 segs_out:343 segs_in:173 data_segs_out:171 data_segs_in:170 send 581kbps lastsnd:8416 lastrcv:8204 lastack:8204 pacing_rate 1.16Mbps delivery_rate 109kbps delivered:172 app_limited busy:31617ms rcv_space:14480 rcv_ssthresh:64088 minrtt:134.973
ESTAB             0             0                                              192.168.1.102:37082                                          35.163.112.241:https           users:(("geoclue",pid=1979,fd=10)) uid:986 ino:2073551 sk:200a cgroup:/system.slice/geoclue.service <->
	 skmem:(r0,rb131072,t0,tb87040,f0,w0,o0,bl0,d0) ts sack cubic wscale:8,7 rto:437 rtt:167.9/52.069 ato:40 mss:1402 pmtu:1500 rcvmss:1288 advmss:1448 cwnd:10 bytes_sent:890 bytes_acked:891 bytes_received:4030 segs_out:10 segs_in:9 data_segs_out:5 data_segs_in:5 send 668kbps lastsnd:49060 lastrcv:48856 lastack:48856 pacing_rate 1.34Mbps delivery_rate 129kbps delivered:6 app_limited busy:579ms rcv_space:14480 rcv_ssthresh:64088 minrtt:155.298
ESTAB             0             0                                              192.168.1.102:39462                                            54.210.64.71:https           users:(("GeckoMain",pid=337851,fd=140)) uid:1000 ino:2074471 sk:200b cgroup:/user.slice/user-1000.slice/user@1000.service/app.slice/app-gnome-firefox-337851.scope <->
	 skmem:(r0,rb131072,t0,tb87040,f0,w0,o0,bl0,d0) ts sack cubic wscale:8,7 rto:632 rtt:228.628/42.77 ato:40 mss:1402 pmtu:1500 rcvmss:1402 advmss:1448 cwnd:10 bytes_sent:1897 bytes_acked:1898 bytes_received:7053 segs_out:18 segs_in:15 data_segs_out:9 data_segs_in:11 send 491kbps lastsnd:38738 lastrcv:38514 lastack:38514 pacing_rate 981kbps delivery_rate 313kbps delivered:10 app_limited busy:799ms rcv_space:14480 rcv_ssthresh:64088 minrtt:165.652

# ps 337851
    PID TTY      STAT   TIME COMMAND
 337851 ?        Sl    70:40 /usr/lib64/firefox/firefox

上記出力結果の1つ目は、つぎのような意味です。

“GeckoMain”,pid=337851,fd=140: Process name、pid=337851

fd 140: file descriptor 140

rto 394: TCP retranmission timeout 394 milliseconds

rtt:193.102/33.748: Average round trip time is 193.102 milliseconds, 33.748 milliseonds mean deviation

mss:1402: Max segment size: 1402 bytes

cwnd:10: Congestion window size: 10 x MSS

bytes_acked:8380: 8380 bytes successfully transmitted

bytes_received:6951: 6951 bytes received

pacing_rate 1.16Mbps: Pacing rate of 1.16Mbps

ip

ipは、ネットワークデバイスやルーティング、ポリシーなどの表示と変更を行うコマンドです。ここでは、インターフェイスの統計を表示してみます。

$ ip -s link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    RX: bytes  packets  errors  dropped missed  mcast   
    303296     2484     0       0       0       0       
    TX: bytes  packets  errors  dropped carrier collsns 
    303296     2484     0       0       0       0       
2: enp0s31f6: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN mode DEFAULT group default qlen 1000
    link/ether e8:6a:64:8a:56:ea brd ff:ff:ff:ff:ff:ff
    RX: bytes  packets  errors  dropped missed  mcast   
    0          0        0       0       0       0       
    TX: bytes  packets  errors  dropped carrier collsns 
    0          0        0       0       0       0       
3: wlp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DORMANT group default qlen 1000
    link/ether 50:76:af:44:dd:6a brd ff:ff:ff:ff:ff:ff
    RX: bytes  packets  errors  dropped missed  mcast   
    1721620206 2403766  0       0       0       0       
    TX: bytes  packets  errors  dropped carrier collsns 
    1259163059 2356566  0       0       0       0       

RXは受信で、TXは送信の関する情報です。

ルーティング テーブルを表示するには、次のようrouteを追加します。

$ ip route
default via 192.168.1.1 dev wlp2s0 proto dhcp metric 600 
66.187.238.xx via 192.168.1.1 dev wlp2s0 proto static metric 600 
192.168.1.0/24 dev wlp2s0 proto kernel scope link src 192.168.1.102 metric 600 
192.168.1.1 dev wlp2s0 proto static scope link metric 600 
192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1 

nstat

nstatは、カーネルで保存されたSNMP名でネットワークの統計情報を表示するコマンドです。-sオプションを追加することによって、リセットを防ぎます。

$ nstat -s
#kernel
IpInReceives                    1151298            0.0
IpInAddrErrors                  1                  0.0
IpForwDatagrams                 10621              0.0
IpInDelivers                    1135963            0.0
IpOutRequests                   1693632            0.0
IpOutDiscards                   120                0.0
IpOutNoRoutes                   547                0.0
IcmpInMsgs                      3317               0.0
IcmpInErrors                    13                 0.0
IcmpInDestUnreachs              3258               0.0
IcmpInEchos                     59                 0.0
IcmpOutMsgs                     770                0.0
...

netstat

netstatは、ネットワーク接続やルーティングの状況、ネットワークインターフェース(NIC)の状態を報告するコマンドです。

追加のオプションによって、次のような情報を取得できます。

-a: all socketsという意味で全てのソケットを表示します

-n: not resolve IP addressという意味でIPアドレスのまま表示します

-p: processという意味でプロセスを表示します

# netstat -anp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:37349           0.0.0.0:*               LISTEN      -                   
tcp        0      0 127.0.0.1:4330          0.0.0.0:*               LISTEN      1826/pmlogger       
tcp        0      0 0.0.0.0:5355            0.0.0.0:*               LISTEN      408989/systemd-reso 
tcp        0      0 127.0.0.1:5900          0.0.0.0:*               LISTEN      83104/qemu-system-x 
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      1/systemd           
tcp        0      0 0.0.0.0:56211           0.0.0.0:*               LISTEN      1080/rpc.statd      
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      408989/systemd-reso 
tcp        0      0 192.168.122.1:53        0.0.0.0:*               LISTEN      1790/dnsmasq        
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      5626/sshd: /usr/sbi 
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      939/cupsd           
tcp        0      0 127.0.0.1:18171         0.0.0.0:*               LISTEN      3351/BluejeansHelpe 
tcp        0      0 127.0.0.1:44321         0.0.0.0:*               LISTEN      1211/pmcd           
tcp        0      0 192.168.1.102:57364     54.150.30.32:443        ESTABLISHED 337851/firefox      
tcp        0      0 192.168.1.102:57430     13.33.211.138:443       ESTABLISHED 337851/firefox      
tcp        0      0 192.168.1.102:46224     18.180.70.68:443        TIME_WAIT   -                   
tcp        0      0 192.168.1.102:60358     54.65.34.12:443         ESTABLISHED 337851/firefox      
tcp        0      0 192.168.1.102:56942     54.210.64.71:443        ESTABLISHED 337851/firefox      
tcp        0      0 192.168.1.102:50222     52.35.251.160:443       ESTABLISHED 337851/firefox      

インターフェースの統計は、-iオプションで取得できます。

# netstat -i
Kernel Interface table
Iface             MTU    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
enp0s31f6        1500        0      0      0 0             0      0      0      0 BMU
lo              65536     2485      0      0 0          2485      0      0      0 LRU
tun0             1360     3482      0      0 0          4159      0      0      0 MOPRU
virbr0           1500    36098      0      0 0         48397      0      0      0 BMRU
vnet0            1500    36098      0      0 0        181961      0      0      0 BMRU
wlp2s0           1500  2476986      0      0 0       2405168      0      0      0 BMRU

TXは送信、RXは受信です。OKは文字通り問題なし、ERRはパケットのエラー、DRPはパケットのドロップ、OVRはパケットのオーバーランです。

オーバーランとは、ネットワーク・バッファを確保できなかった回数を示します。上記のPackets Droppedとあわせてネットワーク・バッファの値、もしくはネットワーク・キューの長さなのか、どちらに問題があるのかを判断する場合に使用できます。

-sオプションで、ネットワークスタックの統計を表示できます。

# netstat -s
Ip:
    Forwarding: 1
    1169770 total packets received
    1 with invalid addresses
    10621 forwarded
    0 incoming packets discarded
    1154356 incoming packets delivered
    1713329 requests sent out
    120 outgoing packets dropped
    547 dropped because of missing route
Icmp:
    3387 ICMP messages received
    13 input ICMP message failed
    ICMP input histogram:
        destination unreachable: 3318
        timeout in transit: 10
        echo requests: 59
    774 ICMP messages sent
    0 ICMP messages failed
    ICMP output histogram:
        destination unreachable: 708
        redirect: 1
        echo requests: 6
        echo replies: 59
IcmpMsg:
        InType3: 3318
        InType8: 59
        InType11: 10
        OutType0: 59
        OutType3: 708
        OutType5: 1
        OutType8: 6
Tcp:
    30323 active connection openings
    17 passive connection openings
    2850 failed connection attempts
    847 connection resets received
    15 connections established
    1153709 segments received
    1224359 segments sent out
    3719 segments retransmitted
    287 bad segments received
    25482 resets sent
Udp:
    390981 packets received
    294 packets to unknown port received
    2 packet receive errors
    855508 packets sent
    2 receive buffer errors
    0 send buffer errors
    IgnoredMulti: 6766
...

上記の数値は、ブートしてからの合計となります。

sar

sarを使っても、ネットワークの統計の情報を取得できます。

-n DEVでネットワークインターフェースの統計を表示します。 -n EDEVでネットワークインターフェースのエラー統計を表示します。

# sar -n DEV 

00:00:52        IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
00:10:58           lo      0.11      0.11      0.01      0.01      0.00      0.00      0.00      0.00
00:10:58    enp0s31f6      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
00:10:58       wlp2s0      2.41      1.95      0.66      0.62      0.00      0.00      0.00      0.00
00:10:58       virbr0      0.01      0.04      0.00      0.01      0.00      0.00      0.00      0.00

# sar -n EDEV
00:00:52        IFACE   rxerr/s   txerr/s    coll/s  rxdrop/s  txdrop/s  txcarr/s  rxfram/s  rxfifo/s  txfifo/s
00:10:58           lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
00:10:58    enp0s31f6      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
00:10:58       wlp2s0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
00:10:58       virbr0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

ethtool

ethoolは、ネットワークインターフェイスの状況を調べるコマンドです。例えば、-Sで統計を表示します。

# ethtool -S wlp2s0
NIC statistics:
     rx_packets: 48824
     rx_bytes: 23270212
     rx_duplicates: 0
     rx_fragments: 77420
     rx_dropped: 49
     tx_packets: 44275
     tx_bytes: 12843114
     tx_filtered: 0
     tx_retry_failed: 0
     tx_retries: 2716
     sta_state: 4
     txrate: 468000000
     rxrate: 866700000
     signal: 202
     channel: 0
     noise: 18446744073709551615
     ch_time: 18446744073709551615
     ch_time_busy: 18446744073709551615
     ch_time_ext_busy: 18446744073709551615
     ch_time_rx: 18446744073709551615
     ch_time_tx: 18446744073709551615

-iオプションでドライバーの情報を取得できます。

# ethtool -i wlp2s0
driver: iwlwifi
version: 5.11.18-300.fc34.x86_64
firmware-version: 36.ad812ee0.0 8265-36.ucode
expansion-rom-version: 
bus-info: 0000:02:00.0
supports-statistics: yes
supports-test: no
supports-eeprom-access: no
supports-register-dump: no
supports-priv-flags: no

-kオプションでチューニングの情報を取得できます。

# ethtool -k wlp2s0
Features for wlp2s0:
rx-checksumming: off [fixed]
tx-checksumming: off
	tx-checksum-ipv4: off [fixed]
	tx-checksum-ip-generic: off [fixed]
	tx-checksum-ipv6: off [fixed]
	tx-checksum-fcoe-crc: off [fixed]
	tx-checksum-sctp: off [fixed]
scatter-gather: on
	tx-scatter-gather: on
	tx-scatter-gather-fraglist: off [fixed]
tcp-segmentation-offload: off
	tx-tcp-segmentation: off [fixed]
	tx-tcp-ecn-segmentation: off [fixed]
	tx-tcp-mangleid-segmentation: off [fixed]
	tx-tcp6-segmentation: off [fixed]
generic-segmentation-offload: on
generic-receive-offload: on
...

bfp tool

soconnect.btというツールを使ってソケット接続の状況をプロセス毎に表示できます。また、LATではconnect(2) システムコールの時間を表示しています。

bpftraceのパスは、環境に応じて、変更してください。
# diff soconnect.bt soconnect.bt.ori
1c1
< #!/usr/bin/bpftrace
---
> #!/usr/local/bin/bpftrace

# ./soconnect.bt
Attaching 4 probes...
PID    PROCESS          FAM ADDRESS          PORT   LAT(us) RESULT
3135   wget             2   192.168.122.1    565         25 Success
3135   wget             2   142.250.199.110  512         10 Success
3135   wget             10  2404:6800:4004:820::200e 768          7 Network unreachable
3135   wget             2   142.250.199.110  592       4872 Success
3135   wget             2   192.168.122.1    565         17 Success
3135   wget             10  2404:6800:4004:822::2004 768          9 Network unreachable
3135   wget             2   172.217.161.68   512          4 Success
3135   wget             2   172.217.161.68   592       7578 Success
3197   rhsmcertd-worke  2   192.168.122.1    565          8 Success
3197   rhsmcertd-worke  2   10.4.204.72      699        274 In progress
3197   rhsmcertd-worke  2   192.168.122.1    565          9 Success
3197   rhsmcertd-worke  2   10.4.204.72      699         33 In progress
3197   rhsmcertd-worke  2   192.168.122.1    565         30 Success
...

コメント

タイトルとURLをコピーしました