62531
PCとPCをEthernetでつないで通信を行うと、通常はMTU1500どうしなので通信可能かと思います。  
片方のMTU設定を1000に変えた場合、MTU1500のPCからデータを送信すると、MTU1000にしたPCへはデータが届かないかと思うのですが、どのような挙動になるのかご教授頂けないでしょうか？
CC BY-SA 4.0
2020-01-24T01:52:11.607
62505
2020-01-25T01:53:07.970
36599
question
network
違うMTU設定での通信について質問
この例の場合、主に３つの手段によって通信を可能としています。説明のため PC-A (MTU=1500) と PC-B (MTU=1000)
と名付けておきます。

通信の多くは TCP だと思うので TCP の場合から

  * TCP maximum segment size (MSS)

[TCP](https://ja.wikipedia.org/wiki/Transmission_Control_Protocol) の接続の際に PC-B
は自分の MTU サイズから計算した MSS (PC-A のものより小さい) を通知することができ、これによって１パケットが MTU
を超えてしまう通信を接続の時点で避けることができます。

PC-A と PC-B が LAN (特に同一 HUB) に接続されていれば下記は適用する必要がありません。でも The Internet
上での接続を考えると、途中にいろいろな機器が入ることになります。もしかしたら途中に MTU=500 などもっと小さいルーターが入るかもしれません。

  * 経路 MTU 探索 (RFC1191)

MTU が小さい経路を避けて性能を出すためのプロトコルがあります。これにより下記フラグメンテーションを避けて通信することが可能です（失敗することもあります）

  * フラグメンテーション

MTU が小さい経路が途中にあると、仲介するルーター機器が IP パケットを分割してくれます（ IP ヘッダ中のフラグ `DF=0`
で許可されている場合）。これをフラグメンテーションと呼びます。ソフトウエア処理が入るので通信が遅くなりますが届かないよりまし。ですが、これが発生しないよう経路を選ぶことのほうが大事です。

UDP や ICMP の場合は MTU より大きいパケットは PC-B が受け取らないだけです。
CC BY-SA 4.0
2020-01-24T04:17:15.643
62510
2020-01-24T04:17:15.643
8589
62505
answer
一般的にはフラグメントにより分割されて送信し、受信側でそれを結合するのではないでしょうか？  
<https://www.alaxala.com/jp/techinfo/archive/manual/AX7700R/HTML/10_10_/APGUIDE/0084.HTM>
CC BY-SA 4.0
2020-01-24T07:49:56.693
62516
2020-01-24T07:49:56.693
24490
62505
answer
# レイヤ2(Ethernet)の話

質問の状況であれば、送信側が受信側のMTUを超えるフレームを送信すると、ネットワーク全体としては違反しているわけではないので、受信側までフレームは到達していますが、たいていの場合エラーとして破棄されます。

質問は故意にMTUを小さくした場合ですが、ジャンボフレームに対応したネットワークにジャンボフレーム非対応の機器をつなぐと同じことが起き得ます。

類似の状況として、ジャンボフレーム非対応のスイッチで構成されたネットワークにジャンボフレームを送信する場合が考えられます。この場合は、スイッチのレベルで破棄されるので、受信側に届くことはありません。

いずれにしても、EthernetのレベルでMTUが異なるという状態は通常あり得ない状態なので、何かしらいろいろ不都合が出るでしょう

# レイヤ3(IP)の話

MTUはL2層によって異なります。IPは様々なL2層を経由して通信することが前提のため、このことは考慮されています(別の見方をすると、そういう前提なのでエンド-
エンドでMTUを調整する機能が無い)。異なるL2層を接続するのはルータの役目ですが、ルータはMTUが大きいネットワークから小さいネットワークへ中継する際、IPパケットをMTUサイズに応じて分割して送信します。これが(IP)フラグメントです。フラグメントされたパケットは受信者が再結合します。

これは通常想定されている動作で、これがあるので容易に様々なメディアでネットワークを接続することができます。なので「避けるべきもの」では本来ないのですが、「微妙にMTUが小さい経路が存在する」という状況では、「元のパケットより微妙に小さいパケット+あまりのサイズのパケット」に分割されるという状況が頻繁に発生します。これは非常に非効率です(*)。

これを解決するために、Path MTU
Discoveryという仕組みが考えられました。簡単に言うと、ルータでフラグメントが発生する場合、そのことを送信側に通知することで、適当なMTUに調整して送信してもらう仕組みです。中継するルータが通知するので、L2ネットワーク内では機能しません。

(*)フラグメントが発生すると遅くなるのは、

  * 単純にパケット数が増える
  * パケット数が増えるとヘッダなどによるオーバーヘッドも増える
  * 短いパケットは特にオーバーヘッドが大きいため転送効率が悪い

という理由からです。ルータがフラグメントを行う処理にかかる時間の問題ではないので、これはどんなに高性能なルータでも発生します。

# レイヤ4(TCP/UDP)の話

TCPには、「自分が受信できる最大サイズ(MSS)」を接続時に通知する仕組みがあります。これは、本来「エンド-エンドでMTUを調停する仕組み」
**ではありません** 。

  * 一方的な通知で双方向で調整するわけではない
  * 途中経路のMTUを考慮するわけではない

MSSで通知するのは「自分が受信できる最大サイズ」なので、途中経路のMTUが小さいがそれを知り得ない場合にはフラグメントが発生する状況になります。最近のルータにはMTUが小さくなる部分でMSSを書き換えてしまうことでフラグメントが発生しないようにする機能があります。

質問の状況で考えてみます。繰り返しになりますが、本来「エンド-エンドでMTUを調停する仕組み」 **ではない**
ので、質問のように環境が正しくない状態では正しく機能することを期待してはいけません。また、MSSはTCPの話なので、例えばOSでMSSの制限値を設定したとしても、TCP以外のプロトコルでは機能しません。
CC BY-SA 4.0
2020-01-25T01:53:07.970
62531
2020-01-25T01:53:07.970
2020-06-17T08:14:45.997
-1
5793
62505
answer