2010-08-18 3 views
4

자바에서 SSL 서버를 만들기 위해 org.apache.commons.ssl을 사용하고 있습니다. 나는 이상한 문제에 직면 해있다. SSL 스트림을 통해 500KB의 데이터를 보내고 클라이언트 측에서 500KB의 데이터를 수신하지만 TCP 연결을 통해 전송 된 데이터는 20 배 더 커진다. 그 원인은 무엇일까요? SSL 매개 변수의 잘못된 구성?자바에서 SSL 과체중

테스트를 위해 신뢰할 수있는 실제 SSL 인증서를 사용하고 있습니다. Wireshark로 SSL 스트림을 스니핑하고 디코드하려했지만 작동하지 않아 디코딩 된 데이터를 볼 수 없었습니다. 아니면 스트림이 둘 이상의 패스로 인코딩 되었습니까? TCP 패킷은 각각 1525 바이트입니다. 내가 볼 수 있듯이 비정상적인 것은 없습니다.

누군가가 아이디어를 가지고 있다면 ... 감사! Olivier

+0

얼마나 자주 스트림에서 'flush()'를 호출합니까? 데이터를 쓰는 코드를 소켓에 게시 할 수 있습니다. – erickson

답변

1

재협상은 20 배 폭발을 설명하지 않습니다. SSL 소켓의 출력 스트림 에서 양방향으로 BufferedOutputStreams을 사용하고 있습니까? 즉 서버 클라이언트에서? 버퍼링 된 출력을 사용하지 않고 코드가 한 번에 1 바이트 씩 작성하면 SSL 레코드 프로토콜로 인해 40 배의 폭발을 볼 수 있으며 기하학적으로 TCP 세그먼트 오버 헤드로 인해 40x 폭발이 발생합니다. 후자는 일반적으로 Nagle 알고리즘에 의해 완화되지만 일부 사람들은 이것을 꺼버 릴 것입니다.

3

한 번에 한 바이트 씩만 보내는 것처럼 들립니다. 오버 헤드는 TCP/IP 패킷 캡슐화입니다.

+0

오버 헤드는 SSL 레코드 캡슐화입니다. 맞습니까? 각 SSL 레코드의 응용 프로그램 데이터 1 바이트. – erickson

+0

수 있습니다. 나는 SSL의 내부에 익숙하지 않다. –

+0

안녕하세요, 그게 제가 먼저 알아야 할 것이지만, 사실이 아닙니다. 소켓에 대한 쓰기는 SSL 소켓을 통해 BufferedOutputStream을 사용하여 수행되며 flush() 메서드는 500K가 작성된 후 한 번 호출됩니다. Wireshark를 사용하면 각 TCP 패킷이 약 1400 바이트 (정확한 숫자를 기억할 수 없음)임을 알 수있었습니다. 문제는 한 방향으로 만 발생하는 것으로 보입니다. 서버에서 클라이언트로 (다운로드)가 아닌 클라이언트에서 서버로 (업로드) 나타납니다. openssl을 사용하여 쉘에서 내 응용 프로그램을 테스트하면 "renegociation"에 대한 이상한 내용이 나타납니다. 어떤 생각? 감사 ! – Antares

0

@EJP : 당신 말이 맞았 어, 내 코드에서 실수를 : 나는 대신 SomeStuffOutputStream 주위 BufferedOuputStream 포장의하는 BufferedOuputStreamSomeStuffOutputStream 주위에 포장되었다. BufferedOuputStream은 원시 소켓의 OutputStream 바로 위에있는 가장 낮은 레벨에 있어야합니다.

이제 완벽하게 작동합니다.

오해이었습니다. SSL 프로토콜 항목 때문에 "정상적인"패킷 크기를 본 이유를 이해하기 시작했습니다. 다음에 더 조심하겠습니다 :)

감사합니다.

+1

이 설명은 전통적으로 원래 질문의 편집으로 진행되며 별도의 대답으로 진행되지 않습니다. –