【ネットワーク】IPsec利用時のMSS値について考える
ネットワーク上を流れるフレーム(パケット)で転送可能なデータの最大値を表す単位としてMTU(Maximum Data Unit)というものがあります。
MTUの値は利用する通信メディアやカプセル化有無により変動するが、最も一般的であるEthernetでは1,500byteがMTUとなります。他にはフレッツ光(PPPoE)の場合、MTUは1,454byteだったりします。
細かい説明は割愛しますが、MTUを超えるフレームを送信しようとした場合、より小さいMTUの伝送路で自分のMTU以内に収まるようにフレームを分割しようとする動作が働いて(IPフラグメンテーション)、その分転スループットが下がったり、フラグメンテーションを行っている機器のCPUに負荷を与えたりします。なので、ネットワークを設計する際はIPフラグメンテーションが発生しないように考慮するのが基本となります。
また、MTUと密接に関わる用語に、MSS(Maximum Segment Size)というものがあります。
これは、MTUからIPヘッダの20byteとTCPヘッダの20Byteを差し引いたもので、実際のデータ(ペイロード)が格納されている部分を指します。
転送効率を高めるためには、MTUを超えない範囲でMSSを最大にする必要があるということです。
MSSの値はTCPの3WayHandShake時にデータを送受信しあうノード(PCやスマホ、サーバーなど)が互いに自身のMSSを送り合い、より小さい値がそのTCPコネクションにおけるMSSとして決定されます。
なお、サイズの大きいデータをMSSのサイズに細切れして送信することをIPセグメンテーションといいます。IPセグメンテーションはデータを送信するノードで行われ、ほぼすべてのデータ送信時に行われています。
追加のカプセル化が行われる場合の注意点
ここで問題なのが、TCPコネクションで通信をするノードは、その途中区間で追加のカプセル化が行われてたとしても、そんなことは知ったこっちゃないと言って、自身のOSに設定されているMSSを伝え合います。(Path MTU Discoveryを使用して、経路上の最小MTUを検知し、そのMTUに合わせてMSSを自動調整する機能もありますが、ICMPを使用するので、ICMPが許可されていないNW機器があると有効に働きません)
なので、IPsecやフレッツ光のように、途中で追加のカプセル化が行われるようなネットワークだと、MSSを大きくしすぎてしまうと追加のカプセル化によるオーバーヘッド分がMTUを超えてしまい、フラグメンテーションが発生してしまう可能性が出てきます。
こういったことを防ぐため、追加のカプセル化を行う機器ではMSS調整(MSS-Ajust)を行い、3WayHandShake時に伝え合うMSS値をより小さなものに書き換えることによって、フラグメンテーションが発生しないようにします。
追加のカプセル化を行うプロトコルには様々なものがありますが、今回はIPsecを利用した場合の最適なMSS値について考えてみようと思います。
IPsecのパケットフォーマット
IPsec利用時のMSSを計算する際は、まずIPsecのパケットフォーマットについて理解しておく必要があります。
IPsecでは、ESPトレーラとペイロード、TCPヘッダ、オリジナルIPヘッダが暗号化範囲となり、暗号化範囲に対してESPヘッダや新IPヘッダなどが追加でカプセル化されます。
なので、Ethernetで構成されているネットワークでIPsecを使用している場合、ノード間でMSSを1,460(1500-40)byteで合意してしまうと、IPsecによるオーバーヘッドによりMTU1,500byteを超えてしまいフラグメントが発生してしまうのです。
なので、IPsecを実装する機器ではフラグメントが発生しないように、IPsecを考慮したMSS値に書き換えて上げる必要があります。
※1:Initial Vextorヘッダのサイズは使用する暗号化アルゴリズムにより可変。
※2:ESPトレーラのPaddingは可変。また、Padding LengthとNextHeaderはそれぞれ1byte。Paddingは暗号化アルゴリズムが要求するバイト数により自動調整される(0-255byte)。暗号化範囲とESPトレーラの合計サイズが以下となるよう調整される。暗号化範囲とESPトレーラの合計サイズが以下となるよう調整される。
※3:ESP認証データは使用するハッシュアルゴリズムによって可変
- D5/SHA1:12byte
- SHA256:16byte
- SHA384:24byte
- SHA512:32byte
- AES-GCM with a 16 octet ICV(IANA 20):16byte
IPsec利用時の最適MSSについて
最近では、暗号化アルゴリズムに「AES(-CBC)」、ハッシュアルゴリズムに「SHA256」が使用されることが多いようですので、その前提でMTUごとの最適なMSSを表で表すと以下のようになります。
なお、ペイロード(MSS)+TCPヘッダ+IPヘッダ+2byteが16の倍数になるとPaddingが0byteになるので、転送効率が高い状態と言えます。
◆MSS調整値早見表(IVヘッダを16byte,ESP認証データを16byteとした場合) | |||||
MTU | 暗号化範囲 | ÷16byte | 最適MTU | MSS | メモ |
1500 | 1440 | 90 | 1438 | 1398 | 暗号化範囲が16の倍数なので、Paddingは0byteに調整される |
1499 | 1439 | 89.9375 |
MTUがこのあたりの場合は、MSSを1382に調整する。1383以上にしてしまうと、Paddingが追加されてしまい、パケットのMTUが実際のMTU値を超えてしまいフラグメントが発生してしまうため。
|
||
1498 | 1438 | 89.875 | |||
1497 | 1437 | 89.8125 | |||
1496 | 1436 | 89.75 | |||
1495 | 1435 | 89.6875 | |||
1494 | 1434 | 89.625 | |||
1493 | 1433 | 89.5625 | |||
1492 | 1432 | 89.5 | |||
1491 | 1431 | 89.4375 | |||
1490 | 1430 | 89.375 | |||
1489 | 1429 | 89.3125 | |||
1488 | 1428 | 89.25 | |||
1487 | 1427 | 89.1875 | |||
1486 | 1426 | 89.125 | |||
1485 | 1425 | 89.0625 | |||
1484 | 1424 | 89 | 1422 | 1382 | 暗号化範囲が16の倍数なので、Paddingは0byteに調整される |
1483 | 1423 | 88.9375 |
MTUがこのあたりの場合は、MSSを1366に調整する。1367以上にしてしまうと、Paddingが追加されてしまい、パケットのMTUが実際のMTU値を超えてしまいフラグメントが発生してしまうため。
|
||
1482 | 1422 | 88.875 | |||
1481 | 1421 | 88.8125 | |||
1480 | 1420 | 88.75 | |||
1479 | 1419 | 88.6875 | |||
1478 | 1418 | 88.625 | |||
1477 | 1417 | 88.5625 | |||
1476 | 1416 | 88.5 | |||
1475 | 1415 | 88.4375 | |||
1474 | 1414 | 88.375 | |||
1473 | 1413 | 88.3125 | |||
1472 | 1412 | 88.25 | |||
1471 | 1411 | 88.1875 | |||
1470 | 1410 | 88.125 | |||
1469 | 1409 | 88.0625 | |||
1468 | 1408 | 88 | 1406 | 1366 | 暗号化範囲が16の倍数なので、Paddingは0byteに調整される |
1467 | 1407 | 87.9375 |
MTUがこのあたりの場合は、MSSを1350に調整する。1351以上にしてしまうと、Paddingが追加されてしまい、パケットのMTUが実際のMTU値を超えてしまいフラグメントが発生してしまうため。
|
||
1466 | 1406 | 87.875 | |||
1465 | 1405 | 87.8125 | |||
1464 | 1404 | 87.75 | |||
1463 | 1403 | 87.6875 | |||
1462 | 1402 | 87.625 | |||
1461 | 1401 | 87.5625 | |||
1460 | 1400 | 87.5 | |||
1459 | 1399 | 87.4375 | |||
1458 | 1398 | 87.375 | |||
1457 | 1397 | 87.3125 | |||
1456 | 1396 | 87.25 | |||
1455 | 1395 | 87.1875 | |||
1454 | 1394 | 87.125 | |||
1453 | 1393 | 87.0625 | |||
1452 | 1392 | 87 | 1390 | 1350 | 暗号化範囲が16の倍数なので、Paddingは0byteに調整される。 フレッツ回線でIPsecを使用する場合はMSSを1350byteに調整する。 |
上記の表から、EthernetでIPsecを使用する場合は、MSS調整値を1,398byteに、フレッツでIPsecを使用する場合はMSS調整値を1,350byteにするのが最適といえます。
以上、IPsec利用時の最適なMSS値についてまとめてみたでした〜。