随笔分类
连接管理?
TCP通过三次握手与四次挥手的过程,保证可靠的连接,是可靠性保证的前提
序列号 和 确认应答 ?
序列号:TCP传输时将每个字节的数据都进行了编号,这就是序列号
确认应答:TCP传输的过程中,每次接收方接收到了数据,都会对发送方进行应答,也就是发送 ACK报文段
- 这个 ACK报文中带有对应的确认序列号,告诉发送方,
接收到了哪些数据,下一次的数据从哪里开始发
超时重传?
在进行 TCP传输时,由于 确认应答与序列号机制
,即发送方发送完一部分数据后,都会去等待接收方发送的 ACK报文
,并解析 ACK报文,据此来判断数据是否传输成功;
如果发送方迟迟没有接收到 ACK报文,可能的原因有:
- 数据在传输过程中由于网络原因直接全体丢包,接收方根本就没有接收到
- 接收方接收到数据后,发送的 ACK报文响应由于网络原因丢包了
因此,为了解决这个问题,TCP引入了一个新的机制,即 ARQ (超时重传机制)
:简单理解就是发送方在发送完数据后,会去等待一个时间,如果指定时间内并没有接收到接受方返回的 ACK报文,那么发送方就会对刚才发送的数据进行重新发送
- 如果是第一个原因,接收方接收到重发的数据后,就会进行 ACK报文响应
- 如果是第二个原因,接收方接收到已经存在的数据 (
判断重复数据的根据便是 "序列号",即序列号还有去除重复数据的作用
),那么就直接丢弃,也会进行 ACK报文的响应
流量控制
接收端在接收到数据后,对其进行处理
如果发送端发送数据的速度太快,导致接收端的 接收缓冲区
很快的填充满了,那么接下来发送的数据都会丢包,继而导致丢包的一系列连锁反应:超时重传之类的
而所谓的流量控制便是:TCP会根据接收端对数据的处理能力,决定发送端的发送速度,这个机制就是流量控制
在 TCP协议的报头信息当中,有一个 16位字段来表示窗口大小 (实际上就是 接收端接收数据缓冲区的剩余大小
);这个数字越大,说明接收端接收缓冲区剩余空间也就越大,网络吞吐量越大
接收端在确认应答发送 ACK报文时,将自己的 即时窗口大小
填入,随着 ACK报文一起发送过去
而发送方会去根据 ACK中接收方的对应的即时窗口大小来去改变自己的发送速度;
如果接收方的即时窗口大小为 0,那么发送方将停止发送数据
发送方也会定期向接收端发送 窗口探测数据段
,让接收端把窗口大小告诉发送端,然后发送方再据此来判断自己是否能继续发送数据
拥塞控制?
拥塞控制:避免过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载;拥塞控制所要做的都有一个前提:就是网络能够承受现有的网络负荷
TCP主要是通过四个算法来进行拥塞控制的:慢开始、拥塞避免、快重传、快恢复
慢开始
不要一开始就发送大量的数据,先探测以下网络的拥塞程度,也就是会从小到大逐渐去增加拥塞窗口的大小
发送的最初执行慢开始,另 cwnd = 1,发送方只能发送 1个报文段;当收到确认后,将 cwnd加倍,因此之后发送方能够发送的报文段数量为:2, 4, 8 ...
拥塞避免
慢开始每个轮次都会让拥塞窗口进行加倍,这样拥塞窗口的数据量增长快速,也就是发送方发送数据过快,网络拥塞的可能性也就更高
因此设置了一个慢开始门限 ssthresh状态变量:
- 当拥塞窗口数量等于 ssthresh时,使用慢开始算法
- 当拥塞窗口数量大于 ssthresh时,改用
拥塞避免算法
- 当拥塞窗口数量等于 ssthresh时,慢开始与拥塞避免算法任意
拥塞避免算法让拥塞窗口缓慢增长,即每经过一个往返时间 RTT就去把发送方的拥塞窗口 cwnd加 1,而不是加倍;
这样拥塞窗口按线性规律缓慢增长
注意:无论是在 慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞 (根据:没有接收到确认信号,虽然没有接收到确认也有可能是其它原因造成的分组丢失,但是因为无法判定,因此都当做拥塞来处理),就会去将慢开始门限设置为出现拥塞时窗口大小的一半,然后把拥塞窗口设置为 1,开始执行慢开始算法
快重传
对于接收方,要求每次接收到报文段时都应该对 最后一个已收到的报文段进行确认
;例如:已经接收到 M1 和 M2,此时接收到 M4,应当去发送对 M2的确认
在发送方,如果收到三个(TCP利用三个相同的 ACK来判定数据包有没有丢失)重复确认
,那么就可以知道下一个报文段都是,此时就会去执行快重传,即立即重传下一个报文段;例收到三个 M2,则 M3丢失,此时立即重传 M3
快恢复
在这种情况下,只是丢失了个别报文段,而不是网络拥塞,因此来执行 快恢复
,令 慢开始门限为拥塞窗口的一半,然后设置拥塞窗口大小为慢开始门限,(ssthresh = cwnd / 2, cwnd = ssthresh
,注意此时直接进入了拥塞避免)
慢开始和快恢复的快慢只的是拥塞窗口 (cwnd)的设定值,而不是 cwnd的增长速率
慢开始 cwnd设定为 1,而快恢复设置为 ssthresh