程序员程序员面试的那些小事

(013)TCP/IP协议-数据交互

2016-03-19  本文已影响360人  林湾村龙猫

一、引言

当TCP连接建立上了,现在就需要通讯了。但是在不同的场景下,我们关心的地方不一样。如对于交互型的应用,我们关心实时性;对于视频文件传输等,我们更多的关心速度。交互数据流成块数据流将可以解决这些问题。在一些关于TCP通信量的研究中,交互数据流与成块数据流的比例是1:9。

二、交互数据流

1.交互式例子

我们通过Rlogin命令(程序)来了解交互式输入,如图是一次按键的交互结果:


图1.一次按键交互

一次按键就会产生4个数据包。

在这里特意用Rlogin作为例子,因为它每次总是从客户发送一个字节到服务器。事实上,Telnet允许客户发送一行到服务器,通过使用这个选项可以减少网络的负载。

2.经过时延的确认数据包

在上面的例子中,每发送一次按键信息,都会产生4个数据包。事实上2数据包与3数据包可以合并在一起发送的。这样会减少不少数据包。通常TCP在接收到数据时并不立即发送ACK;相反,它推迟发送,以便将ACK与需要沿该方向发送的数据一起发送(有时称这种现象为数据捎带ACK)。绝大多数实现采用的时延为 200ms,也就是说,TCP将以最大200ms的时延等待是否有数据一起发送。

3.Nagle算法

像这种交互数据流,每一次都发送一个字节(一个数据包)到服务器,在网上会产生很多微小的分组,在局域网中,这些分组通常不会引起麻烦,但是在广域网上,这些分组可能增加拥塞出现的可能。Nagle算法的出现就是为了解决这些问题。
  Nagle算法要求一个TCP连接上最多有一个没有被确认的未完成分租,在该分组的确认到达之前不能发送其他分组。在等待确认数据包的时候,它会把需要发送的几个小分组合并在一起,在确认到达后,发送出去。
  该算法的优点是它是自适应的:确认到达越快,数据就发送得越快。在希望减少小分组的低速网络上,会发送更少的分组。

三、成块数据流

1.正常块数据流例子

图2.从svr4 传输8192个字节到bsdi

定义A为主机svr4.1056,B为主机bsdi.7777。做如下说明:

2.滑动窗口

一次正常的数据包交互是你发送一个数据包给我,我发送一个确认数据包给你,如此反复循环。虽然这样也可以传输数据。但是这样不是很傻嘛,类似于程序的同步执行或单进程执行。数据的传输效率很低的。能不能像程序多开几个进程加快执行速度一样一次多发几个数据包,加快传输速度。这就是滑动窗口。


图3.TCP滑动窗口

当接收方确认数据后,这个滑动窗口不时地向右移动。窗口两个边沿的相对运动增加或减少了窗口的大小。

整个数据传输的如同蜗牛的直线行走(蠕动)。

有个问题:假如后发送的数据包先到达,咋发送确认信号呢?找到答案再来写

3.PUSH标志

在之前的TCP概述中,看到头部中有个标识PUSH,他的作用是,发送方使用该标志通知接收方将所收到的数据全部提交给接收进程。这里的数据包括与PUSH一起传送的数据以及接收方TCP已经为接收进程收到的其他数据。

4.慢启动

发送方一开始便向网络发送多个报文段,直至达到接收方通告的窗口大小为止。当发送方和接收方处于同一个局域网时,这种方式是可以的。但是如果在发送方和接收方之间存在多个路由器和速率较慢的链路时,就有可能出现一些问题。一些中间路由器必须缓存分组,并有可能耗尽存储器的空间。
  TCP需要支持一种被称为“慢启动 (slow start)”的算法。该算法通过观察到新分组进入网络的速率应该与另一端返回确认的速率相同而进行工作。
慢启动为发送方的TCP增加了另一个窗口:拥塞窗口 (congestion window),记为cwnd。

都看到这里了,要不要扫二维码关注一下微信公众号林湾村龙猫

微信公众号rudy_tan_home
上一篇 下一篇

猜你喜欢

热点阅读