一、引言
当TCP连接建立上了,现在就需要通讯了。但是在不同的场景下,我们关心的地方不一样。如对于交互型的应用,我们关心实时性;对于视频文件传输等,我们更多的关心速度。交互数据流
与成块数据流
将可以解决这些问题。在一些关于TCP通信量的研究中,交互数据流与成块数据流的比例是1:9。
二、交互数据流
1.交互式例子
我们通过Rlogin命令(程序)来了解交互式输入,如图是一次按键的交互结果:
一次按键就会产生4个数据包。
- 1.客户端到服务器的按键数据包。
- 2.服务器到客户端的按键确认数据包。
- 3.服务器到客户端的按键回显数据包。
- 4.客户端到服务器的按键回显确认数据包。
在这里特意用Rlogin作为例子,因为它每次总是从客户发送一个字节到服务器。事实上,Telnet允许客户发送一行到服务器,通过使用这个选项可以减少网络的负载。
2.经过时延的确认数据包
在上面的例子中,每发送一次按键信息,都会产生4个数据包。事实上2数据包与3数据包可以合并在一起发送的。这样会减少不少数据包。通常TCP在接收到数据时并不立即发送ACK;相反,它推迟发送,以便将ACK与需要沿该方向发送的数据一起发送(有时称这种现象为数据捎带ACK)。绝大多数实现采用的时延为 200ms,也就是说,TCP将以最大200ms的时延等待是否有数据一起发送。
3.Nagle算法
像这种交互数据流,每一次都发送一个字节(一个数据包)到服务器,在网上会产生很多微小的分组,在局域网中,这些分组通常不会引起麻烦,但是在广域网上,这些分组可能增加拥塞出现的可能。Nagle算法的出现就是为了解决这些问题。
Nagle算法要求一个TCP连接上最多有一个没有被确认的未完成分租,在该分组的确认到达之前不能发送其他分组。在等待确认数据包的时候,它会把需要发送的几个小分组合并在一起,在确认到达后,发送出去。
该算法的优点是它是自适应的:确认到达越快,数据就发送得越快。在希望减少小分组的低速网络上,会发送更少的分组。
三、成块数据流
1.正常块数据流例子
定义A为主机svr4.1056,B为主机bsdi.7777。做如下说明:
- 1-3:A发起主动连接,交换mss(最大数据包长度),以及window窗口大小。
- 4-6:A连续3次发送数据包,通告己方窗口大小。
- 7:B回应4,5的数据包接收,时延了的ack包,所以两个合并在一起。
- 8:B回应6的数据包接收,通过己方剩余窗口大小。该窗口大小小于初始值,说明还有部分数据没有被TCP接收。
- 9:A发送一个数据包。
- 10:B对9的响应。
- 11-13:A连续3次发送数据包,通告己方窗口大小。
- 14:B对11,12的响应。
- 15:A发送一个数据包。
- 16:B对13,15的响应。
- 17-20:四次握手关闭连接。
2.滑动窗口
一次正常的数据包交互是你发送一个数据包给我,我发送一个确认数据包给你,如此反复循环。虽然这样也可以传输数据。但是这样不是很傻嘛,类似于程序的同步执行或单进程执行。数据的传输效率很低的。能不能像程序多开几个进程加快执行速度一样一次多发几个数据包,加快传输速度。这就是滑动窗口。
当接收方确认数据后,这个滑动窗口不时地向右移动。窗口两个边沿的相对运动增加或减少了窗口的大小。
- 窗口合拢:称窗口左边沿向右边沿靠近为窗口合拢。这种现象发生在数据被发送和确认时。
- 窗口张开:当窗口右边沿向右移动时将允许发送更多的数据,我们称之为窗口张开。这种现象发生在另一端的接收进程读取已经确认的数据并释放了 T C P的接收缓存时。
- 窗口收缩:当右边沿向左移动时,我们称之为窗口收缩。RFC强烈建议不要使用这种方式。但TCP必须能够在某一端产生这种情况时进行处理。
整个数据传输的如同蜗牛的直线行走(蠕动)。
有个问题:假如后发送的数据包先到达,咋发送确认信号呢?找到答案再来写
3.PUSH标志
在之前的TCP概述中,看到头部中有个标识PUSH,他的作用是,发送方使用该标志通知接收方将所收到的数据全部提交给接收进程。这里的数据包括与PUSH一起传送的数据以及接收方TCP已经为接收进程收到的其他数据。
4.慢启动
发送方一开始便向网络发送多个报文段,直至达到接收方通告的窗口大小为止。当发送方和接收方处于同一个局域网时,这种方式是可以的。但是如果在发送方和接收方之间存在多个路由器和速率较慢的链路时,就有可能出现一些问题。一些中间路由器必须缓存分组,并有可能耗尽存储器的空间。
TCP需要支持一种被称为“慢启动 (slow start)”的算法。该算法通过观察到新分组进入网络的速率应该与另一端返回确认的速率相同而进行工作。
慢启动为发送方的TCP增加了另一个窗口:拥塞窗口 (congestion window),记为cwnd。
- 与另一个网络的主机建立 T C P连接时,拥塞窗口被初始化为 1个报文段。
- 每收到一个ACK,拥塞窗口就增加一个报文段。
- 发送方取拥塞窗口与接收方滑动窗口中的最小值作为发送上限。
- 发送方开始时发送一个报文段,然后等待 A C K。当收到该A C K时,拥塞窗口从1增加为2,即可以发送两个报文段。当收到这两个报文段的 A C K时,拥塞窗口就增加为 4。这是一种指数增加的关系。
- 在某些点上可能达到了互联网的容量,于是中间路由器开始丢弃分组。这就通知发送方它的拥塞窗口开得过大。
都看到这里了,要不要扫二维码关注一下微信公众号林湾村龙猫。