Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
squid.doc
Скачиваний:
9
Добавлен:
01.05.2025
Размер:
1 Мб
Скачать
☆

11.51 Почему иногда я получаю ``Zero Sized Reply''?

Это случается, когда Squid устанавливает TCP-соединение с запрашиваемым сервером, но по каким-то причинам соединение закрывается до того, как Squid прочел какие-либо данные. В зависимости от различных факторов Squid может повроить запрос снова. Если вы видите сообщение о ошибке ``Zero Sized Reply'', то это значит, что Squid не может повторить попытку или все попытки закончились неудачно.

По какой причине соединение преждевременно закрывается ? Причин может быть много, включая следующие:

  1. Перегруженность запрашиваемого сервера.

  2. Ошибки в работе/реализации TCP.

  3. Race conditions with HTTP persistent connections.

  4. Ошибки или неверная настройка NAT, файерволов или распределителей нагрузки (load-balancers).

  5. DOS-атаки (отказ в обслуживании).

Вы можете воспользоваться tcpdump, чтобы определить и отследить проблему.

Некоторые пользователи верят, что проблема связана с очень большими кукисами. В одном из отчетов пользователей говориться, что проблема с Zero Sized Reply исчезла после того, как он указал своему Internet Explorer не принимать кукисы из третих рук (third-party cookies).

Ниже приведены некторые способы, которые вы можете поробовать, чтобы уменьшить частоту появления ошибки Zero Sized Reply:

  1. Удалите или переименуйте cookie-файл и настройте ваш броузер, что бы он запрашивал у вас разрешения на прием любых новых cookies.

  2. Выключите устойчивые соединения HTTP в директивах server_persistent_connections и client_persistent_connections.

  3. Выключите все дополнительные возможности TCP на вашей системе со Squid. Выключите ECN на Linux командой echo 0 > /proc/sys/net/ipv4/tcp_ecn/.

Если эта ошибка является серьезной проблемой для вас, то разработчики Squid будут рады вам помочь решить эту проблему. Однако мы будем требовать очень качественной отладочной информации от вас, т.к. вывод tcpdump, IP-адреса серверов, версию операционной системы, и файл access.log с полными заголовками HTTP.

Если вы хотите заставить Squid выдать ошибку Zero Sized по вашему требованию, вы можете использовать короткую программу на C, приведенную ниже. Просто откомпилируйте и запустите программу на системе, которая не имеет уже запущенного сервера на порту 80. Потом поробуйте соединиться к этому мнимоу серверу через Squid:

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <assert.h>

int

main(int a, char **b)

{

struct sockaddr_in S;

int s,t,x;

s = socket(PF_INET, SOCK_STREAM, 0);

assert(s > 0);

memset(&S, '\0', sizeof(S));

S.sin_family = AF_INET;

S.sin_port = htons(80);

x = bind(s, (struct sockaddr *) &S, sizeof(S));

assert(x == 0);

x = listen(s, 10);

assert(x == 0);

while (1) {

struct sockaddr_in F;

int fl = sizeof(F);

t = accept(s, (struct sockaddr *) &F, &fl);

fprintf(stderr, "accpeted FD %d from %s:%d\n",

t, inet_ntoa(F.sin_addr), (int)ntohs(F.sin_port));

close(t);

fprintf(stderr, "closed FD %d\n", t);

}

return 0;

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]