powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Windows [игнор отключен] [закрыт для гостей] / Естественное пакетирование TCP/IP
12 сообщений из 12, страница 1 из 1
Естественное пакетирование TCP/IP
    #37310599
CSharpHelp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть некое локальное приложение, которое посредством интернет получает данные с удаленного сервера. Эти данные я забираю через API этого приложения. Все стабильно работает, но есть одна проблема - данные приходят дискретно, каждые 200 мс. Т.е. мне нужно получать строки данных по одной, сразу после выхода их на сервере. Вместо этого я имею группы строк каждые 200 мс. Техподдержка API утверждает, что они данные не задерживают, а дискретность получается, как они выразились, вследствие "естественного пакетирования данных TCP/IP". Дескать, если между нами пинг примерно 200 мс, то протокол TCP/IP работает так, что сначала накапливает, затем отдает, и единственный способ сократить интервал передачи - это уменьшить пинг (что в моем случае невозможно).

Приложение пробовал запускать на разных компьютерах: XP Pro SP2 и Win 7 HP SP1. Если кто сталкивался с подобным, просьба дать совет, как все это исправить. И насколько обоснованно утверждение про "естественное пакетирование"?
...
Рейтинг: 0 / 0
Естественное пакетирование TCP/IP
    #37310672
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CSharpHelpИ насколько обоснованно утверждение про "естественное пакетирование"?

Скорее всего имеется в виду Nagle algorithm, отключаемый опцией сокета TCP_NODELAY. Так
что утверждение о его "естественности" вполне обоснованно, а вот об их неспособности на
это повлиять - нет.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Естественное пакетирование TCP/IP
    #37310807
Фотография Anatoly Podgoretsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну так разбивай и склеивай на приемной стороне. Это легко раз речь о строках.
...
Рейтинг: 0 / 0
Естественное пакетирование TCP/IP
    #37311002
CSharpHelp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovСкорее всего имеется в виду Nagle algorithm, отключаемый опцией сокета TCP_NODELAY. Так
что утверждение о его "естественности" вполне обоснованно, а вот об их неспособности на
это повлиять - нет.
Значит если на стороне сервера Nagle algorithm включен, то на своей стороне я не смогу воспользоваться опцией TCP_NODELAY?

Anatoly PodgoretskyНу так разбивай и склеивай на приемной стороне. Это легко раз речь о строках.
Разбить или склеить не проблема. Проблема в том, что строки доставляются с задержкой, от которой нужно избавиться.
...
Рейтинг: 0 / 0
Естественное пакетирование TCP/IP
    #37311508
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CSharpHelpПроблема в том, что строки доставляются с задержкой, от которой нужно избавиться.Приложение может отправлять данные немедленно.
Сокеты, в этом смысле, ничем не отличаются от файловых буферов: нужна немедленная отправка - используйте flush.

P.S. Да, на сервере.
...
Рейтинг: 0 / 0
Естественное пакетирование TCP/IP
    #37312966
CSharpHelp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot Basil A. Sidorov]CSharpHelpнужна немедленная отправка - используйте flush.
Но ведь отправка не на моей стороне, а на стороне удаленного сервера, который я не могу контролировать.

Как я понимаю, если отправляющая сторона отдает данные сразу (по крайней мере так утверждает техподдержка), то нужно разобраться, почему принимающая сторона (мой компьютер) накапливает, а потом с определенной периодичностью отдает. Отключить Nagle algorithm пробовал - эффект = 0. Ниже привожу часть кода на C#, отвечающего за доставку данных. Может у меня с кодом не все правильно?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
private void WaitForData(string sSocketName)
        {
            if (sSocketName.Equals("Level1"))
            {
                // make sure we have a callback created
                if (m_pfnLevel1Callback == null)
                {
                    m_pfnLevel1Callback = new AsyncCallback(OnReceive);
                }
                // send the notification to the socket.  It is very important that we dont call Begin Reveive more than once per call
                // to EndReceive.  As a result, we set a flag to ignore multiple calls.
                if (m_bLevel1NeedBeginReceive)
                {
                    m_bLevel1NeedBeginReceive = false;
                    // we pass in the sSocketName in the state parameter so that we can verify the socket data we receive is the data we are looking for
                    m_sockLevel1.BeginReceive(m_szLevel1SocketBuffer, 0, m_szLevel1SocketBuffer.Length, SocketFlags.None, m_pfnLevel1Callback, sSocketName);
                }
            }
        }
        /// <summary>
        /// OnReceive is our Callback that gets called by the .NET socket class when new data arrives on the socket
        /// </summary>
        /// <param name="asyn"></param>
        private void OnReceive(IAsyncResult asyn)
        {
            // first verify we received data from the correct socket.  This check isn't really necessary in this example since we 
            // only have a single socket but if we had multiple sockets, we could use this check to use the same callback to recieve data from
            // multiple sockets
            if (asyn.AsyncState.ToString().Equals("Level1"))
            {
                // read data from the socket.
                int iReceivedBytes = 0;
                iReceivedBytes = m_sockLevel1.EndReceive(asyn);
                // set our flag back to true so we can call begin receive again
                m_bLevel1NeedBeginReceive = true;
                // in this example, we will convert to a string for ease of use.
                string sData = Encoding.ASCII.GetString(m_szLevel1SocketBuffer, 0, iReceivedBytes);

                // call wait for data to notify the socket that we are ready to receive another callback
                WaitForData("Level1");
            }
        }

...
Рейтинг: 0 / 0
Естественное пакетирование TCP/IP
    #37313228
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CSharpHelpКак я понимаю, если отправляющая сторона отдает данные сразу (по крайней мере так утверждает техподдержка)Если вам так критичны 200 мс, то заставьте техподдержку эскалировать проблему на разработчика.
Как вам уже объяснили, IP-стек выполняет, помимо прочего, буферизацию данных (любого) приложения.
Немедленную отправку без (дополнительных) усилий со стороны программиста обеспечивает UDP. TCP - сам решает, когда передавать данные.
...
Рейтинг: 0 / 0
Естественное пакетирование TCP/IP
    #37313388
CSharpHelp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. SidorovЕсли вам так критичны 200 мс, то заставьте техподдержку эскалировать проблему на разработчика. Как вам уже объяснили, IP-стек выполняет, помимо прочего, буферизацию данных (любого) приложения. Немедленную отправку без (дополнительных) усилий со стороны программиста обеспечивает UDP. TCP - сам решает, когда передавать данные.
У меня в распоряжении есть стандартное API, которое предусматривает передачу только посредством TCP. Ради меня одного API переделывать не будут.

Вы пишите, что TCP сам решает, когда передавать данные. Пусть так, но ведь должен быть алгоритм принятия этих решений.

Поток данных небольшой, а скорость стоит на первом месте. Вроде выходом должно быть отключение Nagle, с тем чтобы подтверждения о доставке пакетов отправлялись сразу же (по умолчанию интервал 200 мс). Это должно увеличить трафик, но убрать агрегирование пакетов. Ставил TcpAckFrequency=1, TCPNoDelay=1 или на сокет .NoDelay = true, также пробовал TcpDelAckTicks=0, но почему то не получил никакого эффекта. В общем продолжаю оставаться в недоумении: данные вроде уже у меня, но оперативно снять их я не могу :(
...
Рейтинг: 0 / 0
Естественное пакетирование TCP/IP
    #37313767
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CSharpHelpВ общем продолжаю оставаться в недоумении: данные вроде уже у меня, но оперативно снять их я не могу :(Вы хорошо подумали, когда ставили опции на принимающей стороне?
После того, как данные приняты IP-стеком, приложение получит их немедленно (кванты времени и т.п. фигню не учитываем, deffered accept - не наш случай).

P.S. На бирже, что ли играете?
...
Рейтинг: 0 / 0
Естественное пакетирование TCP/IP
    #37315016
CSharpHelp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. SidorovВы хорошо подумали, когда ставили опции на принимающей стороне? После того, как данные приняты IP-стеком, приложение получит их немедленно (кванты времени и т.п. фигню не учитываем, deffered accept - не наш случай).
Я, откровенно говоря, совсем не думал, т.к. в этих вопросах разбираюсь слабо. Поэтому и решение пытался найти перебором вариантов, которые смог отыскать в интернете. В этом форуме написал, поскольку знаю, что здесь можно получить квалифицированную помощь. Насчет биржи Вы правы: это API одного из зарубежных биржевых датафидов.

P.S. Пока так и не понял, можно ли что-то изменить на моей стороне, чтобы избавиться от задержек.
...
Рейтинг: 0 / 0
Естественное пакетирование TCP/IP
    #37315043
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CSharpHelpP.S. Пока так и не понял, можно ли что-то изменить на моей стороне, чтобы избавиться от
задержек.

Ничего нельзя изменить на твоей стороне. Точка. Так понятно?
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Естественное пакетирование TCP/IP
    #37319421
CSharpHelp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще раз поговорил с техподдержкой API. Говорят, что с их стороны отключен Nagle. Может быть все же у меня неправильные настройки Windows?
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Windows [игнор отключен] [закрыт для гостей] / Естественное пакетирование TCP/IP
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]