4

私たちの組み込みシステムは半二重リンク (RS485) で動作するハードウェア/レガシー システムのため、Telnet (シリアル経由) インターフェースを必要とします。はい、わかっています - いいえ、変更できません。業界はそのように好んでいます。

これに関する問題は、端末に画面いっぱいのテキストを送信している間に、ユーザーがボタンを押してデータをネットワークに送り返すことができることです。

Telnet は IAC->GA (Go Ahead) コマンドをサポートして、データの送信を開始できることをユーザー端末に通知しますが、ユーザー端末にデータの送信を停止するように指示するものについて、私が読んだ RFC のいずれにも情報がありません。画面をリフレッシュできます。

残念ながら、1973 年頃以降のすべての RFC では、SGA ( Suppress Go Ahead ) モードが使用されると想定されているため、言及されることはほとんどありません。残念ながら、プロトコル全体を実際にカバーする単一の RFC やその他のドキュメントはないようです。

telnet プロトコル (または単に Go Ahead の動作) をより完全に文書化する情報/リンクを持っている人はいますか? おそらく羊皮紙に緑色の縞模様で書かれているものもあると思います;)

再編集:なぜこのプログラミングの質問を「トピック外」で締めくくるのですか? Telnet は OSI モデルのレイヤー 7 ですよね...

4

1 に答える 1

3

ああ… RS-485… よく覚えてる!:-)

GA の定義は壊れています ( https://www.rfc-editor.org/rfc/rfc596を参照) が、パケットの分割がないため、シリアルラインの実装には問題ありません。

あなたが求めているのは「逆ブレーク」です:

「リバース ブレーク」とは、半二重パスによって端末に接続されたコンピュータが、以前にパスを放棄した後、さらにタイプアウトするためにパスの制御を取り戻すことができる手段です。

本質的に、「ブレーク」(リバースまたはその他) は半二重接続では帯域外でなければなりません。これは、いつでも送信できる必要があるためです。

編集: チャットの結果としての新しい情報: ただし、実際の送信を中断する予定がない場合 ( RFC393、リバース ブレーク ケース "b") ゴーアヘッドトークンを持つ側がハードウェアを切り替えない場合実際に送信する場合を除き (RS-485 は、データが送信されていなくても、このモードでは受信できません) 時折の破損/切り捨てられた送信が許容さ、telnet プログラムがこのかなり珍しいコーナーケースを正しく実装している場合を除き、「送信」モードにします。このコードを帯域内で送信しても問題ない場合があります。

これに対処するために私が考えることができる別の方法は、クライアント側の Telnet プログラムをハックして、送信するものが他にない場合でもサーバーに定期的に「ゴーアヘッド」パケットを送信することです。これにより、サーバーは更新を実行し、代わりに「先に進む」ことができます。それは「トークンリング」のようなものです。遅延する必要さえありません-「ゴーアヘッド」を受信すると、保留中のすべてのデータを送信し(何もない場合があります)、「ゴーアヘッド」を返します。

可能な代替ソリューション:

ser->ip デバイスも制御しているのですから、サーバーとデバイスの間に専用のプロトコルを用意してみませんか?

  • サーバーが送信するSTX data stream ETX

  • クライアント送信STX data stream ETX

  • 遅滞なく繰り返す

いずれかの側のデータ バッファーにデータがない場合はSTX ETX、相手側に「先に進む」ように効果的に伝えるペアにすぎません。250ms以内に相手から何も来なければ再送ETX

これを拡張して、エラーが検出されSTX data stream ETX CRC1 CRC2た場合にNAK(の代わりにSTX ...) 応答を返し、最後のパケット全体を再送信することで、エラー検出を行うこともできます。

于 2012-10-11T13:56:42.933 に答える