赞
踩
通过很多特殊机制实现可靠传输
- 第一个 面向连接,先确保双方有收发数据的能力
- 第二个 确认应答,接收方要回复每一个包
- 第三个 超时重传,确认回复超时
- 第四个 包序管理,协议中序号字段的作用,保证数据有序交付
数据有问题,用校验和字段检查数据是否正确,保证数据正确
发送方发送数据后需要接收方确认
- 回复确认数据包工作,是tcp自己在网络协议栈中完成的,不需要程序员介入;程序员只调用recv函数从缓冲区中拿数据
发送方发送数据就会开启一个重传计数器,当计数器的时间超过重传时间就会重传报文
- 超时重传时间RTO:
- 报文往返时间RTT:由上次和上上次的报文往返时间计算
RTT=RTT(prev0.9)+RTT(pprev0.1)- RTO=2*RTT
这两个机制可以保证tcp数据是可靠到达对端,但是:
- tcp发送方在发送下一个数据前会等待上一条数据的确认应答,整体发送效率低;如果上一条数据处理时间长,那么就会影响下一条数据发送
- 数据是从发送方的发送传冲区发送至,接收方的接收缓冲区,如果接收缓冲区中没有空间许多数据包会丢失,导致发送方一直重传;
提高发送方发送速率和接收方接收能力
滑动窗口机制允许tcp一次性将多个分组发送,暂时不需要确认应答,对端收到后挨个确认;每个分组大小不会超过MSS,当发送方接收到最早的确认应答后,窗口向后滑动包括下一个可以发送的分组
作用:防止数据发送过多而丢包,采用滑动窗口机制
关键点:协议字段中的窗口大小
在16位窗口大小字段中,告诉发送方,自己的接收缓冲区剩余空间,这是流量控制的最基本思想,但是没有体现出滑动窗口机制
滑动窗口还进行了数据包的排序
滑动窗口机制实现:
- 收发数据双方维护了窗口,发送方维护发送窗口,接收方维护接收窗口
- 握手时,两边会分享自己的窗口大小,
MSS,应用层数据最大是(三次握手时,在选项处携带自己的MSS大小,取两边较小的MSS)
MTU,网络层数据最大是1500字节
- 传输时数据在缓冲区,
滑动窗口:发送方一次性发送到网络中的分组集合,分组的个数就是窗口的大小
发送方窗口大小是动态变化的,取决于接收方窗口的大小
- 接收方回复ACK数据包,该数据包的协议字段中存在16位窗口大小;
- ACK数据包到达发送方后,发送方解析ACK数据包,得到接收方的窗口大小,来调节自己的每次发送的字节数;
接收缓冲区限制了接收方16位窗口大小
- 接收方数据存储在接收缓冲区;
- 缓冲区不是无线大;
- 当应用层不调用recv函数从接收缓冲区中获取数据,缓冲区容量就逐渐减小;
如果对双方发送数据量不进行控制,
- 接收方可能会丢失一些数据,这些数据没有经接收方回复确认;
- 发送方会启动超时重传机制;
- 如此往复,网络中就有大量的重传数据包占用带宽资源
- 导致整个网络转发能力下降
0号窗口:在接收方发送ACK数据包回复时,会标明当前窗口接收能力,若为0则表示不能接收数据;
- 发送接收到0号窗口,就将其滑动窗口调整至0,暂时不发送数据;
有两种触发方式,发送方可继续发送数据- 方式1:发送方主动给接收方发送窗口探测包,探测接收方缓冲区的大小;
窗口探测包大小固定为1字节;- 方式2:接收方主动给发送方发送窗口更新通知
滑动窗口丢包:
a.丢失某个分组ACK
- 视情况重传;
- 当滑动窗口某个分组ACK丢失后,可以通过收到的高序列号,来确认丢失的ACK分组数据是否到达对端,从而不需要重传;
b.丢失某个分组数据
- 必须要重传;
- 丢失分组后的数据是不能被recv函数从缓冲区内读取的;
按照滑动窗口发送数据时,还要考虑网络的转发能力是否满足一次性转发窗口大小的数据;
提高网络转发能力(用于提高tcp的发送速率)
影响网络转发能力的因素:(数据是在共享网络中传输的)
- 网路链路中,路由器、交换机的转发能力有上限;
- 网路链路中的传输介质是有传输上限的;
所以,tcp在发送数据时,为了不因网络原因频繁重传,则tcp在发送数据时,需要考虑网络转发能力;
- 网络拥塞机制本质是控制发送方发送数据的量,
- 最终发送的数据量是 = min(发送方滑动窗口大小,拥塞控制机制中拥塞窗口大小)
拥塞控制机制:
慢启动:
- tcp通信双方在建立连接后,先发送少量数据(拥塞窗口的数据)探测网络转发能力(根据tcp数据往返时间决定),根据网络转发能力逐渐调整拥塞窗口大小;
- 拥塞窗口的大小为1个MSS;
- 当拥塞窗口小于慢开始门限时,随着传输轮次增加,大小呈指数增长;
当拥塞窗口大小超过慢开始门限,则切换至拥塞避免算法;
拥塞避免算法:随着传输轮次增加,拥塞窗口大小呈线性增长(一次增加一个分组);往网络中传输的数据量依次加大,但是网络转发能力有限,就会导致tcp数据丢包,则发送方就认为网络拥塞立即下调拥塞窗口大小,即降低发送数据量;
快恢复:
- 一旦发现网络拥塞则计算新慢开始门限,从新的慢开始门限执行拥塞避免算法
- 新慢开始门限 =(拥塞发送时)拥塞窗口大小/2
快重传:
当发送方发送的网络数据丢包后,发送方还未触发超时重传机制时;
由接收方快速确认丢失报文起始序号,告知发送方该报文丢失,则发送方不需要等待超时之后才重传;
解释:
1001~2000数据在传输时丢失;
接收方虽然还在接收后续报文,但是在回复时仍是希望接收1001–2000的数据;
此时发送方收到3个同样的确认应答时,直接重发丢失的报文;
重发到对端后,对端因为收到2001–3000、3001–4000,再次收到1001的重传数据包时,就会回复下一个序号7001–8000数据包
如果没有快重传机制
- 发送方会在没有收到确认应答,在超时后也会重传;
- 但是要保证双方发送效率,如果发送方迟迟收不到确认应答,其滑动窗口不能向后滑动,就阻塞了发送效率;
延时发送机制(NAGLE算法):
- 如果发送方有少量数据需要发送;
- 但是该算法认为少量数据就进行网络通信,就等待一会;
- 等待数据量变大后,统一进行发送;
- 但是工业场景是禁止延时发送的;
捎带应答机制:
- 运用于双方都想给对方发送数据的场景,快速进行交互,就将ACK放在PSH数据包中携带给对方
延时应答机制:
- 接收方接收到数据,为了给发送方通告更大的窗口,等待一段时间;
- 如果在这段时间内,应用层将数据从接收缓冲区中接收后,接收方在回复确认时,就可以给发送方通过更大的窗口
心跳机制:判断空闲连接的双方是否是正常状态
- 连接空闲时就会启动保活计时器用来记录保活时间
- 超过两小时任一方就发送保活探测包
- 如果没有收到则每隔75秒发送一次,共十次
- → 10次都没应答则连接不正常,发送方主动断开
→ 有应答则正常,重新启动计时器
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。