Насколько я понимаю, «метрикой» или «метриками» мы описываем длину (в байтах, верно?) Пакета, путешествующего по сети, проблема в том, что, насколько мне известно, это значение связано с провайдером, и найти его практически невозможно даже 2 провайдера с одинаковой метрикой.
Если я программирую программное обеспечение P2P для синхронизации двух программ, и я хотел бы оценить, каков оптимальный размер для моих пакетов, имеет ли смысл сохранять метрики в подсчете, особенно из-за того, что это значение, связанное с провайдером а во всем мире много провайдеров? Я должен применить некоторый «эвристический алгоритм», например, предполагая, что лучший показатель — самый низкий, и я просто продолжаю добавлять пустые значения для заполнения самого длинного?
Благодарю.
PS
если вам нужна отправная точка для примера, я бы предпочел что-то на C ++, так как сейчас меня интересует этот язык.
РЕДАКТИРОВАТЬ:
Резюме комментариев, которые вы можете найти ниже: похоже, мой вопрос слишком общий, и теперь я сосредоточусь на MTU и задержке (задержке), чтобы все было более точно.
Сетевое взаимодействие (и, в частности, межсетевое взаимодействие) — относительно молодая наука, еще не полностью сформированная. Следовательно, не все «правильное поведение» «разделяется» кем-либо просто потому, что не все верят (или вынуждены) обуздать его «правильно».
Следствием этого является то, что каждый должен — на некотором уровне — «заботиться» о чем-либо, поскольку невозможно полностью доверять.
Тем не менее, чтобы приблизиться к вашей проблеме, позвольте мне начать с того, чтобы сказать вам, что вы сами «ненадежны», так как используете неверную терминологию.
Вы говорите о сетевом «метрике» (то, что в сетевой науке связано с маршрутизация), но вы говорите о чем-то другом, то есть MTU (Maximum Transfer Unit). Если вы поговорите с сетевым инженером таким образом, вы почти наверняка не найдете ответа на свой вопрос просто потому, что он, скорее всего, поймет другую совершенно не связанную вещь.
Теперь, когда все ясно (надеюсь), давайте немного разберемся с теорией:
И именно поэтому вы должны позаботиться: производительность сети не одинакова для любой длины пакета: более длинные пакеты в TCP требуют меньше времени «ожидания для подтверждения» (поэтому передача данных может выполняться быстрее), но более длинные пакеты требуют большей задержки в случае промежуточной фрагментации и большей вычислительной мощности на маршрутизаторах. (в тот момент, когда многие провайдеры не фрагментируют: если он не может идти, они просто отбрасывают и позволяют TCP перенастроить на меньший MTU или приложению, чтобы сократить его пакеты UDP).
Другими словами, если вас не волнует производительность, просто позвольте TCP выполнять свою работу, и данные каким-то образом найдут способ передачи (путем промежуточной фрагментации или сквозного согласования MTU). Но если вы хотите максимизировать производительность, чем меньше механизмов контроля ошибок и восстановления вы «стимулируете», тем меньше задержка, которую вы получаете, и, следовательно, более широкие «сегменты», которые вы получаете, и, следовательно, более высокая скорость передачи данных, которую вы получаете.
Существует «оптимальная длина» для каждого пути, который вы можете иметь между двумя конечными точками, которые вы должны обнаружить и соблюдать, если вы хотите повысить производительность.
Если вы используете UDP, все будет немного хуже: поскольку нет согласования и восстановления MTU, если слишком длинный пакет отбрасывается по пути (потому что в определенный момент он больше не будет соответствовать физическому носителю, а провайдер не Собираясь фрагментировать, чтобы защитить себя и других клиентов) вы должны позаботиться и уменьшить его размер, иначе вы никогда не сможете его передать.
Не стесняйтесь сохранять провайдера как «несправедливо» по отношению к вам, но учтите, что чрезмерная активность фрагментации может привести к тому, что маршрутизатор окажется в том месте, где никакая другая передача невозможна из ниоткуда никому. И это урон выше, чем просто сбросить поток.
Я думаю, что вы, вероятно, говорите о метрике из таблиц маршрутизации. Если это так, то это просто число, которое отражает «стоимость» следующего перехода, скорее всего, с точки зрения задержки, но это не прямое измерение в миллисекундах. Это не то, что программисту нужно беспокоиться.
С оптимизацией по отношению к максимальным размерам единиц передачи (MTU) вы захотите добавить как можно больше битов в пакет, чтобы минимизировать количество пакетов, передаваемых по линии. Следует отметить, что если ваш главный компьютер (тот, который получает обновления в первую очередь) обновляется медленно, вы можете решить не ждать достаточного количества данных, чтобы полностью достичь MTU, а скорее обновить ведомый компьютер (на котором вы выполняете резервное копирование данных).
Так что в качестве примера ваша логика может выглядеть примерно так (в псевдокоде)
while(keep_updating){
if(new_data_size == (MTU - x)){ //really approximately equal to but smaller then the MTU
send_update_packet();
}else if(count_time > max_wait_time){ // this will have to deal with min latency
// discussed below
send_update_packet();
}
count_time++;
}
Теперь приведенные выше примеры очень глупы, если это то, что вы на самом деле пишете. Я предполагаю, что это будет на уровне ядра (не обязательно, но, тем не менее), это, скорее всего, будет одним потоком, в то время как остальная часть вашей службы выполняет другие задачи. в каждой теме.
Теперь с точки зрения времени задержки или задержки это более конкретно рассматривается как задержка сети, что-то в ситуации p2p, которую вы, скорее всего, не контролируете, так как это требует специального соглашения об обслуживании с ISP. Однако сумма этих частей даст приблизительную задержку в общих выражениях. то есть. время, которое требуется от send_update_packet();
пока ведомая машина не получит пакет и ваш хук в ядре / ОС, где вы фактически записываете новые обновления. В любом случае, это будет задержка, которая вас интересует
Processing delay - time routers take to process the packet header
Queuing delay - time the packet spends in routing queues
Transmission delay - time it takes to push the packet's bits onto the link
Propagation delay - time for a signal to reach its destination
… Теперь относительно того, какой протокол вы должны выбрать снова, очень зависит, если вы планируете, чтобы две машины говорили все время, tcp может быть вашим лучшим, это предотвратит вас, по крайней мере, гарантируя, что пакеты не будут потеряны (роскошный UDP обрабатывает протокол выше стек). Если вы ожидаете, что обновления будут более распространенными, вы захотите избежать TCP просто из-за процесса установления соединения TCP, который потребует 3x (сумма задержки, упомянутой выше), где udp позволит вам отправлять пакетные записи. и затем дождитесь ответа на том же сокете, гарантируя, что пакет был получен правильно, если вы не получите ответ в течение времени x
повторите попытку.
В соответствии с ответом @EJP, при условии, что программистам в большинстве случаев не нужно беспокоиться об этом, но на определенном уровне есть люди, которые беспокоятся об этом, особенно в случаях аварийного управления для сервера баз данных и таких областей, как это, где важно, чтобы БД как всегда близки к insync … тем не менее, это два моих чувства после написания в прошлом году кода ядра, который решает эту конкретную проблему. Надеюсь, это поможет!