本連載では前回から3回にわたり,トランスレータの仕組みを解説しています。前回は,IPヘッダーの変換とIPv6拡張ヘッダーの変換について解説しました。今回は,ICMPメッセージの変換とTCPおよびUDPヘッダーの変換を説明します。そのあとで,IPv4とIPv6のペイロードの違いについて触れたいと思います。

ICMPの変換

 ICMP(Internet Control Message Protocol)は,IPv4とIPv6とで同じ書式のヘッダーを用いますが,タイプとコードの番号がIPv4とIPv6で異なるため変換する必要があります。表1に,ICMP Information Message,ICMP Error Messageのタイプとコードの対応を示しました。Information Messageは,ICMP Echo Request/Replyメッセージだけ変換します。一方Error Messageの変換は,もう少し複雑な処理になります。例えばIPv6のタイプ1「Destination Unreachable」のコード0に「no route to destination」というメッセージがあります。このメッセージは,複数のIPv4 Error Messageと対応付けられています。このメッセージをIPv4に変換する際は,タイプ3のコード1「host unreachable」というメッセージに変換します。

表1●ICMPのInformation Message(左)とError Message(右)
表1●ICMPのInformation Message(左)とError Message(右)
[画像のクリックで拡大表示]

 また,ICMPヘッダーの持つChecksumフィールドは,IPアドレスを用いて計算されています。トランスレータはIPアドレスを変換するため,ICMPヘッダーに含まれるチェックサム値も再計算する必要があります。

 さらにICMPのError Messageには,エラーを発生させる元となったパケットが付加されてくることがあります。IPv6では,付加することが必須となっています。トランスレータがこうしたICMPメッセージを変換する際には,IPヘッダーとICMPヘッダーを変換するだけでなく,ICMP Error Messageに付加されているIPヘッダーも正しく変換する必要があります(図1)。Error Messageに付加されるパケットは,ICMP Error Messageの受信者がどのパケットが原因でエラーが発生したかを知るための重要な情報となるためです。付加されてくるパケットの変換は,通常のヘッダーを書き換える方法で実施します。

図1●ICMP Error Messageに付加されているパケットのヘッダーも変換する
図1●ICMP Error Messageに付加されているパケットのヘッダーも変換する

TCPヘッダーの変換

 TCPは,IPのバージョンによらず共通のヘッダーを用います。ただし,Checksumフィールドに含める計算値はIPv4とIPv6で異なります。チェックサムを算出する際には「疑似ヘッダー」(チェックサム計算用のヘッダー)を用いますが,この疑似ヘッダーにIPアドレスが含まれるため,IPv4とIPv6で算出される値が違うのです(図2)。トランスレータが,TCPパケットを変換する際には,チェックサムを再計算する必要があります。この疑似ヘッダーは,UDPヘッダーのチェックサム計算にも用いられます。

図2●IPv4とIPv6の疑似ヘッダー
図2●IPv4とIPv6の疑似ヘッダー