- PR -

localhostへのtelnetdへ接続時のパケットが細切れ

1
投稿者投稿内容
ペンギン
常連さん
会議室デビュー日: 2003/11/06
投稿数: 39
投稿日時: 2007-05-23 00:52
いつもお世話になっております。

Red Hat Enterprise Linux ASの環境下で開発をしています。
Telnet通信を行うモジュールを利用しているので、
in.telnetdをxinetd下で動かして
localhostをサーバシミュレータにしているのですが、
localhostで通信を行うとクライアントモジュールが
sendしたコマンドが1パケット1文字ずつエコーされてしまい
非常に都合が悪いです(クライアント側がreceiveを
大量に繰り返さなければならない)。

これをなんとかsendしたコマンドを1パケットで返させるか、
もしくは少ないパケット数で返却させることはできませんでしょうか?

※telnetコマンドでset echo onとかmode lineとか試しましたが解決せず…
※接続確率時に、DO ECHO->WONT ECHO/WILL ECHO->DONT ECHOとやり取りされてます
※ログ等の開示できないこと予めお詫びします
ペンギン
常連さん
会議室デビュー日: 2003/11/06
投稿数: 39
投稿日時: 2007-05-23 07:46
追記です。
サーバ側ポートは23を使用しています。
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2007-05-23 09:32
telnetdはNagleアルゴリズムを無効にしているはずです。
http://www.kt.rim.or.jp/~ksk/sock-faq/unix-socket-faq-ja-2.html#ss2.11

SOCK_STREAMなソケットにパケットなんて概念はありませんし、
recv()は読み出せるデータがあればブロックせずに復帰します。

相手が複数回に分けてsend()したものをまとめて受信する場合もあれば、
1回でsend()されたものを複数回に分けて受信する場合もあります。

引用:

ペンギンさんの書き込み (2007-05-23 00:52) より:
sendしたコマンドが1パケット1文字ずつエコーされてしまい
非常に都合が悪いです(クライアント側がreceiveを
大量に繰り返さなければならない)。


試しにrecv()を呼ぶ前にsleep(1)などの待機を入れてみて下さい。
複数のデータをまとめてrecv()できるようになると思います。
これはNagleアルゴリズムの逆みたいなものです。

引用:

これをなんとかsendしたコマンドを1パケットで返させるか、
もしくは少ないパケット数で返却させることはできませんでしょうか?


少ないパケット数で返させたいのは何故ですか?
ネットワーク効率のためですよね。

でも、telnetからECHOで返ってくるのは、
通常はキーボードからユーザーが入力した文字です。
人間はネットワークの帯域を食い潰すほど速く入力できません。
angel
ぬし
会議室デビュー日: 2005/03/17
投稿数: 711
投稿日時: 2007-05-23 09:50
おはようございます。
in.telnetdはあくまでシミュレータの位置づけで、実環境ではlinemodeでの処理を行うようなプログラムを動かすということでしょうか?
telnetd(8)によれば、
引用:
"DO LINEMODE"
telnetd が linemode をサポートする設定でコンパイルされている場合にのみ送信され、クライアントに行単位の処理を行うことを要求する。


とあります。
デフォルトでは、linemodeは使えない可能性がありそうです。その場合はtelnetdパッケージをrebuildしてみる手はあるかもしれません。

[ メッセージ編集済み 編集者: angel 編集日時 2007-05-23 09:58 ]
ペンギン
常連さん
会議室デビュー日: 2003/11/06
投稿数: 39
投稿日時: 2007-05-24 07:36
あしゅさん、angelさん、レスありがとうございます。
返答が遅くて申し訳ないです。

利用していると言うこちらの書き方が不明瞭で申し訳なかったのですが、
私どもの状況を整理させていただきますと、

[A:私達のモジュール]−(利用)−[B:telnetクライアント]…(telnet)…[C:他社さんの製品]

という状況で、Bは半製品で改修不可、Cは未入手のためtelnetdで
シミュレートしていると言う状態です。
(※Cへの疎通は行っているので、Cがtelnetdのように細切れの応答を
  しないことは確認しています。)
なので、私達が介入できるポイントとしては
1.Aから渡してBが送信するtelnetの電文
2.telnetサーバデーモンの設定または入れ替え
のみで、かつインフラ関連を変更するのは手続き面で手間がかかる状況です。


引用:

あしゅさんの書き込み (2007-05-23 09:32) より:
少ないパケット数で返させたいのは何故ですか?
ネットワーク効率のためですよね。


実はtelnetクライアント(B)の都合です。
receiveの最大回数を極大まで増加させると別の部分で不都合が出るので
できれば実際の対向(C)へつなぐのに十分な値と同値を使用したいと…。
開発環境なので今のところネットワーク効率は
あまり考えなくてもいい状態です。

引用:

でも、telnetからECHOで返ってくるのは、
通常はキーボードからユーザーが入力した文字です。
人間はネットワークの帯域を食い潰すほど速く入力できません。


あいまいな記憶で申し訳ないんですが、
ユーザが入力した文字をECHOしない状態ってありませんでしたっけ?
それが理想なんです。

Nagleアルゴリズムについては勉強になりました。

引用:

angelさんの書き込み (2007-05-23 09:50) より:
デフォルトでは、linemodeは使えない可能性がありそうです。その場合はtelnetdパッケージをrebuildしてみる手はあるかもしれません。


確かにtelnetdのマニュアルを見て嫌な感じは受けていました…。
電文での解決(1)の可能性をもう少し探って、無理であれば
インフラ担当者に相談してみたいと思います。
1

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