• 締切済み

TCP/IP通信時のパケット分割について、パケットがMTU以下なのになぜ分割されるの?

Linux-PCと組み込みボード間でTCP/IP(Ethernetで)で通信を行ったときの なぜ?な現象について質問です。 Linux上のプログラムでボードに対して1300バイトのデータを送信(write) しているのですがTCPDUMPでモニタしたところ1024/276バイトに分割されて 送信されています。Linux側のMTUが1500になっているのになぜパケットが 分割されてしまうのでしょうか? ちなみにCygwin上でテストしたときには1つのパケットで送信されていま した。

みんなの回答

  • R32C
  • ベストアンサー率39% (115/290)
回答No.3

TCPのスロースタートかも? 3.2 TCPDUMP の例示でも1回目は540バイトしか送っていないようです。

参考URL:
http://www.qos.tu.chiba-u.jp/thesis/2003_b4_takatorikanako.pdf
mic-eng
質問者

お礼

自己レスです a,bとcに違いがもう1点ありました。 a,b)ではwindowサイズ=2048にしていました。 cでは16Kくらいに大きくなっていました。 (普通PCだとこれくらなのでしょう) 組み込みボード上のメモリの関係上2048にしていましたがこれを とりあえず16Kくらいにしたら上記の現象がなくなりました。 結果Windowサイズを2600未満(MSSの2倍未満)にすると上記の現象に なるようです。

mic-eng
質問者

補足

>TCPのスロースタートかも? スロースタートって転送するwindowサイズを徐々に大きくしていく ということだと思うのですが。最初は1セグメントから始まって 段々と1回で転送するセグメント数を大きくしていくってことですよね。 a) LinuxPC(server) <-> 組み込みボード(client) b) Cygwin(server) <-> 組み込みボード(client) c) LinuxPC(server) <-> Cygwin(client) 疑問) 上記a)でserver -> clientに1300バイトのデータを送信したときに 1024/276に分割されたパケットで転送されるのはなぜ? このときetherrealでキャプチャするとmss=1460になっているので 分割されないはずなのですが。 上記b,c)では1つのパケットで送信されます。 調査) 上記a,c)のキャプチャを比べたところclientのSYNパケットの TCPオプションに違いがありました。 a,b):MSS=1460 c):MSS=1460/nop/nop/SAC Permitted/ の違いがあります。 組み込みボード側でオプションを変更して再テストをやってみます。

  • R32C
  • ベストアンサー率39% (115/290)
回答No.2

相手をCygwinではなく、Cygwin -->組込みボードの場合にOKということだったんですね。 原因はわかりませんが、TCPDUMPでMSSの手順でどうMSSが決定されるか調べて みてはいかがですか? #EthrealならGUIで見やすいと思いますが。

  • R32C
  • ベストアンサー率39% (115/290)
回答No.1

TCP/IPはうまくできていて、メモリの少ないマシンの場合に MTU(MSS)をこのサイズにしてという手順があり、たぶん組み込みボード側 がそのサイズでないと受けられないのでしょう。全く正常な動作です。

参考URL:
http://www.fuwafuwa.org/Lecture/learn/network_nepc/course2/chapter04/section07.html
mic-eng
質問者

補足

>MTU(MSS)をこのサイズにしてという手順があり、たぶん組み込みボード側 >がそのサイズでないと受けられないのでしょう 上記の場合はMSS=1024等ボード側のMSSが1300未満の場合ですよね? 組み込みボード側のMSSは1300より大きい数字になっていますので ボード側のメモリ問題とは少々違うと思うのですが。実際同じプログラム のボードとCygwin(winXP)間の通信時は1回で転送されていましたので Linuxのなにか設定の問題なのかなと思いまして。 Linux側のMSS=1460で1300より大きいです。