2014-11-10 9 views
1

나는Java 소켓에서 SSL 소켓에 기록 할 수있는 데이터의 최대 한도는 얼마입니까?

OutputStrem os = ssl_Socket.getOutputStream(); 

OS 여기의 OutputStream입니다 그것에서 인스턴스를 OutputStream에 복용하여 한 번에 SSL 소켓 약 10,000 바이트를 쓰고 있어요. 그것은 데이터를 서버에 성공적으로 기록하지만 서버 끝에서받은 데이터가 어떻게 든 손상됩니다.

그러나 BufferedOutputStream을 사용하면 everthing이 잘 작동합니다.

os = new BufferedOutputStream(c._s.getOutputStream(), 8196); 

내 질문 :

  1. 한 번에 SSL 소켓에 기록 할 수있는 데이터에 어떤 제한이 있습니까?
    기본 버퍼 크기가 있습니까?
  2. 왜 BufferedOutputStream과 함께 성공적으로 작동 했습니까? 데이터의 큰 덩어리를 작성해야하므로 BufferedOutputStream을 사용하고 싶지 않습니다.
+0

데이터가 정확히 어떻게 손상 되었습니까? 다른 쪽에서 어떻게 읽습니까? – Bruno

답변

-1

"[TLS]는 2^14 바이트의 고정 된 최대 일반 텍스트 조각 길이를 지정합니다." - 16K입니다.

블록의 크기를 제한 할 수있는 "max_fragment_length"TLS 확장 정보를 읽으십시오.

추신 : 자바 SSL 라이브러리에 익숙하지 않은 경우가 있습니다. 구체적인 내용이있을 수 있습니다.

+0

7K에서 잘 작동하며, 약 10k 데이터가 조정됩니다. – Akhilesh

+1

송신 측이 정상 종료 되었습니까 (소켓이 닫혀 있고 모든 데이터가 전송되었습니다)? 송신자와 수신자 측에서 데이터를 감지하여 모든 데이터가 전송되는지 확인하십시오. – i486

1

SSL 소켓에 한 번에 쓸 수있는 데이터에는 제한이 있습니까?

Integer.MAX_VALUE 이외의 제한이 없습니다. SSLSocket의 출력 스트림은 필요한 모든 기본 SSL 레코드에 암호화 및 패키징을 포함하여 모든 데이터가 전송 될 때까지 차단됩니다.

기본 버퍼 크기가 있습니까?

BufferedOutputStream는 버퍼 크기에 사용할 호기심 번호는 8192 8196의 기본 버퍼 크기를 가지고 있지만, 당신은 확실히 항상 SSLSocket의 출력 스트림을 통해 버퍼 스트림 또는 작가를 사용해야합니다. 그렇지 않으면 한 번에 한 바이트 씩 쓸 경우 최대 42 배의 데이터 폭발이 발생할 수 있습니다.

BufferedOutputStream에서 왜 성공적으로 작동 했습니까? 데이터의 큰 덩어리를 작성해야하므로 BufferedOutputStream을 사용하고 싶지 않습니다.

큰 덩어리의 데이터를 작성하는 경우에도 BufferedOutputStream을 사용할 필요는 없지만 해를 끼치 지 않습니다. 가능한 경우 버퍼가 바이 패스됩니다.

귀하의 문제는 거의 확실하게 수신 측에 있습니다.

+0

서버에 쓰기 전에 파일에 데이터를 쓰는 SpyOutputStream을 만들었습니다. 파일에 기록 된 데이터가 이상하게 동일합니다. – Akhilesh

관련 문제