1.校验和
通过校验和,接收端可以检测出数据是否有差错和异常,如果有差会直接丢弃。
TCP在计算校验和时,会在TCP首部加上一个12字节的伪首部。
校验和总共计算三部分:TCP首部,TCP数据,TCP伪首部。
2.序列号
对数据包编号,用于判断数据包顺序。
3.确认应答
数据到达接收方,接收方需要发出确认应答,表示已经收到该数据段,并且确认序号会说明它下一次需要收到的数据序列号。
4.超时重传
如果发送方迟迟未收到接收方发送的确认应答,那么可能是发送的数据丢失,也可能是确认应答丢失,这时发送方在等待一定时间后会进行重传。
这个时间一般是2*RTT+一个偏差值
5.流量控制
流量控制是为了让发送方的发送速率不要太快,使得接收方来得及接收。
接收方每次收到数据包,要发送确定报文的时候,同时告诉发送方自己的缓存区剩余大小(接收窗口大小)。
发送方收到之后,便会调整自己的发送窗口大小,当发送方收到接收窗口大小为0时,就会停止发送数据,防止出现大量丢包的情况。
当发送方停止发送数据后,什么时候才可以继续发送数据呢?
当发送方收到 接收窗口=0的信息时,就会停止发送报文,并且同时开启一个计时器,每隔一段时间就会发送测试报文询问接收方是否可以继续发送,如果可以接收方返回一个窗口大小,否则重置计时器。
(一般情况下接收窗口>=发送窗口)
6.拥塞控制
窗口控制解决了两个主机之间因为传送速率可能引起的丢包问题,保证了TCP数据传送的可靠性。
但如果网络非常拥堵,此时再发送数据就会加重网络负担,发送的数据可能超过最大生存时间也没有到达对方,造成丢包问题。
TCP引入慢启动机制,先发出少量数据,判断网络拥堵状态后再决定按照多大的速度传送数据。
引入拥塞窗口cwnd:
发送开时定义拥塞窗口大小为1,每收到一个ACK应答,拥塞窗口+1。发送数据时,发送窗口=min(拥塞窗口,接收端接收窗口)。
慢开始:
最开始发送方的拥塞窗口为1,由小到大逐渐增大。每经过一个传输伦茨,拥塞窗口cwnd加倍。
当cwnd超过阈值,则使用拥塞避免算法,避免cwnd增长过大。
拥塞避免:
每经过一个往返时间RTT,cwnd就增长1。
在慢开始和拥塞避免过程中,一旦发现网络拥塞,就把慢开始阈值设为当前的一般,并重置cwnd为1,重新慢启动。
快重传:
接收方每次收到一个失序报文就立即发出重复确认,发送方只要连续收到三个重复确认就立即重传(尽早重传未被确认的报文段)。
快恢复:
当发送方连续收到三个重复确认,就将阈值减半,将当前cwnd设为慢开始阈值,并采用拥塞避免算法。
(连续收到三个重复请求,说明当前网络可能没有拥塞)。
当采用快恢复算时,慢开始只在建立连接和网络超时才使用。
什么情况开始减慢cwnd增长速度?
采用慢开始和拥塞避免算法时:
1.cwnd>慢开始阈值,采用拥塞避免算法,减慢增长速度。
2.一旦出现丢包情况,就重新慢开始,减慢增长速度。
采用快恢复和快重传算法时:
1.cwnd>慢开始阈值,采用拥塞避免算法,减慢增长速度
2.一旦发送方连续收到了三个重复确认,就采用拥塞避免算法,减慢增长速度。