Может ли linux-сокет вернуть данные меньше базового пакета? [Дубликат]

Если вы хотите использовать формулу вместо этого, вы можете использовать функцию SUBTOTAL (). Тем не менее, он немного ограничен.

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

Проверьте эту ссылку для получения дополнительной информации: http://office.microsoft.com/en-us/excel-help/subtotal-function-HP010062463.aspx

enter image description here [/g1]

32
задан zooropa 16 April 2009 в 17:01
поделиться

11 ответов

Он будет разбит, когда он попадет на сетевое устройство с более низким MTU, чем размер пакетов. Большинство Ethernet-устройств - 1500, но часто может быть меньше, 1492, если этот ethernet переходит через PPPoE (DSL) из-за дополнительной информации о маршрутизации, даже ниже, если добавлен второй уровень, например, общий доступ к подключению Интернета Windows. И dialup обычно 576!

В общем, хотя вы должны помнить, что TCP не является протоколом пакета . Он использует пакеты на самом низком уровне для передачи по IP, но в отношении интерфейса для любого стека TCP это протокол потока и не требует предоставления вам отношения 1: 1 к физическим пакетам, отправленным или полученным (например, большинство стеков будут содержать сообщения до истечения определенного периода времени или достаточно сообщений, чтобы максимизировать размер IP-пакета для данного MTU)

В качестве примера, если вы отправили два " пакеты "(дважды вызовите функцию отправки), принимающая программа может получать только 1 пакет (приемный стек TCP может объединить их вместе). Если вы применяете протокол типа сообщения по протоколу TCP, вы должны включить заголовок в начале каждого сообщения (или какой-либо другой mechansim заголовка / нижнего колонтитула), чтобы принимающая сторона могла разделить поток TCP на отдельные сообщения, либо когда сообщение принимается в двух частях или когда несколько сообщений принимаются как кусок.

35
ответ дан David 18 August 2018 в 02:15
поделиться
  • 1
    это зависит от MTU (фактически, самого маленького MTU) вдоль каждого прыжка на этом пути. Но для небольших полезных нагрузок (10 или 20 байтов, как в вопросе OP) это может быть «почти уверенным». что он не будет фрагментирован, если весь пакет (включая все заголовки каждого уровня протокола, даже те, которые добавлены сверху, если, скажем, VPN) + размер полезной нагрузки находится в пределах минимального размера ipv4. В ru.wikipedia.org/wiki/Maximum_transmission_unit вы можете увидеть, что для ipv4 вам гарантирован максимальный MTU не менее 68 байтов (НЕ полезной нагрузки!) На хмеле. – Olivier Dulac 27 August 2013 в 16:49
  • 2
    Существует также параметр MSS, который здесь не упоминается. – Maxim Egorushkin 2 August 2016 в 15:34

Если пакет превышает максимальный MTU сетевого устройства, он будет разбит на несколько пакетов. (Обратите внимание, что для большинства устройств установлено 1500 байтов, но это не является необходимостью.)

Реконструкция пакета должна быть полностью прозрачной для приложений.

2
ответ дан Ben S 18 August 2018 в 02:15
поделиться

«прикладной уровень» TCP-пакета (ну, действительно, сегмент действительно, TCP на своем собственном слое не знает из пакетов) никогда не фрагментируется, так как его не существует. Уровень приложения - это то место, где вы видите данные как поток байтов, надежно и упорядоченно.

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

2
ответ дан Curt J. Sampson 18 August 2018 в 02:15
поделиться

Фрагментация должна быть прозрачной для приложения TCP. Имейте в виду, что TCP является потоковым протоколом: вы получаете поток данных, а не пакеты! Если вы создаете приложение на основе идеи полных пакетов данных, тогда у вас будут проблемы, если вы не добавите слой абстракции для сборки целых пакетов из потока, а затем передайте пакеты до приложения.

16
ответ дан dwc 18 August 2018 в 02:15
поделиться

Правильно - наиболее информативный способ увидеть это - использовать Wireshark , бесценный инструмент. Потратьте время, чтобы понять это - несколько раз меня спасти, и дает хорошую проверку реальности

11
ответ дан Kevin Panko 18 August 2018 в 02:15
поделиться

Различные сегменты сети могут иметь разные значения MTU. В этом случае может произойти фрагментация. Для получения дополнительной информации см. TCP Максимальный размер сегмента

Эта (де) фрагментация происходит на уровне TCP. На прикладном уровне пакетов больше нет. TCP представляет собой непрерывный поток данных для приложения.

2
ответ дан lothar 18 August 2018 в 02:15
поделиться

На уровне приложения существует множество причин, по которым все 1500 байтов могут не отображаться в одном чтении. Различные факторы во внутренней операционной системе и стек TCP могут привести к тому, что приложение получит несколько байтов в одном запросе на чтение, а некоторые в следующем. Да, стек TCP должен повторно собрать пакет перед отправкой его, но это не означает, что ваше приложение будет получить все это в одном кадре (это, скорее всего, получите его в одном чтении, но это не ГАРАНТИРОВАНО получить его в одном чтении).

TCP пытается гарантировать порядок доставки байтов, с проверкой ошибок, автоматическое повторное посыла, и т.д. происходит за спиной. Думайте об этом как труба в приложении слоя и не получить слишком увязли в том, как стек фактически отправляет его по сети.

5
ответ дан Michael Kohne 18 August 2018 в 02:15
поделиться

Эта страница является хорошим источником информации о некоторых проблемах, возникших у других, а именно о необходимости инкапсуляции данных в протоколе приложения по протоколу приложения. Не совсем авторитетный в том смысле, что вы описать, но у него есть примеры и получены некоторые довольно большие имена в сетевом программировании.

2
ответ дан mrmcgreg 18 August 2018 в 02:15
поделиться

Если 3000-байтовый пакет входит в сеть Ethernet с размером MTU по умолчанию 1500 (для ethernet), он будет фрагментирован на два пакета длиной 1500 байт. Это единственный раз, о котором я могу думать.

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

0
ответ дан Srikar Doddi 18 August 2018 в 02:15
поделиться
  • 1
    Итак, получит ли получающее приложение два пакета или один на уровне приложения? – zooropa 16 April 2009 в 16:59
  • 2
    Это не то, что он спросил ... – dwc 16 April 2009 в 17:03
  • 3
    Уровень приложения не имеет понятия MTU и фрагментации пакетов. Это отдельный слой с отдельными обязанностями из уровня Сети и транспорта. Таким образом, выстрел ответа, уровень приложения не может видеть два пакета. – Srikar Doddi 16 April 2009 в 17:07
11
ответ дан Kevin Panko 6 September 2018 в 17:24
поделиться
11
ответ дан Kevin Panko 29 October 2018 в 23:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: