- 締切済み
TCP/IP通信時のパケット分割について、パケットがMTU以下なのになぜ分割されるの?
Linux-PCと組み込みボード間でTCP/IP(Ethernetで)で通信を行ったときの なぜ?な現象について質問です。 Linux上のプログラムでボードに対して1300バイトのデータを送信(write) しているのですがTCPDUMPでモニタしたところ1024/276バイトに分割されて 送信されています。Linux側のMTUが1500になっているのになぜパケットが 分割されてしまうのでしょうか? ちなみにCygwin上でテストしたときには1つのパケットで送信されていま した。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- R32C
- ベストアンサー率39% (115/290)
TCPのスロースタートかも? 3.2 TCPDUMP の例示でも1回目は540バイトしか送っていないようです。
- R32C
- ベストアンサー率39% (115/290)
相手をCygwinではなく、Cygwin -->組込みボードの場合にOKということだったんですね。 原因はわかりませんが、TCPDUMPでMSSの手順でどうMSSが決定されるか調べて みてはいかがですか? #EthrealならGUIで見やすいと思いますが。
- R32C
- ベストアンサー率39% (115/290)
TCP/IPはうまくできていて、メモリの少ないマシンの場合に MTU(MSS)をこのサイズにしてという手順があり、たぶん組み込みボード側 がそのサイズでないと受けられないのでしょう。全く正常な動作です。
補足
>MTU(MSS)をこのサイズにしてという手順があり、たぶん組み込みボード側 >がそのサイズでないと受けられないのでしょう 上記の場合はMSS=1024等ボード側のMSSが1300未満の場合ですよね? 組み込みボード側のMSSは1300より大きい数字になっていますので ボード側のメモリ問題とは少々違うと思うのですが。実際同じプログラム のボードとCygwin(winXP)間の通信時は1回で転送されていましたので Linuxのなにか設定の問題なのかなと思いまして。 Linux側のMSS=1460で1300より大きいです。
お礼
自己レスです a,bとcに違いがもう1点ありました。 a,b)ではwindowサイズ=2048にしていました。 cでは16Kくらいに大きくなっていました。 (普通PCだとこれくらなのでしょう) 組み込みボード上のメモリの関係上2048にしていましたがこれを とりあえず16Kくらいにしたら上記の現象がなくなりました。 結果Windowサイズを2600未満(MSSの2倍未満)にすると上記の現象に なるようです。
補足
>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/ の違いがあります。 組み込みボード側でオプションを変更して再テストをやってみます。