CPUやメモリと同様にネットワーク機能もスマホやパソコンに搭載されており、ほぼ毎日利用しているかと思います。
そこでアンドロイドなどを含むLinuxでネットワーキングがどのように機能しているか簡単にご紹介していきます。
ネットワーキングの概要
アプリケーションからネットワーク インターフェース カード(NIC)までどのようにデータが移動しているか、こちらをご覧ください。
主なコンポーネント:
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
...
コメント