2010-12-07 3 views
0

Я пишу прокси-сервер, который проксирует SSL-соединения, и все работает отлично для обычного трафика. Однако, когда есть большая передача файлов (Anything over 20KB), такая как вложение электронной почты, соединение восстанавливается на уровне TCP до того, как файл будет записан. Я использую неблокирующий IO, и я создаю поток для каждого конкретного соединения.Как обрабатывать соединение SSL преждевременное закрытие

Когда соединение приходит мне сделать следующее:

  • нерест нить
  • Подключение к клиенту (незашифрованном) и прочитать запрос на соединение (все остальные запросы игнорируются)
  • Создать безопасное соединение (SSL с помощью openssl api) на сервер
  • Сообщите клиенту, что мы связались с сервером (незашифрованным)
  • Создайте защищенное соединение с клиентом и начните проксирование данных между два с использованием цикла выбора, чтобы определить, когда могут произойти чтение и запись.
  • После того, как базовые сокеты будут закрыты или произойдет ошибка, соединение будет закрыто, а поток будет завершен.

Как я уже сказал, это отлично подходит для данных обычного размера (обычные веб-страницы и т. Д.), Но не удается, как только файл слишком велик с кодом ошибки (в зависимости от используемого веб-приложения) или Ошибка: соединение прерывается.

Я понятия не имею, что вызывает закрытие соединения, независимо от того, что это TCP, HTTP или SSL, и я не могу найти никакой информации об этом вообще. В некоторых браузерах он начнет работать, если я поставлю оператор сна сразу после SSL_write, но это, похоже, вызывает другие проблемы в других браузерах. Сон не должен быть длинным, на самом деле просто задержка. В настоящее время у меня установлено 4 мс на запись и 2 мс на чтение, и это полностью исправляет его в старых firefox, хром с HTTP-загрузками и опера.

Любые провода будут оценены и дайте мне знать, если вам нужна дополнительная информация. Заранее спасибо!

-Sam

+0

Думаю, вам нужно будет опубликовать код, чтобы продемонстрировать проблему. – caf 2010-12-08 04:06:05

ответ

0

Если веб-приложение думает, что загруженный файл слишком велик, что он делает? Если он имеет право только закрыть соединение, это вызовет ECONN у отправителя: «Сброс соединения». Независимо от того, что он делает, когда вы пишете прокси-сервер и считаете, что в вашем коде нет ошибок, которые вызывают это, ваша миссия состоит в том, чтобы отразить все, что происходит с вашим восходящим соединением, назад вниз по нисходящему соединению. В этом случае ответ заключается в том, чтобы просто делать то, что вы делаете: закрыть восходящие и нисходящие сокеты. Если у вас есть входящий close_notify с сервера, сделайте упорядоченный SSL рядом с клиентом; если вы получили ECONN, просто закройте клиентский сокет напрямую, минуя SSL.

+0

Я отравляю поведение выше по течению в прокси-сервере, за исключением этого. Нет причин для закрытия соединения, и, как я должен был опубликовать базовые отчеты сокета errno 0 (успех) каждый раз, когда прокси-сервер попадает в SSL_ERROR_SYSCALL в моем обработчике ошибок. В документации говорится, что это скорее всего неожиданный EOF, который указывает на нечистое завершение работы, но сервер не отключил соединение. – 2010-12-09 15:57:11

Смежные вопросы