はじめに
SORACOMから「SORACOM ユーザーコンソールで SIM グループごとに MTU 値を設定できるようになりました」というお知らせが出ていました。
普段なかなかこのようなネットワーク設定を気にする機会はありませんが、せっかくなのでこの設定を確かめたり、実際にどのような違いが出てくるのか確かめようかなと思いました。
MTUとは?
ざっくりいうとIPパケットの最大サイズがMTU(Maximum Transmission Unit)です。MTUは送信サイズで厳密に言えばMRU(Maximum Receive Unit)もあるみたいですが、こちらはあまり意識することはありませんね。
IPパケットの中には、実際にやり取りされるデータ(ペイロード)の他に、IPアドレスやポート番号などの情報が入っているIPヘッダーもあり、ヘッダーも含めたサイズの最大値がMTUになります。このMTUはネットワークごとに決まっている大きさです。「ネットワーク」というのは、IPでいえばルーターを介さずに到達できる範囲といういことになります。
MTUは単一のネットワークだとあまり問題にはなりませんが、インターネットでは送信元から送信先に届くまでにさまざまなネットワークを経由しています。そのネットワークはEthernet、携帯回線のような物理的なネットワークもあり、IPSecやWireguardのような論理的なネットワークもあり、それぞれで一度に運べるサイズが決まっています。自分のネットワークに大きなMTUが設定されているとサイズの大きなパケットで送られますが、送信先のネットワークはそのサイズでは受けられなくてパケットが分割されたり、最悪破棄されてしまうということがあります。逆に小さすぎると通信効率が悪くなります。経路の全てのネットワークの中で一番小さい値が理想ですが、特にインターネットだとどのネットワークを通るかはわからないことが多いので、大きすぎず、小さすぎずを狙って設定することが必要になります。
MTUはネットワークごとに勝手に決めて良いのでEthernetだと1500とされていることが多いのですが、これだと分割せずに通せないネットワークもあるため、ちょっと小さい値にされていることもありますね。
そのMTUがSORACOMの回線では今まで設定できていなかったのが、設定できるようになった、というのがこのアップデートになります。IoTだと用途が限られているため、比較的最適なMTUを設定するこが可能と考えられますね。
SORACOMでの設定
設定方法は以下のページで確認できます。
https://users.soracom.io/ja-jp/docs/air/configure-ip-link-mtu/
具体的にはグループ設定のSORACOM Air for セルラーの設定の中ですね。
一番下の設定にある「IP Link MTU設定を有効化」をONにすればよいです。

試しに設定してみましょう。
Raspberry Pi 4 Model Bにて、Soracom Onyx – LTE™ USB ドングル (SC-QGLC4-C1)を繋いでみます。接続の仕方はSoracom Onyx - LTE™ USB ドングルをセットアップするを参照しました。
まず設定を有効にしていない状態で確認すると以下のように、MTUは1430となりました。
root@rasp:~# ifconfig wwan0
wwan0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1430
inet 10.198.251.254 netmask 255.255.255.252 destination 10.198.251.254
unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 1000 (UNSPEC)
RX packets 3 bytes 4290 (4.1 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 3 bytes 4290 (4.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
pingで試してみると、確かに1430を境にメッセージが送信できなくなります。(メッセージサイズにIPヘッダ20バイトとICMPヘッダーの8バイトを加算して計算するため1402を指定した時が1430バイトになる。-M doオプションにより分割を禁止すると、送信できない、というエラーメッセージが返される)
root@rasp:~# ping -c 4 -I wwan0 -s 1402 -M do 1.1.1.1
PING 1.1.1.1 (1.1.1.1) from 10.198.251.254 wwan0: 1402(1430) bytes of data.
1410 bytes from 1.1.1.1: icmp_seq=1 ttl=58 time=128 ms
1410 bytes from 1.1.1.1: icmp_seq=2 ttl=58 time=55.8 ms
1410 bytes from 1.1.1.1: icmp_seq=3 ttl=58 time=53.8 ms
1410 bytes from 1.1.1.1: icmp_seq=4 ttl=58 time=51.5 ms
--- 1.1.1.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 51.541/72.274/127.925/32.165 ms
root@rasp:~# ping -c 4 -I wwan0 -s 1403 -M do 1.1.1.1
PING 1.1.1.1 (1.1.1.1) from 10.198.251.254 wwan0: 1403(1431) bytes of data.
ping: sendmsg: Message too long
ping: sendmsg: Message too long
ping: sendmsg: Message too long
ping: sendmsg: Message too long
--- 1.1.1.1 ping statistics ---
4 packets transmitted, 0 received, +4 errors, 100% packet loss, time 3066ms
それではMTUを設定してみましょう。設定した場合のデフォルト値は1500のようです。設定は接続時に反映されるため、一度切断して再接続する必要があります。

確かに1500になりました。
root@rasp:~# ifconfig wwan0
wwan0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1500
inet 10.198.251.254 netmask 255.255.255.252 destination 10.198.251.254
unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 1000 (UNSPEC)
RX packets 2 bytes 2862 (2.7 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2 bytes 2862 (2.7 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
pingでの確認も想定通り、1472(1500)まではOKで、1473(1501)ではダメになります。
root@rasp:~# ping -c 4 -I wwan0 -s 1472 -M do 1.1.1.1
PING 1.1.1.1 (1.1.1.1) from 10.198.251.254 wwan0: 1472(1500) bytes of data.
1480 bytes from 1.1.1.1: icmp_seq=1 ttl=58 time=58.7 ms
1480 bytes from 1.1.1.1: icmp_seq=2 ttl=58 time=57.7 ms
1480 bytes from 1.1.1.1: icmp_seq=3 ttl=58 time=63.0 ms
1480 bytes from 1.1.1.1: icmp_seq=4 ttl=58 time=62.8 ms
--- 1.1.1.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 57.684/60.536/62.962/2.375 ms
root@rasp:~# ping -c 4 -I wwan0 -s 1473 -M do 1.1.1.1
PING 1.1.1.1 (1.1.1.1) from 10.198.251.254 wwan0: 1473(1501) bytes of data.
ping: sendmsg: Message too long
ping: sendmsg: Message too long
ping: sendmsg: Message too long
ping: sendmsg: Message too long
--- 1.1.1.1 ping statistics ---
4 packets transmitted, 0 received, +4 errors, 100% packet loss, time 3061ms
設定値の最小は576、最大値は9216のようです。かなり大きい値でも受けられるみたいですね。いろんなネットワークを経由するなら1500や1430が無難でしょうが、SORACOMとだけ通信するなら9216でも良いのかも?
ただデバイス、もしくはOSによる限界があるのか、576にした際には1280になりましたし、9216にした場合はそもそも接続できず、2000が限界でした。
性能確認
値を色々変更しても性能に影響がないんだったらやる必要ないですよね。わかりやすいところでファイルのアップロード/ダウンロード速度が変わるかどうか確認してみましょう。ファイルの置き場所としてSORACOM内のHarvest FilesとSORACOM外のS3とし、対象は10MBのファイル、MTUは設定なしの1430、最小の1280、最大の2000のそれぞれについて試してみます。
MTU1430
| S3 Download | S3 Upload | Harvest Download | Harvest Upload | |
|---|---|---|---|---|
| 1 | 10.61 | 10.362 | 10.743 | 10.347 |
| 2 | 11.438 | 10.661 | 11.026 | 10.519 |
| 3 | 10.54 | 10.542 | 10.613 | 10.516 |
| Average | 10.863 | 10.522 | 10.794 | 10.461 |
MTU1280
| S3 Download | S3 Upload | Harvest Download | Harvest Upload | |
|---|---|---|---|---|
| 1 | 11.131 | 11.033 | 14.182 | 10.896 |
| 2 | 11.746 | 10.615 | 14.429 | 10.538 |
| 3 | 11.155 | 10.423 | 14.648 | 10.467 |
| Average | 11.344 | 10.690 | 14.420 | 10.634 |
| 1430と比較 | +4.43% | +1.60% | +33.59% | +1.65% |
MTU 2000
| S3 Download | S3 Upload | Harvest Download | Harvest Upload | |
|---|---|---|---|---|
| 1 | 10.443 | 10.802 | 10.988 | 10.526 |
| 2 | 10.990 | 10.277 | 10.657 | 11.063 |
| 3 | 10.918 | 10.582 | 10.553 | 10.429 |
| Average | 10.784 | 10.554 | 10.733 | 10.673 |
| 1430と比較 | -0.73% | 0.30% | -0.57% | 2.03% |
MTU 1280の時のHarvest Filesからのダウンロードはなぜかかなり悪い、という結果になりました。通信先に応じて最適なMTUがありそうですが、デフォルトから大きく改善するということもないようなので、大きめのファイルをやり取りしている分にはさほど関係なさそうです。
パケットの様子はどうでしょうか。IPパケットの部分のみキャプチャしてみました。
MTU 1430 Harvest Files Download 11986パケット

MTU 1430 Harvest Files Upload 12289パケット

MTU 1280 Harvest Files Download 13019パケット

MTU 1280 Harvest Files Upload 13129パケット

MTU 2000 Harvest Files Download 12107パケット

MTU 2000 Harvest Files Upload 12113パケット

何の制約かはわかりませんが、1430や2000としていてもパケットの最大サイズは1378となりました。OSやアプリケーションで制限されていると思われますが、これではあまり変わりませんね。残念。1280にした場合はちゃんと1280になりました。その分少しパケット数が増え、その分通信時間が伸びているものと思われます。
最後にSORACOMのサービスがMTUの設定により大きなサイズで受け付けられるようになったかを確認します。たとえばHarvest DataのUDPデータは1パケットにまとめる必要があるので、最大の長さはMTU - 28です。(IPヘッダ20バイト、UDPヘッダ8バイト)
そのため、MTU1430のネットワークだと1402バイトまでしか送れませんでした。それ以上の長さで送ろうとすると、パケットが分割されて2つのメッセージとして受け取られてしまいます。MTU 2000だと1972まで送れるようになったでしょうか?
残念ながらなっていませんでした。MTUの設定によらず、Harvest Dataが受けられるデータ長は最大1472のようです。それ以上長くなると応答しなくなります。データも届いていないようです。サーバー側のネットワークのMTUにより制限されているのではないかと思いますが、やや残念ですね。
まとめ
MTUの変更を試してみました。携帯回線ネットワークの設定を変更する、というのは普通なかなかできないものですが、それができるのはSORACOMの面白いところですね。通信はSORACOMのネットワークだけの問題ではないのでうまくいかないところもありましたが、うまくすると転送速度や一度に送れるデータの上限を上げるといったことができそうです。何かの機会に活かせればよいですね。

