- PR -

Rawソケット用いてパケット再送の測定

投稿者投稿内容
yshita
常連さん
会議室デビュー日: 2004/07/05
投稿数: 34
投稿日時: 2004-07-24 21:31
送信元ー>インターネットー>送信先

というネットワーク構成で、TCPを用いてパケットを
送り、どのくらいパケットの再送が起こるか、計る実験
したいと考えています。

Rawソケットを用いて、送信元で同じシーケンス番号を
複数送ったら再送がかかっていると考え、Rawソケット
を用いたプログラムを作ろうと思っています。

この方式だとうまく測定できないのでしょうか?
もしくは、他にいい方法があるのでしょうか?
知っている方がいたら教えていただけないでしょうか。

よろしくお願いします。
きつね
常連さん
会議室デビュー日: 2004/01/02
投稿数: 37
お住まい・勤務地: 西新宿
投稿日時: 2004-07-24 23:30
できると思いますよ。

UNIX系の前提でお話をしますが、
送信元で、観測対象となるSOCK_STREAMで通信するプログラム以外に、SOCK_RAWソケットを使うプログラムを起動させ該当TCPストリームのシーケンス番号を記録させればいいでしょう。
SOCK_RAWでなく、libpcap等を使った方が簡単かもしれません。

規模などにもよりますが、わざわざプログラムを作らなくても、tcpdumpやethereal等のソフトウェアを用いてパケットをモニタリングし、TCPコネクションごとに分析するだけでも良いかもしれません。
送信元で計測しても良いですし、送信先で計測しても良いです。途中のスイッチ等にミラーポートを設けて別のコンピュータで計測することもできます。

予算があれば、商用のネットワークアナライザやベンチマークハードウェアを買うという選択肢もあります。広帯域での計測に対応できるもの、負荷をかけながら計測できるものなど色々あります。
ぽんす
ぬし
会議室デビュー日: 2003/05/21
投稿数: 1023
投稿日時: 2004-07-25 00:18
「ありゃ、TCP や UDP だったらカーネルは raw socket には渡さない
のでは?」と思いきや、2.2 以降(?)の Linux だと packet socket で
拾えるんですね。勉強になりました。
# 私と同様、知らない方へ: man 7 packet
## でもやっぱり、raw socket じゃないですよね。
## socket_type は SOCK_RAW ですが。

楽にできるのは、やはり tcpdump を使う手ですね。
再送している様子はデフォルトオプションでもわかります。

[ メッセージ編集済み 編集者: ぽんす 編集日時 2004-07-25 00:24 ]
yshita
常連さん
会議室デビュー日: 2004/07/05
投稿数: 34
投稿日時: 2004-07-25 16:32
きつねさん、ぽんすさん、いろいろ教えていただき
ありがとうございました。
tcpdumpを使うことにしました。こんないいものが
あったとは知りませんでした。


[ メッセージ編集済み 編集者: yshita 編集日時 2004-07-26 01:09 ]
yshita
常連さん
会議室デビュー日: 2004/07/05
投稿数: 34
投稿日時: 2004-07-27 12:46
たびたび質問して申し訳ないんですが、

送信元から送信先に指定したデータサイズを送信する
プログラムをTCPソケットを用いて作成しました。
そして、送信元でtcpdumpを起動し、シーケンス番号
を確認し、再送が起こっているか確認しています。

送信元から60KBを越えるデータを送信すると、tcpdumpで

tcpdump -n src host 192.168.1.106

12:28:08.297836 192.168.1.106.47330 > 192.168.1.56.9000: . ack 385152707 win 5840 <nop,nop,timestamp 7230328 706029> (DF)
12:28:08.346470 192.168.1.106.47330 > 192.168.1.56.9000: . 0:1448(1448) ack 1 win 5840 <nop,nop,timestamp 7230333 706029> (DF)



12:28:08.703168 192.168.1.106.47330 > 192.168.1.56.9000: . 53576:55024(1448) ack 1 win 5840 <nop,nop,timestamp 7230369 706069> (DF)
12:28:08.704790 192.168.1.106.47330 > 192.168.1.56.9000: P 55024:56472(1448) ack 1 win 5840 <nop,nop,timestamp 7230369 706069> (DF)
12:28:08.823549 192.168.1.106.47330 > 192.168.1.56.9000: . 56472:57920(1448) ack 1 win 5840 <nop,nop,timestamp 7230381 706070> (DF)
12:28:08.823572 192.168.1.106.47330 > 192.168.1.56.9000: . 57920:59368(1448) ack 1 win 5840 <nop,nop,timestamp 7230381 706070> (DF)
12:28:08.827585 192.168.1.106.47330 > 192.168.1.56.9000: . 59368:60816(1448) ack 1 win 5840 <nop,nop,timestamp 7230381 706082> (DF)
12:28:09.082000 192.168.1.106.47330 > 192.168.1.56.9000: . ack 1 win 5840 <nop,nop,timestamp 7230407 706086> (DF)
12:28:09.521998 192.168.1.106.47330 > 192.168.1.56.9000: . ack 1 win 5840 <nop,nop,timestamp 7230451 706107> (DF)
12:28:10.401997 192.168.1.106.47330 > 192.168.1.56.9000: . ack 1 win 5840 <nop,nop,timestamp 7230539 706151> (DF)
12:28:12.161996 192.168.1.106.47330 > 192.168.1.56.9000: . ack 1 win 5840 <nop,nop,timestamp 7230715 706239> (DF)

と結果が出てしまいます。

100KBを送信したとしても、60KBを少し越えたところで毎回、それ以降の
データが送信されていないようなのです。

実験環境としては、
送信元-->ハブ-->送信先です。

機器の性能は悪くないので、原因が何か分からず困っています。
ソケットプログラムが間違っているのかもしれませんが。

どなたか教えて頂けないでしょうか。
宜しくお願いします。

[ メッセージ編集済み 編集者: yshita 編集日時 2004-07-27 12:48 ]
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2004-07-27 14:58
Web検索
パケット最大長
では?
Uchikoshi
@ITエディタ
会議室デビュー日: 2001/07/27
投稿数: 197
投稿日時: 2004-07-27 16:27
TCPが再送しているかどうかどうかを知りたければ、
単に netstat -s で統計値を表示させ、TCPの中にある 「…retransmit…」
などという名前のカウンタの値を繰り返し表示させて、
その状態をモニタすればいいのではないでしょうか。
通信プログラムを動作させているときに、このカウンタの値が
どんどん増えていくようならば、再送が発生しています。

が、実際には、フロー制御があるので、再送だらけになるという
ことはないと思います。データが送られなくなるのは、
単に受信側がデータをうまく受け取っていないから、という
ような気がしますが……。通信が「詰まっている」ときのトラフィック
の状態などがもう少し詳しく分かるとよいのですが。
yshita
常連さん
会議室デビュー日: 2004/07/05
投稿数: 34
投稿日時: 2004-07-27 19:22
MMX,Uchikoshiさんへ

Uchikoshiさんの言う通り、受信側のプログラム
が間違っており、データをうまくうけとっていない
ためでした。

MMX,Uchikoshiさん、アドバイスをして頂
きありがとうございました。

スキルアップ/キャリアアップ(JOB@IT)