Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
программная реализация TCP будет эффективнее проверки того же самого средствами различных битторрент клиентовАсь? Вы вообще о чём? В случае UDP контрольную сумму по прежнему считает карточка (если умеет), остальное — всё также считает CPU, только протокол проще. Почему вдруг упрощение протокола снизит эффективность???
Если говорить популярным языком, UDP используется для надёжных сетей, TCP для ненадёжных, из этого принципа выбирается, что использовать.Ссылку на источник не дадите? Чтобы знать чего людям никогда не давать читать. Выбор UDP или TCP делается на основании конкретных требований. Так в NFSv1-v3 действительно использовался UDP ибо в надёжных сетях это позволяло экономить вычислительные мощности и сеть работала быстрее. Но вот NFSv4 от поддержки UDP отказалась — даже в локальной сети поддерживается только TCP и SCTP. Несмотря на то, что современные локальные сети уж никак не менее надёжны чем те, которые были в 80е годы, когда появилась NFS. Однако же DNS использует UDP и TCP — причём TCP используется только как «запасной вариант» в случае проблем с UDP.
Интернет считается ненадёжной сетью, нормально построенная локальная сеть надёжной.Тогда почему в NFSv4, предназначенной в первую очереднь для локальных сетей произошёл отказ от UDP? Почему DNS, предназначенный в первую очередь для сети Интернет использует в качестве основного протокола UDP? Потому что разрабатывавшие их специалисты по сетям — идиоты? И потому что сотни и тысячи людей за многие годы этого не заметили? Согласитесь — притянутое за уши объяснение…
В ненадёжных сетях TCP/IP будет более эффективен, и это не я придумал.Я не знаю кто это придумал и что он при этом курил, но мне бы хотелось доказательств этого бредового утверждения. Всё зависит от задачи — в частности Bittorrent должен эффективнее работать через UDP.
Впрочем пользуйся UDP если тебе так охота, в конце концов все популярные клиенты, да и многие трекеры поддерживают эту возможность.Ну пока не все: тот же μTorrent качать до последнего времени через UDP не умел… Но да — возможность хорошая…
Если мне не на словах, а опытом докажут, что в моём медленном глючащем соединении UDP окажется быстрее, то я соглашусь, особенно если не возникнет проблем с NAT (пока то у меня с UDP вообще ничего не работает, ну да не в этом суть).А то, что феррари быстрее запорожца вы признаете только тогда, когда он это продемонстрирует на бездорожье возде села Криводановка? Сети бывают разные и есть сети где вообще UDP не проходит. Простую потерю пакетов переживает легче чем TCP, но если, например, UDP-пакеты не доходят вообще, то о какой скорости может идти речь?
Вот и объясни, почему по твоему мнению используют TCP/IP, хотя могли бы использовать UDP/IP.Обисняю для идиотов: нельзя использовать то, чего нет. TCP/IP — собирательное название для сетевых протоколов разных уровней, используемых в сетях. Туда входят десятки протоколов: ARP, IP, TCP, UDP, ICMP. Без многих из них сеть работать в принципе не сможет (скажем без ARP и ICMP не будет работать вообще ничего). Протокол IP — это база, на нём построено всё остальное. Почему протокол номер шесть (а вовсе не протокол номер один) попал в название системы, а протокол номер семнадцать не попал — нужно разыскивать в анналах usenet'а.
Специалисты из майкрософт, что ни там курили я не знаю, тема построения кластерных баз данных, то есть сверхмощных систем для обработки информации.Ну значит разработанный ими протокол плохо работает через UDP если много пакетов теряется. При чём тут Bittorrent?
Причём время отклика для торрент сетей не играет никакой роли. Для них последовательная скачка зло и лишь тормозит систему, и пока весь файл не скачаешь все равно не посмотришь.
Собственно говоря TCP и решает эту проблему, это и есть его отличие от UDP, т.е. пакет будет доставлен в той же последовательности и без потерь.То есть вы сами объяснили почему TCP хуже UDP для Bittorrent'а — и даже не заметили этого! Вот это — настоящая гениальность…
А теперь представим, что мы используем UDP, значит сам программный клиент будет требовать доставить ему данные, что является лишней нагрузкой на CPU, да и зачем, когда TCP все равно для этих целей окажется эффективнее.Откуда взялась лишняя нагрузка на CPU? UDP и TCP используют одну и ту же процедуру для обеспечения целостности пакетов (почитайте RFC768), но TCP ещё дополнительно имеет хитрый и сложный протокол, который предоставляет программе гарантии, которые BitTorrent'у ни разу не интересны! Какие образом отказ от части работы может повысить нагрузку на CPU???
Обработку ошибок придётся вести BitTorrent, вот и всё.Обработкой ошибок в обоих случаях занимается сетевуха. Обработкой потерянных пакетов в обоих случаях занимаетеся CPU — только протокол в случае с UDP попроще. Откуда возьмётся дополнительная нагрузка?
Впрочем почитай ка вот это — lurkmore.ru/Небыдло.А вы сами там были? Читали? Может теперь (в виде исключения) наконец приведёте аргументы в пользу своей точки зрения? Hint: впрочем я говорил не столько про это, сколько про то, что программная реализация TCP будет эффективнее проверки того же самого средствами различных битторрент клиентов — аргументом не является. Потому что протокол, который нам нужно реализовать устроен гораздо проще, чем TCP.
Если UDP эффективнее, коррекция ошибок проходит в нём налету, тогда простой вопрос, почему по твоему мнению предпочитают использовать TCP и не только в битторрентах, ведь и то и другое существует очень давно?Несколько причин:
Как бы слушать о том, что я не понимаю, что говорю мне не интересно, аргументируй лучше свою точку зрения, только постарайся без традиционного «ты быдло», иначе это будет последнее сообщение тебе.Вообще-то слово быдло в беседу привнёс не я и свои слова я стараюсь аргументировать ссылками на сайты с полезной информацией, а не с потоком сознания на философские темы.
Но не стоит забывать, что для передачи по сети кусочек бьется на блоки, которые уже в свою очередь помещаются в пакеты.Не стоит забывать о том, что в случае UDP этого не происходит.
ЗЫ: Кстати, не стоит забывать, что полезная нагрузка UDP-пакета меньше 64КБ. Получается, что максимальный «круглый» размер блока, который можно запросить — 32КБ. На быстрых каналах и больших раздачах накладные расходы будут впечатляющими.На большинстве линков пакеты больше 1500 байт не отсылаются, а пакеты больше 9KB (так называемы jumbogram'мы) — вообще экзотика, так что практически ограничение в 32KiB — не ограничение.
Не стоит забывать о том, что в случае UDP этого не происходит.
На большинстве линков пакеты больше 1500 байт не отсылаются, а пакеты больше 9KB (так называемы jumbogram'мы) — вообще экзотика, так что практически ограничение в 32KiB — не ограничение.
Теперь давайте попробуем отправить тот же самый блок по UDP. Если мы записываем все в один пакет, тогда у нас будет jumbogram'ма и всего лишь 13 байт накладных расходов. А если писать в пакет не более 1500 байт, то у нас 260 байт накладных расходов. Естественно, вычисления приблизительные, т.к. полезная нагрузка протокола Bittorrent, как и его накладные расходы, являются полезной нагрузкой протоколов TCP/IP или UDP.
Что же касается того вашего высказывания, с которого начался наш тред, то UDP лучше TCP не потому, что «Для них последовательная скачка зло и лишь тормозит систему, и пока весь файл не скачаешь все равно не посмотришь.» и «Собственно говоря TCP и решает эту проблему, это и есть его отличие от UDP, т.е. пакет будет доставлен в той же последовательности и без потерь.», а потому, что у UDP при прочих равных накладных расходов на транспортном уровне меньше (пусть и на уровне протокола Bittorrent больше).Ну ёлки ж палки. Кто вас теории вероятностей учил? Вот тут я написал подробнее. TCP проигрывает именно потому что пытается гарантировать то, что "пакет будет доставлен в той же последовательности и без потерь"! А экономия на транспортном уровне — это копейки. На 9000 байт экономия составит 73 байта. Меньше одного процента! Стоили ли огород городить ради таких крох?
В смысле какой именно способ по-Вашему может иметь меньшие накладные расходы, чем уведомление о получении а-ля TCP.Самый простой и тупой, какой только можно придумать. Нам заранее известно что пакетов, которые нам нужны — конечное число. Ну скажем миллион. Мы знаем какие пакеты у нас есть, каких — нет. Нам всего-навсего нужно запрашивать пакеты, которых у нас нет и повторять запрос если ответа долго (скажем секунд пять) нет. Протокол — на порядок проще чем в TCP. Никаких пересылок данных туда/сюда/обратно. Вообще никакой синхронизации между пакетами. И никаких подтверждений вообще! Чистый протокол класса «запос — ответ»!
нумеровать — т.е. вводить дополнительный протокол поверх UDP.Ну да, разумеется.
А это дополительные накладные расходы. Которые могут оказаться больше, чем расходы TCP.Ни в коем случае. TCP решает очень сложную задачу: подать в программу байты в том порядке в каком они были высланы. Нам же нужно решить гораздо более простую задачу — получить все байты когда-нибудь. Простой протокого «вопрос-ответ» с перезапросом «потерянных» пакетов вполне может с этим справиться. Мы можем даже плюнуть и после двух-трёх попыток запросить определённый пакет обратится к другому клиенту — чего TCP аж никак сделать не сможет: если случится затык в каком-нибудь тысячном пакете, то TCP будет пересылать его снова и снова, и все будут ждать пока этот пакет наконец дойдёт — ничем больше в этот момент канал будет занять нельзя.
1) нумеровать (или нумеровать не пакеты, то части данных)Не нужно нам нумеровать пакеты! Ни разу не нужно! Нам нужно написать что унутри у этого пакета: скажем пакет с байтами 1'500'000..1'501'500. Принимающая сторона хватает пакет и радостно его пристраивает в свой файл. Всё. Ах, да — когда мы собрали очередной кусок в несколько мег — нужно проверить сошлась ли контрольная сумма и если нет — выкинуть все пакеты, запросить их по новой.
2) в случае недоставки — сообщать номераОпять-таки: не нужно! Нужно сообщить диапазон байт, которые нас интересуют — и всё.
В любом случае, определенная дополнительная информация нужна.Нужна масса информации! Нужно помнить какие пакеты мы запросили и у кого, нужно следить за тем, чтобы не запрашивать пакеты слишком часто, нужно делать вообще много разных вещей (потому это пока beta и ещё долго будет отлаживаться). Но цимес в чём: вся эта информация волнует только систему, которая скачивает файл. И её не нужно никуда пересылать!
Для этого мы должны иметь возможность вручную составлять каждый UDP пакет. А это Win системы делать не позволяют.Вы чего? Совсем с ума сошли? Если я не могу отослать UDP пакет с тем содержимым, какое мне нужно, то что я вообще могу? Разумеется Windows позволяет отсылать пакеты с любым содержимым. Мы не можем влиять на служебные поля — но это нам и не нужно.
Сервер послал пакет и забыл о нём, если клиент сам не попросит передать повторно другим путём.
При маленьком проценте потерь (суммарная выгода от отказа от TCP больше, чем данные. которые необходимо переслать для коррекции куска перемылаемых данных) выгодно использовать UDP, при большом — TCP.Большей чуши представить себе просто невозможно. Рассмотрите крайний случай: 90% потерь пакетов. TCP в этом случае просто загнётся. UDP (по описанной схеме) будет работать и просто перепошлёт все пакеты в среднем по 10 раз. Это как раз когда потери невелики неважно что использовать — TCP или UDP.
В случае, если одни и те же пакеты нужно будет отправлять по несколько раз — выигрыша от UDP по сравнению с TCP не будет.Либо вы не понимаете как работает TCP, либо одно из двух. Как вообще TCP обеспечивает целостность передачи данных? Чудес на свете не бывает: он ждёт некоторое время прихода пакета, потом просит его передать. Пока «отсутствующий» пакет не доставят — программа ждёт. Как работает BitTorrent через UDP? Ну нет у нас пакета — и чёрт с ним. Подождём секунд пять-десять — заново запросим. А пока давайте попросим какой-нибудь другой пакет их нужных нам. У нас есть выбор из как минимум нескольких сот тысяч (а скорее миллионов) вариантов! Что это значит? Если пакеты теряются — TCP начинает тормозить. Если теряется, скажем, 75% пакетов, то скорость падает катастрофически. В случае UDP — у нас всё время есть чем занять канал! Даже если будет теряться 90% пакетов — мы выберем всю пропускную способность канала и скачаем весь файл (хотя для этого нам придётся послать в 10 раз больше данных чем размер файла).
Если пакеты теряются — TCP начинает тормозить.
Если теряется, скажем, 75% пакетов, то скорость падает катастрофически. В случае UDP — у нас всё время есть чем занять канал! Даже если будет теряться 90% пакетов — мы выберем всю пропускную способность канала и скачаем весь файл (хотя для этого нам придётся послать в 10 раз больше данных чем размер файла).
Поправьте меня, если я ошибаюсь, но пересылая без толку 10 раз пакет по UDP и видя скорость приблизительно равную пропускной способности канала мы и получаем в результате ту же самую эффективную скорость (количество правильно доставленных пакетов: затраченное время) как и в случае использования TCP.Нет, нет и нет. Да, мы в обоих случаях запрашиваем пакеты повторно, но вопрос в том как мы это делаем. Рассмотрите простой случай: 50% вероятностная потеря пакетов (считать легче, а результат тот же). Вначале события развиваются одинаково: мы запрашиваем 64 пакета (в реальной жизни цифры колеблются, но это типичное количество). Получаем 32. Что происходит потом? А потом судьба TCP и UDP сильно разнится. TCP застревает в вреднем на втором пакете, отдаёт в программу один и перезапрашивает 33 пакета. UDP заносит 64 полученных в базу и перезапрашивает снова 64 пакета! Дальше TCP получает свои 17 пакетов, сдвигается в среднем на два и запрашивает повторно 18 пакетов, получает 9 пакетов, сдвигается на 4 и запрашивает 13 пакетов, сдвигается на 8 и запрашивает 16 — в общем стабилизируется это дело примерно на уровне «сдвига окна» в 16 пакетов и запроса «недостающих» 32х пакетов. А UDP всё время запрашивает по 64 пакета! Но это ещё цветочки. Если бы дело было только в этом, то мы потеряли бы«всего» 50% пропускной способности канала. На самом деле обнаружив такую потерю пакетов TCP немедленно решит что канал у нас перегружен и уменьшит окно! Так что если у нас просто сеть с допольно большим количеством потерь пакетов, то UDP гораздо более эффективен. Другое дело что UDP могут идти с низшим приоритетом или вообще не идти — но это уже от ISP зависит.
когда я покупаю канал 1024 кбит, я ожидаю, что скорость будет ОТ 1024, но никак не ДОВы можете ожидать что угодно, но получаете вы именно до 1024. Задача маркетинга — объяснить вам почему вы получили то, за что заплатили :-)
> Причём поскольку максимальная скорость занижена у всехНет. Она могла бы быть и 100Mbit, и 1Gbit, но тогда «Top Seeder'ы» заняли бы весь канал и «нормальные пользователи» получили бы 100kbit…
по-моему речь как раз о том, что как правило она У ВСЕХ *завышена*
µTorrent переходит на UDP-протокол