《UNIX网络编程 卷1:套接字联网API(第3版)》——8.13 UDP缺乏流量控制

本节书摘来自异步社区《UNIX网络编程 卷1:套接字联网API(第3版)》一书中的第8章,第8.13节,作者:【美】W. Richard Stevens , Bill Fenner , Andrew M. Rudoff著,更多章节内容可以访问云栖社区“异步社区”公众号查看

8.13 UDP缺乏流量控制

现在我们查看无任何流量控制的UDP对数据报传输的影响。首先,我们把dg_cli函数修改为发送固定数目的数据报,并不再从标准输入读。图8-19所示为新的版本,它写2000个1400字节大小的UDP数据报给服务器。

screenshot

然后,我们把服务器程序修改为接收数据报并对其计数,并不再把数据报回射给客户。图8-20所示为新的dg_echo函数。当我们用终端中断键终止服务器时(相当于向它发送SIGINT信号),服务器会显示所接收到数据报的数目并终止。

screenshot

现在我们在主机freebsd上运行服务器,它是一个慢速的SPARC工作站;在RS/6000系统aix上运行客户,两个主机间以100 Mbit/s以太网相连。另外,我们在服务器主机上运行netstat-s命令,在服务器启动前和结束后各运行一次,因为它们输出的统计数据将表明丢失了多少数据报。图8-21给出了服务器主机上的输出。
screenshot

客户发出2000个数据报,但是服务器只收到其中的30个,丢失率为98%。对于服务器应用进程或客户应用进程都没有给出任何指示说这些数据报已丢失。这证实了我们说过的话,即UDP没有流量控制并且是不可靠的。本例表明UDP发送端淹没其接收端是轻而易举之事。

检查netstat的输出,我们看到服务器主机(而不是服务器本身)接收到的数据报总数是2000(73208-71208)。“dropped due to full socket buffers”(因套接字缓冲区满而丢弃)计数器的值表示已被UDP接收,但是因为接收套接字的接收队列已满而被丢弃的数据报的数目(TCPv2第775页)。该值为1970(34911971),它加上由应用进程输出的计数值(30)等于服务器主机接收到的2000个数据报。不幸的是,因套接字缓冲区满而丢弃数据报的netstat计数值是全系统范围的值,没有办法确定具体影响到哪些应用进程(例如哪些UDP端口)。

本例中由服务器接收的数据报的数目是不确定的。它依赖于许多因素,例如网络负载、客户主机的处理负载以及服务器主机的处理负载。

如果我们再次运行相同的客户和服务器,不过这一次让客户运行在慢速的Sun主机上,让服务器运行在较快的RS/6000主机上,那就没有数据报丢失。

UDP套接字接收缓冲区
由UDP给某个特定套接字排队的UDP数据报数目受限于该套接字接收缓冲区的大小。我们可以使用SO_RCVBUF套接字选项修改该值,如7.5节所述。在FreeBSD下UDP套接字接收缓冲区的默认大小为42 080字节,也就是只有30个1400字节数据报的容纳空间。如果我们增大套接字接收缓冲区的大小,那么服务器有望接收更多的数据报。图8-22给出了对图8-20中dg_echo函数的修改,把套接字接收缓冲区设置为240 KB。

screenshot

在Sun主机上运行这个服务器程序,在RS/6000主机上运行其客户程序,接收到的数据报计数现在变为103。这比前面使用默认套接字接收缓冲区的例子稍有改善,不过仍然不能从根本上解决问题。

在图8-22中我们为什么把接收套接字缓冲区大小设为220×1 024字节呢?FreeBSD5.1中一个套接字接收缓冲区的最大大小默认为262 144字节(256×1 024),但是由于缓冲区分配策略(见TCPv2第2章),真实的限制是233 016字节。许多基于4.3BSD的早期系统把一个套接字缓冲区的大小限制为52 000字节左右。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值