元バンドマンITエンジニアの語り場

技術とか趣味とか日々の至福と鬱憤とか

【ネットワーク】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ヘッダのサイズは使用する暗号化アルゴリズムにより可変。

  • DES/3DESの場合:8byte
  • AES(-CBC):16Byte
  • AES-CGM:8Byte

※2:ESPトレーラのPaddingは可変。また、Padding LengthとNextHeaderはそれぞれ1byte。Paddingは暗号化アルゴリズムが要求するバイト数により自動調整される(0-255byte)。暗号化範囲とESPトレーラの合計サイズが以下となるよう調整される。暗号化範囲とESPトレーラの合計サイズが以下となるよう調整される。

  • DES/3DESの場合:8の倍数
  • AES(-CBC):16の倍数
  • AES-CGM:4の倍数

※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に調整する。

 

上記の表から、EthernetIPsecを使用する場合は、MSS調整値を1,398byteに、フレッツでIPsecを使用する場合はMSS調整値を1,350byteにするのが最適といえます。

 

以上、IPsec利用時の最適なMSS値についてまとめてみたでした〜。