Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Порядок преодоления болота на маршрутеКак не надо писать приложения, основанные на протоколе TCP                Артём Гавр...
Основано на реальных событиях• NOT AN AD!• Распределённая сеть Qrator   ●      "кастомный" TCP/IP "снизу"    ●        "кас...
Проблемы• TCP не обеспечивает гарантированную доставку  сообщения.
Спокойно.
Проблемы• TCP не обеспечивает гарантированную доставку  сообщения за гарантированное время. Так лучше?• Первоочерёдная зад...
Таймауты• между recvfrom()• между запросами• время запроса• время сессии• время жизни любой проектируемой сущности• Long p...
Пример• Slowloris (Apache): DoS сервера с одного ПК• Slow HTTP POST   ●       Apache, IIS, Lighttpd: DoS сервера с одного ...
От времени к пространству
Content-Length●    Ресурсы на любое действие пользователя    должны быть ограничены●    В "кастомный протокол" должно закл...
errno(3)●    Закрытие соединения не означает успешную    передачу данных●    После recvfrom(), sendto(), etc. проверяйте e...
Пример●    Internet Explorer: скачивание файла успешно    заканчивается при ECONNRESET    ●        Статус соединения не пр...
Лимиты памяти●    Используемые ресурсы должны быть ограничены    сверху    ●        ENOMEM●    Используемые ресурсы должны...
Latency●    Троекратное рукопожатие занимает время●    Нужно реализовывать persistent-соединения    ●        сразу, чтобы ...
Историческая справка о костылях●    TCP    ●        T/TCP●    HTTP/1.0    ●        HTTP/1.1
Оптимизация●    Прежде всего:    ●        Measure!    ●        Profile!    ●        Emulate packet loss!
Оптимизация●   Текстовые протоколы удобны для отладки    ●   Отлаживать придётся●   Использование бинарных протоколов, как...
Оптимизация●    Опции TCP-сокета:    ●        TCP_NODELAY: отключение алгоритма Нейгла,        ускорение при малых порциях...
Оптимизация●    Опции TCP-стека:    ●        Linux: /proc/sys/net/**         –   net.ipv4.tcp_fin_timeout         –   net....
Одной строкой●    SO_REUSEADDR●    sendfile(2)●    select(2)/poll(2)/epoll(7)●    {n,h}to{n,h}{s,l}()●    int64_t vs long●...
Спасибо за вниманиеArtyom Gavrichenkov <ximaera@highloadlab.com>
Upcoming SlideShare
Loading in …5
×

Как не надо писать приложения, основанные на протоколе TCP (Артём Гавриченков)

4,932 views

Published on

  • Be the first to comment

Как не надо писать приложения, основанные на протоколе TCP (Артём Гавриченков)

  1. 1. Порядок преодоления болота на маршрутеКак не надо писать приложения, основанные на протоколе TCP Артём Гавриченков
  2. 2. Основано на реальных событиях• NOT AN AD!• Распределённая сеть Qrator ● "кастомный" TCP/IP "снизу" ● "кастомный" протокол управления "сверху" ● опыт работы с большим числом Web-серверов и Web- браузеров, включая самописные ● 2 года дебаг^W совершенствования продукта
  3. 3. Проблемы• TCP не обеспечивает гарантированную доставку сообщения.
  4. 4. Спокойно.
  5. 5. Проблемы• TCP не обеспечивает гарантированную доставку сообщения за гарантированное время. Так лучше?• Первоочерёдная задача – проектирование таймаутов• Ресурсы (включая время) на любое действие пользователя должны быть ограничены• Бездействие – это тоже действие
  6. 6. Таймауты• между recvfrom()• между запросами• время запроса• время сессии• время жизни любой проектируемой сущности• Long polling может быть плохой идеей
  7. 7. Пример• Slowloris (Apache): DoS сервера с одного ПК• Slow HTTP POST ● Apache, IIS, Lighttpd: DoS сервера с одного ПК ● Nginx: DDoS сервера с ботнета
  8. 8. От времени к пространству
  9. 9. Content-Length● Ресурсы на любое действие пользователя должны быть ограничены● В "кастомный протокол" должно закладываться ограничение на размер передаваемых данных● Сервер и клиент должны контролировать это ограничение
  10. 10. errno(3)● Закрытие соединения не означает успешную передачу данных● После recvfrom(), sendto(), etc. проверяйте errno ● ENOMEM ● ECONNRESET ● EANYTHING
  11. 11. Пример● Internet Explorer: скачивание файла успешно заканчивается при ECONNRESET ● Статус соединения не проверяется ● Content-Length не проверяется
  12. 12. Лимиты памяти● Используемые ресурсы должны быть ограничены сверху ● ENOMEM● Используемые ресурсы должны быть ограничены снизу ● Нет ресурсов → idle wait → ECONNRESET
  13. 13. Latency● Троекратное рукопожатие занимает время● Нужно реализовывать persistent-соединения ● сразу, чтобы не городить костыли потом
  14. 14. Историческая справка о костылях● TCP ● T/TCP● HTTP/1.0 ● HTTP/1.1
  15. 15. Оптимизация● Прежде всего: ● Measure! ● Profile! ● Emulate packet loss!
  16. 16. Оптимизация● Текстовые протоколы удобны для отладки ● Отлаживать придётся● Использование бинарных протоколов, как правило, – преждевременная оптимизация● Потом, всегда есть BSON и Google Protocol Buffers
  17. 17. Оптимизация● Опции TCP-сокета: ● TCP_NODELAY: отключение алгоритма Нейгла, ускорение при малых порциях данных ● TCP_CORK (Linux): для отсылки порций данных в одном TCP-сегменте ● "socket corking"
  18. 18. Оптимизация● Опции TCP-стека: ● Linux: /proc/sys/net/** – net.ipv4.tcp_fin_timeout – net.ipv4.tcp_{,r,w}mem – net.core.{r,w}mem_max ● Windows: HKLMSystemCurrentControlSetServicesTcpipParameters
  19. 19. Одной строкой● SO_REUSEADDR● sendfile(2)● select(2)/poll(2)/epoll(7)● {n,h}to{n,h}{s,l}()● int64_t vs long● IPv6
  20. 20. Спасибо за вниманиеArtyom Gavrichenkov <ximaera@highloadlab.com>

×