TCP2

平静时间

       客户端发送数据时,服务器突然断电,很快服务器重启新建连接,新包与以前的数据报混合,所以重启后等待MSL时间主机不要发起新的连接。

FIN_WAIT_2

       结束时服务器不发FIN,客户一直处于FIN_WAIT_2状态不能发送只能接受数据。

复位报文段

       无论何时一个报文段发往的连接出现错误,TCP都会发出一个复位报文段RST异常终止TCP连接,优点:丢弃任何待发数据并立即发送复位报文段。

TCP服务器的设计

       TCP服务器对于每一个连接都需要建立一个独立的进程,保证对话的独立性,所以TCP是并发的,而且TCP还需要一个呼入连接请求队列来为每个连接请求建立对话进程,TCP可以区别出不同客户,进行数据收发。

TCP交互数据流

       TCP较多的通信协议根据吞吐量大致分为两大类:(1)交互数据类型,例如telnet.ssh,这类协议大多在做小流量的数据交换,比如按一下键盘,回显示一些文字等等。(2)数据成块类型,如FTP,电子邮件等,要求TCP能尽量运载数据,把数据吞吐量做到最大,并尽可能提高效率。

       每个交互按键都会产生一个分组数据,每次从客户传到服务器是一字节的按键,产生四个报文段:(1)来自客户的交换按键,(2)来自服务器的按键确认,(3)来自服务器的回显(4)来自客户的回显确认。TCP给出两个策略提高发送效率和减轻网络负担,(1)经受时延的确认,(2)Nagle算法(一次尽量多的发数据)。

经受时延的确认(捎带ACK)

       通常TCP在收到数据时并不立刻发送ACK,相反它推迟发送以便将ACK与需要沿该方向发送的数据一起发送,绝大多数采用的时延为200ms,数据的确认和回显是一个包实现的,不是单独做一个确认和回显。客户端在200ms以内等待下一个输入,把下一个字符和这个ACK一起发送。

Nagle算法

       上bbs发帖在网速较慢时发帖,有时键入一连串字符,见过一段时间后,客户端会回显出很多内容,就好像数据一下子传过来一样,这就是Nagle算法作用。

       该算法要求一个TCP连接最多只有一个未被确认的未完成的小分组,在该分组到达之前不能发送其他的小分组,当A给B发送一个TCP数据包并进入等待主机B的数据报ACK

的状态的时候,这时A不能发送数据,A的输出缓冲区只有一个数据报,并且这个数据报不断接收后来的数据报,整合成一个较大的数据包,等到B的ACK一到,就把这些数据一下全部发送,Nagle仅用于低速链路。但是启用Nagle会有延时,小信息(鼠标移动)必须无时延发送,还用功能键包含3个字符,若只发一个字符无意义。      

TCP成块数据流

       对于FTP有较高的数据吞吐量要求,每次希望将尽可能多的数据发往对方,有一点延迟也没关系,TCP也提供一套策略支持这一要求。

快发送与慢接收

       发送方会连续发送数据尽量填满接收方的缓冲区,而接收方对这些数据只发送一个ACK来回应就可以了,ACK的累计特性会减小发送和接收的负担。

滑动窗口

       滑动窗口实际就是接收缓冲区的大小,发送方根据这个数据计算自己最多发送多长的数据。如果发送方收到接收方窗口大小为0的TCP数据报,那么发送方立即发送数据,等到接收方窗口大小不为0的数据报到来。

窗口合拢:窗口左边向右边靠近,发生在数据发送和确认时。

窗口张开:右边向左边发送将允许发送更多的数据,发生在接收进程读取已经确认的数据并释放TCP缓存。

       如图20-6,三次握手后连续发三个1024包,在第4,5,6包发送数据,第七个包确认到2049,只确认前两个,左边沿右移两个,第八个包ack=3073表明前三个已收到,窗口3072,表示收到的第三个包并未被应用程序读取,第九个包又发送1024,第十个包4097窗口4096,表明第九个包收到并已被读取,发送方连续发送三个1024,第十四个ACK=6145窗口4096表示第十二包已收到并已被完全读取,十六包ACK=8193窗口4096,说明第13,15包已经收到读取。ACK序列号确认收到,窗口放大确认读取。

(1)      发送方不必发送全窗口大小的数据,慢启动。

(2)      来自接收方一个报文段确认数据并把窗口向右滑动。

(3)      窗口大小可以减小但窗口右边沿不会向左移动。

(4)      接收方在发送一个ACK前不必等待窗口被填满。

默认的4096并不是理想大小,将两个缓存增加到16384会增加40%吞吐量,窗口大小增加吞吐量,发更多数据无需确认。

慢启动、数据拥塞

       发送方一开始变向网络发送多个报文段,直至接收方通告窗口大小为止,当接收方和发送方处于同一局域网可以,但是若两者之间存在多个路由器和速率较慢的链路,就会产生大量数据拥塞,就应启用慢启动,TCP发送方需要确认连接双方线路的最大吞吐量为多少,即拥塞窗口。

       接收窗口接收方的流量控制,通告对方缓冲区。

       拥塞窗口时发送方的流量控制,降低发送方速率,发送方取拥塞窗口和接收窗口的最小值作为发送上限,发送方开始时先发1个报文拥塞窗口为1,收到对方ACK后拥塞窗口从1增加到2,即可以发送两个报文段,当收到这两个报文ACK确认后,拥塞窗口增加到4,2的指数增加关系,发送更多数据报直至发生超市错误,发送端了解通信双方线路承载能力,也就确定拥塞窗口大小,发送方就用这个拥塞窗口发送数据。

TCP超时和重传

       超时和重传是TCP协议保证数据可靠性的重要机制,原理在数据发送后启动一个定制器,在一定时间内如果没有收到发送数据报的ACK报文,那么就重新发送数据,直至发送成功为止。关键在于超时和重传的策略怎样决定超时的间隔和重传的频率。

       对每个连接,TCP管理4个不同定时器,重传定时器,坚持定时器(保持窗口不断流动),保活定时器,2MSL定时器。

往返时间测量

最早的TCP曾经用了一个非常简单的公式来估计当前网络的状况,如下

                                                 RTT<-a* RTT+(1-a) * M

                                                        RTT= RTT * b

其中a是一个经验系数为0.9,b通常为2 。这个公式是说用旧的RTT(R)和新的 RTT(M)综合到一起来考虑新的RTT(R)的大小。Jacoboson说在网络变化很大的情况下完全不能做出灵敏的反应。于是引出下面用于每个RTT测量M的公式。

                                                 Err  =  M -A

                                                 A= A + g * Err

                                                 D= D + h * ( | Err | - D )

                                                 RTO= A + 4 * D

重传多义性:假定一个分组被发送,当超时发生时分组进行重传,然后收到一个ACK确认,那么这个ACK是针对第一个分组还是第二个分组呢?RFC规定当一个超时和重传发生时,在重传的数据确认最后到达之前,不能重置RTT计算,任意一个时间只做一个RTT计算。

图21.2连接上的计时器在发送报文段1时启动,并在确认(报文段2)到达时终止,下一个被计时的是报文段3,经2.4ms超时后重传发送报文段4,由于连接的计时器已经被启动所以该报文段不能被计时,当报文段5到达时确认计时的数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值