mones2/22.ネットワークサーバ/12.Monaが全てのパケットを受け取っているか


Top / mones2 / 22.ネットワークサーバ / 12.Monaが全てのパケットを受け取っているか

これは何か

Etherealでパケットを調べたところMonaがパケットを取りこぼしているせいで、ちぐはぐな通信になっているように見えた。 このような状況なので、EtherealとMonaのパケットを見比べることが必要となった。

検証

 uIPがパケットを受信した直後(パケットのdrop判断をする前)にTCPパケットをlogprintでdumpするようにした。
 	
 logprintfはserial portに出力するのでQEMUを --serial file:serial.logと起動してみたがだめだった。
 	
 id:Yamami:20050516#p1のように、vl.cに直接fprintfを埋め込んだ方がはやそうな気がしてきた。
 	
 追記:
 	
 実験調査してみました。
 	
 コードは変えてないのですが前回と微妙に結果が違います。
 Monaのプロトコルスタックが受け取ったパケット
 	
 20480 to 260:len=  44 ACK SYN seqno=9bee975e ackno=000000b5
 20480 to 260:len=  40 ACK     seqno=9bee975f ackno=000000b5
 20480 to 260:len= 240 ACK     seqno=9bee975f ackno=000000de
 20480 to 260:len=1486 ACK     seqno=9bee9827 ackno=000000de
 20480 to 260:len=  43 ACK     seqno=9bee9dcd ackno=000000de
 20480 to 260:len=1486 ACK     seqno=9bee9dd0 ackno=000000de
 20480 to 260:len=1486 ACK     seqno=9bee9827 ackno=000000de
 20480 to 260:len=1486 ACK     seqno=9bee9dcd ackno=000000de
 20480 to 260:len=1486 ACK     seqno=9beea373 ackno=000000de
 20480 to 260:len= 766 ACK     seqno=9beea919 ackno=000000de
 20480 to 260:len=1486 ACK     seqno=9bee9dd0 ackno=000000de
 20480 to 260:len=1486 ACK     seqno=9beea376 ackno=000000de
 20480 to 260:len=1486 ACK     seqno=9beea91c ackno=000000de
 20480 to 260:len=1486 ACK     seqno=9beeaec2 ackno=000000de
 20480 to 260:len=  42 ACK     seqno=9beea376 ackno=000000de
 20480 to 260:len=1486 ACK     seqno=9beeb468 ackno=000000de
 20480 to 260:len=1486 ACK     seqno=9beeba0e ackno=000000de
 20480 to 260:len=1005 ACK     seqno=9beebfb4 ackno=000000de
 20480 to 260:len=1486 ACK     seqno=9beec379 ackno=000000de
 20480 to 260:len= 874 ACK     seqno=9beec91f ackno=000000de
 20480 to 260:len=1486 ACK     seqno=9beecc61 ackno=000000de
 20480 to 260:len=1486 ACK     seqno=9beed207 ackno=000000de
 20480 to 260:len= 411 ACK     seqno=9beed7ad ackno=000000de
 20480 to 260:len=1486 ACK     seqno=9beed920 ackno=000000de
 20480 to 260:len=1486 ACK     seqno=9beedec6 ackno=000000de
 20480 to 260:len= 158 ACK     seqno=9beee46c ackno=000000de
 20480 to 260:len=1486 ACK     seqno=9beee4e2 ackno=000000de
 20480 to 260:len= 373 ACK     seqno=9beeea88 ackno=000000de
 20480 to 260:len=1486 ACK     seqno=9beeebd5 ackno=000000de
 20480 to 260:len= 187 ACK     seqno=9beef17b ackno=000000de
 	
 Etherealが受け取ったパケット
 Ethereal形式のdump
 相違点
 	
 Etherealが後半に受信した4パケットが受信されていない。
 問題点・疑問点
 	
     * 4パケット分がどこで消失したか?(QEMU内か?タイムアウト?)
     * やはり途中でちぐはぐな送受信が見え隠れするので、プロトコルスタックの後半部でパケットが捨てられていないか調べる必要がある。
 	
 今後はこの2つを調べます。

実況中継気味。 todo

	

1. QEMU内でパケットが消失しているか?

	

2. プロトコルスタックの後半でパケットが捨てられていないか?

	

3.MonaからのパケットのIPヘッダのFlagsは0

	

4.MSSが1446になっているが、データサイズが安定していない

	

5.MonaからのAckパケットに’GET / HTTP/1.0’というデータが存在する 1.QEMU内でパケットが消失しているか?

	

QEMU内のvoid ne2000_receiveあたりで、受け取りパケットが取れそう。

	

当然のことながらQEMUはパケットの種類には関知しません。

	

なので、net2000.cに

	
   typedef struct{
       byte  dstmac[6];
       byte  srcmac[6];
       word    type;   
       byte   data[0x600];
   } Frame;
	
   typedef struct{
       byte  verhead;
       byte  tos;    
       word len;     
       word id;      
       word frag;    
       byte  ttl;    
       byte  prot;   
       word chksum;  
       dword srcip;  
       dword dstip;  
       char     data[0];
   } IPHeader;
	

EtherFrame, IPHeaderの定義を埋め込んで

	
   const Frame* frame = (const Frame*)buf;
   if (frame->type == 0x800) { // IP
	

このような感じで覗き見る必要があります。(だいぶバッドノウハウになってきたな。) Monaのパケット受信タイムアウトサイクルを100ms -> 30ms にしたら、結構まともに返ってくるようになりました。

	

まともに返ってくる分、検証がしづらくなったなぁ。

	

今後の方向性として

	

「タイムアウトサイクルを元に戻して、細かく調べる」のと「とりあえず前に進んで見る」はどちらが良いかなぁ。

	

気になる点はいろいろ

	
   * QEMU内でパケットが消失しているか?→dumpの仕組みは作った
   * プロトコルスタックの後半でパケットが捨てられていないか? →捨ててない
   * MonaからのパケットのIPヘッダのFlagsは0→問題ある?
   * MSSが1446になっているが、データサイズが安定していない
   * MonaからのAckパケットに’GET / HTTP/1.0’というデータが存在する
	

コメント

コメントはありません。 コメント/mones2/22.ネットワークサーバ/12.Monaが全てのパケットを受け取っているか?

お名前:

MENU

now: 9

リンク


最新の20件
2018-10-07 2018-09-20 2018-09-03 2018-05-09 2017-09-29 2017-01-10 2016-12-11 2016-10-04 2016-08-14 2016-05-29 2015-12-28 2013-02-25 2013-02-21 2013-02-20 2013-02-12 2013-02-11 2013-02-10
最新の20件
2010-02-01 2010-01-31 2010-01-30 2010-01-29 2010-01-16

Counter: 1870, today: 1, yesterday: 0

添付ファイル: filemona_httpd2.log 1069件 [詳細]

リロード   新規 編集 凍結 差分 添付 複製 改名   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS

Last-modified: 2008-03-28 (金) 15:48:01 (3912d);  Modified by mona
PukiWiki 1.4.6 Copyright © 2001-2005 PukiWiki Developers Team. License is GPL.
Based on "PukiWiki" 1.3 by yu-ji
Powered by PHP 5.2.17
HTML convert time to 0.034 sec.