3

確立された SSL 接続を介して byte[] () を送信しようとしています (ハンドシェイクなどが行われます)。

結果: byte[] が 2 つのパケットに吐き出されます (以下のデバッグを参照)。

  • 最初のパケット: アプリケーション データの最初のバイトのみ ( ** 01 ** ) 。
  • 2 番目のパケット: 残り (fe db 01 00 ...) 650 バイト

すべてのアプリケーション データ バイトを 1 つのパケットにコミットする方法はありますか?

651 バイトを送信するストリーム:

**01** fe db 01 00 00 02 83 3c 3f 78 6d 6c 20 76 65 72 73 69 6f 6e 3d 22 31 2e 30 22 20 65 6e 63 6f 64 69 6e 67 3d 22 75 73 2d 61 73 63 69 69 22 20 73 74 61 6e 64 61 6c 6f 6e 65 3d 22 6e 6f 22 3f 3e …

javax.net.debug の出力

Padded plaintext before ENCRYPTION:  len = 32
0000: **01** 06 03 06 46 7F 7F AE   D4 E8 30 5D B7 DB 3C 44  ....F.....0]..<D
0010: 02 08 C9 2A A1 0A 0A 0A   0A 0A 0A 0A 0A 0A 0A 0A  ...*............
1, WRITE: TLSv1 Application Data, length = 32
[Raw write]: length = 37
0000: 17 03 01 00 20 B3 4E EE   CE 5B 69 EC A5 4A 80 7F  .... .N..[i..J..
0010: D6 03 35 AF 6A 7B 85 17   B7 46 A2 31 B2 EF 7E D0  ..5.j....F.1....
0020: EA 1B 67 7E ED                                     ..g..
Padded plaintext before ENCRYPTION:  len = 672
0000: FE DB 01 00 00 02 83 3C   3F 78 6D 6C 20 76 65 72  .......<?xml ver
0010: 73 69 6F 6E 3D 22 31 2E   30 22 20 65 6E 63 6F 64  sion="1.0" encod
0020: 69 6E 67 3D 22 75 73 2D   61 73 63 69 69 22 20 73  ing="us-ascii" s
0030: 74 61 6E 64 61 6C 6F 6E   65 3D 22 6E 6F 22 3F 3E  tandalone="no"?>
[…]
4

3 に答える 3

1

byte[]相手側で書いたのとまったく同じように読んでいると仮定するのは、古典的な TCP の間違いです。実際には SSL/TLS に固有のものではありませんが、TCP 接続でも発生する可能性があります。

TCP (および SSL/TLS) では、リーダーのバッファーがライターのバッファー内のパケットとまったく同じパケット長で満たされるという保証はありません。すべての TCP 保証は順序どおりの配信であるため、最終的にはすべてのデータを取得できますが、ストリームとして扱う必要があります。

これが、TCP を使用するプロトコルがインジケーターと区切り文字に依存して、特定のメッセージの読み取りを停止するタイミングを相手に伝える理由です。

たとえば、HTTP 1.1 は空白行を使用してヘッダーが終了するタイミングを示し、Content-Lengthヘッダーを使用して受信者に予想されるエンティティの長さ (またはチャンク転送エンコーディング) を伝えます。SMTP はまた.、メッセージの最後に改行を使用します。

独自のプロトコルを設計している場合は、データの意味のある単位として定義したものがいつ区切られるかを受信者が知る方法を定義する必要があります。データを読み取るときは、そのようなインジケーターを読み取り、期待するバイト数を取得するか、定義した区切り文字が見つかるまで、読み取りバッファーに入力します。

于 2012-11-23T13:42:55.137 に答える
0

このページを見るまで、私は同じ問題を抱えていました: http://bugs.java.com/bugdatabase/view_bug.do?bug_id=7157903

そのため、-Djsse.enableCBCProtection=false パラメーターを指定して JVM を実行すると、データが分割されなくなりました。

よろしくお願いします

于 2015-01-14T11:40:14.843 に答える