一、引言
当TCP连接建立上了,现在就需要通讯了。但是在不同的场景下,我们关心的地方不一样。如对于交互型的应用,我们关心实时性;对于视频文件传输等,我们更多的关心速度。
交互数据流
与
成块数据流
将可以解决这些问题。在一些关于TCP通信量的研究中,交互数据流与成块数据流的比例是1:9。
二、交互数据流
1.交互式例子
我们通过Rlogin命令(程序)来了解交互式输入,如图是一次按键的交互结果:
- 1.客户端到服务器的按键数据包。
- 2.服务器到客户端的按键确认数据包。
- 3.服务器到客户端的按键回显数据包。
- 4.客户端到服务器的按键回显确认数据包。
在这里特意用Rlogin作为例子,因为它每次总是从客户发送一个字节到服务器。事实上,Telnet允许客户发送一行到服务器,通过使用这个选项可以减少网络的负载。
2.经过时延的确认数据包
在上面的例子中,每发送一次按键信息,都会产生4个数据包。事实上2数据包与3数据包可以合并在一起发送的。这样会减少不少数据包。通常TCP在接收到数据时并不立即发送ACK;相反,它推迟发送,以便将ACK与需要沿该方向发送的数据一起发送(有时称这种现象为数据捎带ACK)。绝大多数实现采用的时延为 200ms,也就是说,TCP将以最大200ms的时延等待是否有数据一起发送。
3.Nagle算法
像这种交互数据流,每一次都发送一个字节(一个数据包)到服务器,在网上会产生很多微小的分组,在局域网中,这些分组通常不会引起麻烦,但是在广域网上,这些分组可能增加拥塞出现的可能。Nagle算法的出现就是为了解决这些问题。 Nagle算法要求一个TCP连接上最多有一个没有被确认的未完成分租,在该分组的确认到达之前不能发送其他分组。在等待确认数据包的时候,它会把需要发送的几个小分组合并在一起,在确认到达后,发送出去。 该算法的优点是它是自适应的:确认到达越快,数据就发送得越快。在希望减少小分组的低速网络上,会发送更少的分组。
三、成块数据流
1.正常块数据流例子