HttpWebRequest и NoDelay
От: o.kostya  
Дата: 25.06.08 11:55
Оценка:
Если использовать HttpWebRequest для небольших POST запросов, то после отправки заголовка запрос ждет некоторое время, около 200мс и отсылает данные запроса. При больших запросах данные отправляются сразу без задержки. Это похоже на описание свойства NoDelay для сокета

The Nagle algorithm reduces network traffic by causing the socket to buffer packets for up to 200 milliseconds and then combines and sends them in one packet


Каким образом можно побороть такую функциональность? А то получается маленькие запросы выполняюься 200+мс, а большие за несколько


HttpWebRequest webRequest = (HttpWebRequest) WebRequest.Create("http://");

webRequest.Method = "POST";
webRequest.ProtocolVersion = HttpVersion.Version10;

byte[] bytes = Encoding.UTF8.GetBytes(body);
webRequest.ContentLength = bytes.Length;

using (Stream requestStream = webRequest.GetRequestStream())
{
    requestStream.Write(bytes, 0, bytes.Length);
}

HttpWebResponse webResponse = (HttpWebResponse) webRequest.GetResponse();
Re: HttpWebRequest и NoDelay
От: Calabon Ниоткуда  
Дата: 25.06.08 18:48
Оценка:
Здравствуйте, o.kostya, Вы писали:

OK>

OK>The Nagle algorithm reduces network traffic by causing the socket to buffer packets for up to 200 milliseconds and then combines and sends them in one packet


IMHO, Этот веб запрос работает через тот же самый объект что и Internet Explorer, врятли есть возможность чтолибо там переделать.. для этого нужно переписать HTTP клиента на уровне сокетов.
Re: HttpWebRequest и NoDelay
От: nch  
Дата: 25.06.08 23:26
Оценка: 3 (1)
Вебклиент использует класс System.Net.Connection как абстракцию сетевого соединения — в этом классе в фукнкции StartConnectionCallback есть такое
if (!this.m_Server.UseNagleAlgorithm)
{
    socket.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.Debug, 1);
}

Где — m_Server объект типа ServicePoint, у которого в конструкторе происходит инициализация:
this.m_UseNagleAlgorithm = ServicePointManager.UseNagleAlgorithm;

А ServicePointManager.UseNagleAlgorithm — вот он:
public static bool UseNagleAlgorithm
{
    set
    {
        GetConfig();
        s_NetConfig.useNagleAlgorithm = value;
    }
}

И GetConfig:
s_NetConfig = (NetConfiguration) ConfigurationSettings.GetConfig("system.net/settings");

Короче говоря, делаете ServicePointManager.UseNagleAlgorithm = false, или можете экспериментировать с недокументированными секциями конфига (http://support.microsoft.com/kb/810814).
Re[2]: HttpWebRequest и NoDelay
От: Аноним  
Дата: 26.06.08 09:34
Оценка:
Здравствуйте, nch, Вы писали:

nch>Короче говоря, делаете ServicePointManager.UseNagleAlgorithm = false.


Спасибо, помогло!
А как достигнуть вершины шаманства и отсылать заголовок и данные одним пакетом не знаете?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.