Дейтаграммы всегда принимаются полностью? - PullRequest
14 голосов
/ 28 октября 2011

Большинство функций получения дейтаграмм, таких как cv recv или read, javas DatagramPacket class или pythons SocketServer, включают возможность узнать количество полученных данных.

c:

int amount = recv(sock, buf, n, MSG_WAITALL);

Java:

int amount = datagramSocket.getLength();

Python:

class MyUDPHandler(socketserver.BaseRequestHandler):
    def handle(self):
        amount = len (self.request[0])

Являются ли они надежными?Или возможно, что принимаются только части сообщения, например, из-за фрагментации пакета или задержки в сети?
Другими словами: когда я отправляю порцию данных переменной длины через udp и получаю ее на другом конце,эти значения суммы точно равны размеру исходного чанка?

Редактировать:
Ниндзяль сделал хорошую точку, и я хочу включить ее здесь.Что происходит, когда функция приема прерывается, например, сигналом?Что происходит, когда два потока одновременно пытаются получить из одного сокета?

Ответы [ 2 ]

14 голосов
/ 28 октября 2011

UDP датаграммы не могут быть доставлены частично¹;они доставляются как есть или нет вообще.Так что да, вы можете быть уверены, что полученная дейтаграмма была отправлена ​​именно так, как вы видите ее на стороне получателя.

Редактировать, чтобы включить комментарий Уилла, который является лучшим видом правильного (то есть, технически):

yОни могут быть фрагментированы на уровне IP, но сетевой стек на стороне получателя либо полностью соберет дейтаграмму и передаст ее в процесс прослушивания как отправленный, либо не подтвердит, что какие-либо данные ввсе было получено.

4 голосов
/ 06 ноября 2011

Частичные дейтаграммы допустимы только с UDP Lite .

...