2010-12-07 6 views
0

SSL 연결을 프록시하는 프록시 서버를 작성하고 있으며 정상적인 트래픽에 대해서는 모두 정상적으로 작동합니다. 그러나 전자 메일 첨부 파일과 같이 큰 파일 전송 (20KB 이상의 모든 것)이 있으면 파일 작성이 완료되기 전에 TCP 수준에서 연결이 재설정됩니다. 난 비 차단 입출력을 사용하고 각 특정 연결에 대한 스레드를 산란 오전. SSL 연결 조기 종단 처리 방법

연결이 다음 작업을 수행 할로 제공

:

  • 스폰 스레드 클라이언트에
  • 연결 (암호화되지 않은) 및 연결 요청 (다른 모든 요청은 무시됩니다)
  • 만들기를 읽고 서버에 연결 보안 (openssl api를 사용하는 SSL)
  • 클라이언트에게 우리가 서버에 연락했음을 알리기 (암호화되지 않음)
  • 클라이언트에 보안 연결을 생성하고 두 개는 select 루프를 사용하여 읽기 및 쓰기가 발생할 때를 결정합니다.
  • 기본 소켓이 닫히거나 오류가 발생하면 연결이 닫히고 스레드가 종료됩니다.

나는 정상적인 크기의 데이터 (일반 웹 페이지 및 기타 사항)에 적합하지만 파일이 너무 커서 오류 코드 (사용되는 webapp에 따라 다름) 또는 오류 : 연결이 중단되었습니다.

TCP, HTTP 또는 SSL과 관련하여 무엇이 연결을 닫는 지 전혀 알지 못합니다. 정보를 찾을 수 없습니다. 일부 브라우저에서는 SSL_write 직후 절전 명령문을 넣으면 작동하지만 다른 브라우저에서는 다른 문제가있는 것으로 보입니다. 수면은 길지 않아도되고, 실제로는 지연 될 수 있습니다. 현재 쓰기 당 4ms, 읽기 당 2ms로 설정되어 있으며 이전 Firefox, HTTP 업로드가있는 Chrome 및 오페라에서 완전히 수정되었습니다.

모든 리드가 도움이 될 것이며 더 자세한 정보가 필요하면 알려 주시기 바랍니다. 고마워요!

- 샘

+0

문제를 설명하기 위해 몇 가지 코드를 게시해야한다고 생각합니다. – caf

답변

0

은 웹 응용 프로그램은 업로드 된 파일이 할 무엇 너무 큰 생각한다면? 연결을 종료 할 권한이 있으면 보낸 사람에게 '연결 재설정'이라는 ECONN이 발생합니다. 그것이 무엇이든, 프록시를 작성하고 코드에서이 문제의 원인이되는 버그가 없다고 가정 할 때, 당신의 임무는 업스트림 연결에 어떤 일이 발생하더라도 다운 스트림 연결을 되돌아 가도록 미러링하는 것입니다. 이 경우 대답은 현재 수행중인 작업을 수행하는 것입니다. 업스트림 및 다운 스트림 소켓을 닫습니다. 서버에서 들어오는 close_notify가 있으면 클라이언트에 질서 정연한 SSL을 수행하십시오. ECONN을 얻었 으면 SSL을 거치지 않고 클라이언트 소켓을 직접 닫으십시오.

+0

이 경우를 제외하고 프록시의 업스트림 동작을 미러링합니다. 연결을 닫을 이유는 없으며 프록시가 내 오류 처리기에서 SSL_ERROR_SYSCALL에 도달 할 때마다 기본 소켓에 0 (성공)을보고합니다. 설명서에 따르면이 문제는 예상치 못한 EOF로 인해 부정한 종료가 발생했음을 나타내지 만 서버가 연결을 종료하지 않았습니다. –

+0

* some * 오류가 있었음에 틀림없지 만, 복제본을 다운 스트림으로 복제해야합니다. – EJP