The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Google исправил ошибку, около 10 лет присутствующую в TCP-стеке ядра Linux

27.09.2015 09:26

Сетевые инженеры Google диагностировали и разработали патч для ошибки, около десяти лет остававшейся неисправленной в TCP-стеке ядра Linux и приводившей к снижению эффективности передачи данных. Проблема негативно влияет на приложения, в которых интенсивный трафик чередуется с короткими периодами приостановки передачи, например, подобное поведение характерно для некоторой активности в Web, в частности, для потокового вещания.

Ошибка присутствовала в реализации алгоритма контроля перегрузки Cubic, используемого по умолчанию во многих дистрибутивах Linux. Проблема заключалась в неверной обработке состояния приостановки передачи данных приложением, что приводило к неверному трактованию параметров перегрузки (во время приостановки передачи информация о перегрузке не поступает, что воспринималось алгоритмом как незагруженность сети и возможность нарастить скорость передачи, хотя фактически полоса пропускания не изменилась). В итоге, когда приложение возобновляло передачу данных после паузы, отправка пакетов производилась слишком быстро, что не соответствовало реальной полосе пропускания и могло привести к потере пакетов и инициированию их повторной передачи, а как следствие потере скорости и задержкам в приложении.

  1. Главная ссылка к новости (https://news.ycombinator.com/i...)
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/43047-kernel
Ключевые слова: kernel, tcp, bug
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (83) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, grayich (ok), 09:38, 27/09/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +3 +/
    как часто вообще исправляются ошибки подобного уровня?
     
     
  • 2.3, A.Stahl (ok), 09:56, 27/09/2015 [^] [^^] [^^^] [ответить]  
  • +45 +/
    Практически настолько же часто, насколько часто они обнаруживаются.
    Да и вообще, какого "такого"? Мне кажется ты думаешь, что это была неимоверно важная и серьёзная ошибка. Но ведь это не так -- просто иногда, нечто при некоторых обстоятельствах отрабатывало несколько медленней чем могло. Досадная мелочь. Да в любом коде такой мелочёвки наберётся немерено -- где-то какое-то значение рассчитывается в цикле (хотя можно было бы посчитать и вне его), где-то в другом цикле проходит лишняя итерация с проверкой. Да, всё это снижает производительность на доли процента. Да, нехорошо.
    Но это не повод с саркастически-грустным видом спрашивать:"как часто вообще исправляются ошибки подобного уровня?"...
     
     
  • 3.4, AlexYeCu_not_logged (?), 10:06, 27/09/2015 [^] [^^] [^^^] [ответить]  
  • +4 +/
    >Но это не повод с саркастически-грустным видом спрашивать:"как часто вообще исправляются ошибки подобного уровня?"...
    >с саркастически-грустным видом

    С чего б мне начать изучение магии разума и навыка ясновиденья, чтоб добраться в этих дисциплинах до продемонстрированных вершин мастерства?

     
     
  • 4.7, user9090 (?), 10:13, 27/09/2015 [^] [^^] [^^^] [ответить]  
  • +4 +/
    программист-прагматик. путь от подмастерья к мастеру
     
  • 4.16, Аноним (-), 11:06, 27/09/2015 [^] [^^] [^^^] [ответить]  
  • +/
    "Идеальный код" Под редакцией Энди Орама и Грега Уилсона. Перевод с английского Н. Вильчинский и А. Смирнов. O'Reilly, Питер.
     
  • 4.20, Павел Самсонов (?), 11:35, 27/09/2015 [^] [^^] [^^^] [ответить]  
  • –2 +/
    О, как раз в тему :^)
    brain.sh:



    #!/bin/bash
    OH=("Oh" "Uff" "Ou")
    rm thought* > /dev/null 2>&1
    read -p "Which umask will pick the brain to think? (022,027,007,077, etc..): " BRAIN_UMASK
    umask $BRAIN_UMASK
    for i in 1 2 3 4 5 6 7 8 9 10
    do
        let ind=($i-1)%3
        echo thought$i
        echo "${OH[$ind]}, what a rain :!(" > thought$i
        sleep 1
    done
    echo "Ooh! See permissions on your thoughts!:"
    ls -la thought*
    sleep 10



     
     
  • 5.66, Легион (?), 09:42, 28/09/2015 [^] [^^] [^^^] [ответить]  
  • +1 +/
    for i in {1..10}
     
  • 5.71, тигар (ok), 10:45, 28/09/2015 [^] [^^] [^^^] [ответить]  
  • –1 +/
    >


    > #!/bin/bash

    .....
    > for i in 1 2 3 4 5 6 7 8 9
    >

    вся правда о тех кто в шебанг пишет /bin/bash.

     
     
  • 6.88, arisu (ok), 22:02, 30/09/2015 [^] [^^] [^^^] [ответить]  
  • +/
    > вся правда о тех кто в шебанг пишет /bin/bash.

    к сожалению, тут совсем не баш виноват…

     
  • 4.54, омонимус (?), 21:09, 27/09/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Юра Борщ. Как я стал человеком.
     
  • 4.64, Аноним (-), 08:05, 28/09/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Я тоже добавлю Совершенный код Макконнелла.
     
  • 3.5, grayich (ok), 10:08, 27/09/2015 [^] [^^] [^^^] [ответить]  
  • +6 +/
    вопрос был к тому, что гугл апять героями выставляют?

     
     
  • 4.9, A.Stahl (ok), 10:18, 27/09/2015 [^] [^^] [^^^] [ответить]  
  • +11 +/
    Герои не герои, но в этот раз они умудрились принести ложку мёда, не опрокинув несколько цистерн с дёгтем. Пока они пиарятся таким образом -- у нет вообще никаких возражений.
     
  • 4.18, РОСКОМУЗОР (?), 11:14, 27/09/2015 [^] [^^] [^^^] [ответить]  
  • +7 +/
    Иди "исправляй ошибки" и будешь героем. Не дай гуглю пиариться - пиарься сам!
     
     
  • 5.27, jj (?), 12:07, 27/09/2015 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > Иди "исправляй ошибки" и будешь героем.

    один такой "герой" был вынужден вычеркнуть себя из списка мейнтейнеров подсистемы tty, так как линус отревертил исправление им одной из ошибок, сказав, что все уже привыкли к ней, и не стоит травмировать их психику

     
     
  • 6.35, Аноним (-), 14:00, 27/09/2015 [^] [^^] [^^^] [ответить]  
  • +1 +/
    хотелось бы ссылку
     
     
  • 7.44, Аноним (-), 16:14, 27/09/2015 [^] [^^] [^^^] [ответить]  
  • +1 +/
    http://www.opennet.ru/opennews/art.shtml?num=22807
     
  • 6.46, Michael Shigorin (ok), 17:03, 27/09/2015 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > подсистемы tty

    Стоит понимать, что это один из наиболее тенистых закоулков ядра.

     
  • 6.55, angra (ok), 21:09, 27/09/2015 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Ну как тут не вспомнить классику:
        — Правда ли, что шахматист Петросян выиграл в лотерею тысячу рублей?
        — Правда, только не шахматист Петросян, а футболист «Арарата» Акопян, и не тысячу, а десять тысяч, и не рублей, а долларов, и не в лотерею, а в карты, и не выиграл, а проиграл.
     
  • 4.52, Аноним (-), 18:49, 27/09/2015 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > вопрос был к тому, что гугл апять героями выставляют?

    Когда б ты понимал, какие ресурсы Google тратит на тестирование СПО, от которого зависит его бизнес — то есть всего реально значимого СПО на GNU/Linux — ты б не задавал глупых вопросов.

     
     
  • 5.69, grayich (ok), 10:04, 28/09/2015 [^] [^^] [^^^] [ответить]  
  • +3 +/
    не нужно выдавать желаемое за действительное нося розовые очки
    гугл удачно прикрывается ширмой спо, но только потому, что выгода в итоге больше.
    а по сути - лишь слегка корректируют то спо, которое в итоге закрывают и выдают за свой продукт, например как хром
     
     
  • 6.74, iPony (?), 11:40, 28/09/2015 [^] [^^] [^^^] [ответить]  
  • –1 +/
    А у тебя клинический случай...
    Как думаешь кто в основном разрабатывает открытый chromium?
    Может ты еще думаешь что большинство СПО - это студенты бесплатно работающие по идеологическим причинам?
     
  • 6.76, Аноним (-), 13:30, 28/09/2015 [^] [^^] [^^^] [ответить]  
  • +/
    > не нужно выдавать желаемое за действительное

    Вот и не выдавай.

     
  • 2.12, privation (?), 10:45, 27/09/2015 [^] [^^] [^^^] [ответить]  
  • +/
    очевидно период полураспада 10 лет
     
     
  • 3.67, Andrey Mitrofanov (?), 09:44, 28/09/2015 [^] [^^] [^^^] [ответить]  
  • +/
    > очевидно период полураспада 10 лет

    Очевидно, что п.п. из одного события посчитать невозможно.

     
     
  • 4.82, Аноним (-), 01:13, 29/09/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Бывает по-разному. По содержимому некоторых комментариев на опеннете можно совершенно точно установить, что автору 24 года.
     
  • 2.21, fidaj (ok), 11:41, 27/09/2015 [^] [^^] [^^^] [ответить]  
  • +3 +/
    это последствия принципа: "работает - не трожь!"
     
  • 2.84, guest (??), 01:27, 29/09/2015 [^] [^^] [^^^] [ответить]  
  • +/
    в qsort из библиотеки libc только к 17 февраля 2008г разобрались как исправить
     

  • 1.6, б.б. (?), 10:10, 27/09/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    пачч для Debian Stable будет?
     
     
  • 2.10, GotF (ok), 10:24, 27/09/2015 [^] [^^] [^^^] [ответить]  
  • +6 +/
    > пачч для Debian Stable будет?

    Это не уязвимость. Это не ведёт к остановке ядра или сбоям в юзерспейсе. Разумеется, нет.

     
     
  • 3.15, б.б. (?), 11:01, 27/09/2015 [^] [^^] [^^^] [ответить]  
  • –1 +/
    жжаль
     
  • 3.47, Аноним (-), 17:27, 27/09/2015 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Debian - все для людей!
     

  • 1.8, Аноним (-), 10:14, 27/09/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Эта ошибка я так понимаю влияет на скачивание торрентов на низких скоростях?
     
     
  • 2.11, Аноним (-), 10:31, 27/09/2015 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Нет. А вот на раздачу в некоторых случаях может.
     
     
  • 3.22, анон (?), 11:41, 27/09/2015 [^] [^^] [^^^] [ответить]  
  • +/
    А разве торенты не по udp раздаются?
     
     
  • 4.31, Аноним (-), 12:43, 27/09/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Основной протокол - на основе TCP. Есть альтернативный, на основе UDP, под названием µTP, но он не везде поддерживается.
     
     
  • 5.50, GotF (ok), 18:07, 27/09/2015 [^] [^^] [^^^] [ответить]  
  • +/
    > Основной протокол - на основе TCP. Есть альтернативный, на основе UDP, под
    > названием µTP, но он не везде поддерживается.

    Ну, Transmission говорит, что он у большинства пиров. На глаз — порядка 95% и более.

     
     
  • 6.60, Аноним (-), 03:17, 28/09/2015 [^] [^^] [^^^] [ответить]  
  • +/
    > 95%

    венда/utorrent

     
     
  • 7.81, GotF (ok), 18:42, 28/09/2015 [^] [^^] [^^^] [ответить]  
  • +/
    >> 95%
    > венда/utorrent

    А у остальных Linux/OSX/любая-прошивка-для-роутера и Transmission с тем же µTP. Не вижу причин не включать этот протокол в клиенте.

     
  • 6.63, admin (??), 04:02, 28/09/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Если качать порнушку - да.
     
     
  • 7.72, анонимус (??), 11:00, 28/09/2015 [^] [^^] [^^^] [ответить]  
  • +/
    > Если качать порнушку - да.

    Никогда не замечал когда качал, у вас так медленно льётся что вы успеваете проанализировать все соединения, дабы потушить поскорее огонь на шишке?

     

  • 1.13, Аноним (-), 10:50, 27/09/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    Поделитесь, кто какие алгоритмы контроля перегрузки и где использует: рабочие станции, файлосервера.
     
     
  • 2.17, Аноним (-), 11:10, 27/09/2015 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Контроля перегрузки чего?
     
     
  • 3.32, sage (??), 12:58, 27/09/2015 [^] [^^] [^^^] [ответить]  
  • +1 +/
    TCP Congestion Control.
     
  • 2.30, Etch (?), 12:33, 27/09/2015 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Везде - net.ipv4.tcp_congestion_control=illinois

    Хоть по проводам, хоть по воздуху - везде самые лучшие показатели на сегодня.

     
  • 2.34, Ivan_83 (?), 13:54, 27/09/2015 [^] [^^] [^^^] [ответить]  
  • +1 +/
    htcp для раздачи IPTV и спидтеста в локалке.
    hybla для тяжёлых случаев когда RTT большое / потерь больше чем htcp переносит.

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

     

  • 1.14, Аноним (-), 10:52, 27/09/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • –2 +/
    А планировщик есть часть стека TCP? А какой у него RFC? А почему ошибка обработки статистики чего-либо, приравнивается к ошибке чего-либо?
     
     
  • 2.33, sage (??), 12:59, 27/09/2015 [^] [^^] [^^^] [ответить]  
  • +/
    > А планировщик есть часть стека TCP? А какой у него RFC? А
    > почему ошибка обработки статистики чего-либо, приравнивается к ошибке чего-либо?

    Нет, они не стандартизированы. Более того, многие алгоритмы слабо совместимы между собой. Т.е. cubic-cubic даст лучшую скорость, чем, например, yeah-cubic, но yeah-yeah выиграет.

     
     
  • 3.59, cmp (??), 00:16, 28/09/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Так о том и речь, что новость - ошибка в TCP, а по факту он непричем
     

  • 1.19, Аноним (-), 11:25, 27/09/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    Так она десять лет была не обнаруженной, я полагаю? Никто о ней не знал. А не так чтобы десять лет висел багрепорт и никто не мог ничего сделать.
     
     
  • 2.23, Аноним (-), 11:42, 27/09/2015 [^] [^^] [^^^] [ответить]  
  • +4 +/
    Неуловимый Джо
     

  • 1.24, Аноним (-), 11:52, 27/09/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    А как можно проследить попадание патча в основную ветку? В 4.3-rc2 его ещё нет...
     
     
  • 2.25, Аноним (-), 11:59, 27/09/2015 [^] [^^] [^^^] [ответить]  
  • +/
    https://git.kernel.org/cgit/linux/kernel/git/next/linux-next.git/log/?id=refs&
    Уже в linux-next
     
     
  • 3.29, Аноним (-), 12:10, 27/09/2015 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > https://git.kernel.org/cgit/linux/kernel/git/next/linux-next.git/log/?id=refs&
    > Уже в linux-next

    В 4.1-rc1 патч принят

     
     
  • 4.89, arisu (ok), 22:21, 30/09/2015 [^] [^^] [^^^] [ответить]  
  • +/
    > В 4.1-rc1 патч принят

    а в 4.2 нет. чудно ты, о мироздание.

     

  • 1.26, Аноним (-), 12:01, 27/09/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Было бы здорово увидеть хоть какие-то цифры, пускай даже для очень частного случая
     
     
  • 2.28, Аноним (-), 12:08, 27/09/2015 [^] [^^] [^^^] [ответить]  
  • +3 +/
    +0.0001%
     
     
  • 3.85, Аноним (-), 09:36, 29/09/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Т.е. раздули тему непонятно из-за чего?
     
  • 2.53, amominous (?), 19:07, 27/09/2015 [^] [^^] [^^^] [ответить]  
  • +/
    42
     

  • 1.36, soarin (ok), 14:17, 27/09/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • –2 +/
    Ещё бы 60533 и 12309 исправил бы кто.
     
     
  • 2.38, Аноним (-), 15:11, 27/09/2015 [^] [^^] [^^^] [ответить]  
  • +/
    см ниже, сорян, тредом промахнулся
     

  • 1.37, Аноним (-), 15:11, 27/09/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    https://bugzilla.kernel.org/show_bug.cgi?id=12309
    >Status: CLOSED CODE_FIX
     
  • 1.39, psrafo (ok), 15:15, 27/09/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Я что-то не понял, посмотрел код, а там только добавили функцию, и в структуру вписали, а где вызывают-то ? Где используется ? Я не силен в Си, просто не понял что там, может обяснит кто ?
     
     
  • 2.41, Омномним (?), 15:50, 27/09/2015 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Мельком взглянул. Это поле структуры раньше было NULL, а теперь инициализируется адресом этой новой функции. В другом месте код читает это поле и если оно не NULL, то делает косвенный вызов функции.



    static inline void tcp_ca_event(struct sock *sk, const enum tcp_ca_event event)
    {
        const struct inet_connection_sock *icsk = inet_csk(sk);

        if (icsk->icsk_ca_ops->cwnd_event)
            icsk->icsk_ca_ops->cwnd_event(sk, event);
    }



    Своеобразная эмуляция виртуального метода с пустой реализацией по умолчанию.

     
     
  • 3.42, psrafo (ok), 15:54, 27/09/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Большое спасибо тебе, человек.
     

  • 1.40, Аноним (-), 15:43, 27/09/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    >Ошибка присутствовала в реализации алгоритма контроля перегрузки Cubic

    Всегда использовал старый добрый Reno и не парился.

     
  • 1.43, Аноним (-), 15:56, 27/09/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • –2 +/
    > Google исправил ошибку

    Почему род мужской? :)

     
     
  • 2.79, Аноним (-), 15:59, 28/09/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Должен быть средний? ;)
     

  • 1.45, Аноним (-), 16:24, 27/09/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Что скажите про Data Center TCP (DCTCP)?
     
  • 1.48, абвгдейка (ok), 17:34, 27/09/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    рекорд 26-летней ошибки в FreeBSD не побит даже гуглом :)
     
     
  • 2.57, Вареник (?), 22:09, 27/09/2015 [^] [^^] [^^^] [ответить]  
  • +/
    >> рекорд 26-летней ошибки в FreeBSD не побит даже гуглом :)

    - В данном случае не явный баг, а недочет в логике работы в некотором case.
    Заниматься подобным тонким тюнингом можно до бесконечности.

     
     
     
    Часть нити удалена модератором

  • 4.77, Andrey Mitrofanov (?), 14:26, 28/09/2015 [^] [^^] [^^^] [ответить]  
  • +1 +/
    >Другими словами, пока вся кодовая база
    > не будет перепроверена, нельзя говорить "наш линукс стабилен - пользуйтесь!".

    Пользуемся же -- стабилен. ПОчему ты хочешь, чтобы сы не говорили об этом? За Венду бежишь, что ли? "Десяточка хороша"?

    >Он настолько же "стабилен", насколько велико наше незнание о костылях внутри.

    "Мы все умрём." Прошу, вы первые.

     
  • 4.80, anonymous (??), 17:35, 28/09/2015 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Такой коммент выдает косность мышления.

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

     
  • 4.90, count0krsk (ok), 14:44, 01/10/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Эммм.. Когда я в винде разгонял проц до 3.8 Ghz на воздухе, она стабильно давала БСОД.
    Линух стабильно загружался, матерясь в консоль о косяках процессора, и давал запускать программы, которые иногда вылетали, но работали жеж! На 3.5 Линух не матерился, всё пахало норм на 99%. Винда 2008 сервер падала через раз.
     
  • 2.58, AnotherReality (ok), 22:55, 27/09/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Что за ошибка?
     
     
  • 3.65, абвгдейка (ok), 09:17, 28/09/2015 [^] [^^] [^^^] [ответить]  
  • +/
    http://cvsweb.openbsd.org/cgi-bin/cvsweb/src/usr.bin/head/head.c?rev=1.18&con
     
     
  • 4.78, Аноним (-), 15:22, 28/09/2015 [^] [^^] [^^^] [ответить]  
  • –1 +/
    37 лет, опенбзд, да и в "оригинальной бзде" не было никакого бага - а так все верно, да.
     

  • 1.61, Меломан1 (?), 03:26, 28/09/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • –5 +/
    Этот патч пойдет прицепом к хрому или гугл собирается внедрить в ядро, вот что не понятно.
    Если хром пытается получить доступ к /etc/passwd, то какие сюрпризы дарит этот патч?
     
     
  • 2.86, twilight (ok), 11:55, 29/09/2015 [^] [^^] [^^^] [ответить]  
  • +/
    мальшик, ты адресом не ошибся?
    башоркру в другом месте
     

  • 1.62, Меломан1 (?), 03:34, 28/09/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • –2 +/
    Не-не! Помните еще были ускорители интернета для Windows?
     
  • 1.70, нонэймус (?), 10:08, 28/09/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Давно уже сижу на fq и yeah.
     
  • 1.73, iPony (?), 11:17, 28/09/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    Ссылку бы нормальную давали бы в новости, а не этот ваш RU

    http://bitsup.blogspot.com/2015/09/thanks-google-tcp-team-for-open-source.htm

     
  • 1.87, Аноним (-), 10:59, 30/09/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    хммм...и эти люди верят в непогрешимость (10 лет, КАРЛ) опсосов
     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру