tcp/ip学习笔记--第19章 TCP interactive data flow (交互数据流)

来源:互联网 发布:linux配置网卡mac 编辑:程序博客网 时间:2024/05/21 09:22

简介:

有文章对网络中的数据流研究发现,如果以包为单位进行统计的话,大约一半的包是用来发送成块数据的,而另一半是用来发送交互数据的。而以字节为单位的话,90%是成块的数据,10%是交互数据。 TCP对于两种不同的数据流,采用不同的算法。


交互式输入:

对于远程进行命令操作的软件rlogin来说,你每敲击一次键盘,都会产生一处tcp报文发送到服务端,同时服务端会回复一个报文表示收到。也就是说你一次敲击键盘的行为,会产生4个tcp报文(还有两个ack确认报文),当然一般来说,服务端的ack确认和回复会在一个报文中发送,那么也就是3个报文,这是惊人的。


延迟确认

一般来说,当TCP接收到一个消息时,并不会立即发送确认。而等待一段时间,看这个时间段之内是否有数据需要发送,如果有的话,就将确认和数据一起发送出去。如果没有,等待的时间到达之后,将发送ack确认。这样能够减小网络负载。

等待的时间一般来说是200ms。就像之前描述过的建立连接超时机制,这个时间不是准确的200ms,而是0到200ms之间的一个随机值。


Nagle Algorithm

小块的交互式的报文在局域网中发送一般都不会成为问题,但是到了某些拥挤的广域网中,这些小的报文段将使网域更加拥挤。nagle算法就是用来解决这个问题的。

算法是这么定义的:如果还没有收到之前发送的报文的ack确认,那么小块的报文就不能发送。而是将这些小的数据块收集起来再发送出去。需要注意的一点是,如果收到另一方发送来的数据,发送ack确认是不受这个限制的。同时,在发送ack确认的时候,可以附带着将数据发送过去。

这是一种优雅的算法,因为这个算法如此简单明了,却能够自适应。如果网络畅通,那么会更快的收到ack确认,也就能够更快的将数据发送出去。相反网络拥挤,收到ack的时间会延迟,发送数据的速率也就会降低。


关闭Nagle算法

在某些场景下,需要数据实时发送,比如说远程桌面连接,需要实时的传送鼠标的位置,这时候就需要关闭nagle算法。可以通过设置TCP_NODELAY选项来实现。

java代码如下:

socket.setTcpNoDelay(true);





阅读全文
0 0
原创粉丝点击