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

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

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

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

P.S. Да, на сервере.
...
Рейтинг: 0 / 0
17.06.2011, 14:31
    #37312966
CSharpHelp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Естественное пакетирование TCP/IP
[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
17.06.2011, 16:35
    #37313228
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Естественное пакетирование TCP/IP
CSharpHelpКак я понимаю, если отправляющая сторона отдает данные сразу (по крайней мере так утверждает техподдержка)Если вам так критичны 200 мс, то заставьте техподдержку эскалировать проблему на разработчика.
Как вам уже объяснили, IP-стек выполняет, помимо прочего, буферизацию данных (любого) приложения.
Немедленную отправку без (дополнительных) усилий со стороны программиста обеспечивает UDP. TCP - сам решает, когда передавать данные.
...
Рейтинг: 0 / 0
17.06.2011, 17:55
    #37313388
CSharpHelp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Естественное пакетирование TCP/IP
Basil A. SidorovЕсли вам так критичны 200 мс, то заставьте техподдержку эскалировать проблему на разработчика. Как вам уже объяснили, IP-стек выполняет, помимо прочего, буферизацию данных (любого) приложения. Немедленную отправку без (дополнительных) усилий со стороны программиста обеспечивает UDP. TCP - сам решает, когда передавать данные.
У меня в распоряжении есть стандартное API, которое предусматривает передачу только посредством TCP. Ради меня одного API переделывать не будут.

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

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

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

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

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


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