问题一例:UDP协议下发送多个数据报按大小体积收只收到一份

xusong 2008-01-19

准备摆弄个文件传输,在收集资料时,遇到这样一个问题。

描述大概如下:在UDP协议下,客户端向服务端发送2个以上数据包,结果服务端想通过大小不同来读取,但是都只收到一份。

《TCP/IP》三卷第一卷有这么一个例子:

关于UDP队列描述:

通常程序所使用的每个UDP端口都与一个有限大小的输入队列相联系。这意味着,来自不同客户的差不多同时到达的请求将由UDP自动排队。接收到的UDP数据报以其接收顺序交给应用程序(在应用程序要求交送下一个数据报时)

并且做了这么个例子:

作者分别从两个地址向服务器各发送了3条数据,但是服务器只接收了两个地址的第一个数据报。而且也没发回ICMP的数据报。

可归出的要点有,应用程序并不知道其输入队列何时溢出。只是有UDP对超出数据报进行丢弃,在在传输层上完成。可以认为是FIFO的

每个UDP端口都与一个有限大小的输入队列相联系

我这里认为这个就是我们接收数据设置的缓冲区大小。

这段解释从根本上来解释,即不依据什么理论,它规则就是这么定了。

///////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////

《WINDOWS网络编程》关于对此的理论描述:

第5.1.1一节指出,从消息来观察时,如果传送协议把它们当做一条独立的消息在网上传送,我们就说该协议是面向协议的。同时还意味着,接收端在接收数据时,返回的是发送端写入的一条离散消息,不能收到更多消息。

例子如下:左边工作站向右边工作站提交三条分别是128,64,32字节消息。作为接收端,缓冲区为256个字节,但是在读取时不会把三个数据合起来返回,而是128,64,32字节。这称为消息保护边界。这就是常说的基于数据报的协议。如果想一口气返回即无保护消息边界的流协议,

从这两点就可以给我们答案了。

相关推荐