|
|
|
Естественное пакетирование TCP/IP
|
|||
|---|---|---|---|
|
#18+
Есть некое локальное приложение, которое посредством интернет получает данные с удаленного сервера. Эти данные я забираю через API этого приложения. Все стабильно работает, но есть одна проблема - данные приходят дискретно, каждые 200 мс. Т.е. мне нужно получать строки данных по одной, сразу после выхода их на сервере. Вместо этого я имею группы строк каждые 200 мс. Техподдержка API утверждает, что они данные не задерживают, а дискретность получается, как они выразились, вследствие "естественного пакетирования данных TCP/IP". Дескать, если между нами пинг примерно 200 мс, то протокол TCP/IP работает так, что сначала накапливает, затем отдает, и единственный способ сократить интервал передачи - это уменьшить пинг (что в моем случае невозможно). Приложение пробовал запускать на разных компьютерах: XP Pro SP2 и Win 7 HP SP1. Если кто сталкивался с подобным, просьба дать совет, как все это исправить. И насколько обоснованно утверждение про "естественное пакетирование"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2011, 11:36 |
|
||
|
Естественное пакетирование TCP/IP
|
|||
|---|---|---|---|
|
#18+
CSharpHelpИ насколько обоснованно утверждение про "естественное пакетирование"? Скорее всего имеется в виду Nagle algorithm, отключаемый опцией сокета TCP_NODELAY. Так что утверждение о его "естественности" вполне обоснованно, а вот об их неспособности на это повлиять - нет. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2011, 12:05 |
|
||
|
Естественное пакетирование TCP/IP
|
|||
|---|---|---|---|
|
#18+
Ну так разбивай и склеивай на приемной стороне. Это легко раз речь о строках. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2011, 12:45 |
|
||
|
Естественное пакетирование TCP/IP
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovСкорее всего имеется в виду Nagle algorithm, отключаемый опцией сокета TCP_NODELAY. Так что утверждение о его "естественности" вполне обоснованно, а вот об их неспособности на это повлиять - нет. Значит если на стороне сервера Nagle algorithm включен, то на своей стороне я не смогу воспользоваться опцией TCP_NODELAY? Anatoly PodgoretskyНу так разбивай и склеивай на приемной стороне. Это легко раз речь о строках. Разбить или склеить не проблема. Проблема в том, что строки доставляются с задержкой, от которой нужно избавиться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2011, 13:56 |
|
||
|
Естественное пакетирование TCP/IP
|
|||
|---|---|---|---|
|
#18+
CSharpHelpПроблема в том, что строки доставляются с задержкой, от которой нужно избавиться.Приложение может отправлять данные немедленно. Сокеты, в этом смысле, ничем не отличаются от файловых буферов: нужна немедленная отправка - используйте flush. P.S. Да, на сервере. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2011, 17:07 |
|
||
|
Естественное пакетирование TCP/IP
|
|||
|---|---|---|---|
|
#18+
[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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2011, 14:31 |
|
||
|
Естественное пакетирование TCP/IP
|
|||
|---|---|---|---|
|
#18+
CSharpHelpКак я понимаю, если отправляющая сторона отдает данные сразу (по крайней мере так утверждает техподдержка)Если вам так критичны 200 мс, то заставьте техподдержку эскалировать проблему на разработчика. Как вам уже объяснили, IP-стек выполняет, помимо прочего, буферизацию данных (любого) приложения. Немедленную отправку без (дополнительных) усилий со стороны программиста обеспечивает UDP. TCP - сам решает, когда передавать данные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2011, 16:35 |
|
||
|
Естественное пакетирование TCP/IP
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovЕсли вам так критичны 200 мс, то заставьте техподдержку эскалировать проблему на разработчика. Как вам уже объяснили, IP-стек выполняет, помимо прочего, буферизацию данных (любого) приложения. Немедленную отправку без (дополнительных) усилий со стороны программиста обеспечивает UDP. TCP - сам решает, когда передавать данные. У меня в распоряжении есть стандартное API, которое предусматривает передачу только посредством TCP. Ради меня одного API переделывать не будут. Вы пишите, что TCP сам решает, когда передавать данные. Пусть так, но ведь должен быть алгоритм принятия этих решений. Поток данных небольшой, а скорость стоит на первом месте. Вроде выходом должно быть отключение Nagle, с тем чтобы подтверждения о доставке пакетов отправлялись сразу же (по умолчанию интервал 200 мс). Это должно увеличить трафик, но убрать агрегирование пакетов. Ставил TcpAckFrequency=1, TCPNoDelay=1 или на сокет .NoDelay = true, также пробовал TcpDelAckTicks=0, но почему то не получил никакого эффекта. В общем продолжаю оставаться в недоумении: данные вроде уже у меня, но оперативно снять их я не могу :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2011, 17:55 |
|
||
|
Естественное пакетирование TCP/IP
|
|||
|---|---|---|---|
|
#18+
CSharpHelpВ общем продолжаю оставаться в недоумении: данные вроде уже у меня, но оперативно снять их я не могу :(Вы хорошо подумали, когда ставили опции на принимающей стороне? После того, как данные приняты IP-стеком, приложение получит их немедленно (кванты времени и т.п. фигню не учитываем, deffered accept - не наш случай). P.S. На бирже, что ли играете? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2011, 06:59 |
|
||
|
Естественное пакетирование TCP/IP
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovВы хорошо подумали, когда ставили опции на принимающей стороне? После того, как данные приняты IP-стеком, приложение получит их немедленно (кванты времени и т.п. фигню не учитываем, deffered accept - не наш случай). Я, откровенно говоря, совсем не думал, т.к. в этих вопросах разбираюсь слабо. Поэтому и решение пытался найти перебором вариантов, которые смог отыскать в интернете. В этом форуме написал, поскольку знаю, что здесь можно получить квалифицированную помощь. Насчет биржи Вы правы: это API одного из зарубежных биржевых датафидов. P.S. Пока так и не понял, можно ли что-то изменить на моей стороне, чтобы избавиться от задержек. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2011, 21:07 |
|
||
|
Естественное пакетирование TCP/IP
|
|||
|---|---|---|---|
|
#18+
CSharpHelpP.S. Пока так и не понял, можно ли что-то изменить на моей стороне, чтобы избавиться от задержек. Ничего нельзя изменить на твоей стороне. Точка. Так понятно? Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2011, 21:37 |
|
||
|
|

start [/forum/topic.php?fid=26&msg=37312966&tid=1498096]: |
0ms |
get settings: |
9ms |
get forum list: |
18ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
167ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
| others: | 250ms |
| total: | 520ms |

| 0 / 0 |
