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字节。这称为消息保护边界。这就是常说的基于数据报的协议。如果想一口气返回即无保护消息边界的流协议,
从这两点就可以给我们答案了。