1.TCP的控制机制
- 序号
TCP通过序号可以实现一下几个功能:
1.确认应答处理。发送端收到接收端的确认应答,可以得知某些数据包被接收端接收了
2.顺序控制。接收端可以利用序号对接收到的报文进行排序
3.重发控制。如果发送端没有收到确认应答,那么就会进行数据重发
4.重复控制。如果接收到多次收到同一个序号的报文,则选择不接受该报文
- 超时重传
超时重传是TCP确保可靠性的一部分机制,它的作用是对丢失的报文进行重发。
超时重传的规则如下:
如果接收端发送了一个报文之后,一定时间后并没有收到确认应答,则说明发送的报文丢失,进行重传。
这个时间间隔不是固定的,而是根据RTT(报文的往返时间)确定的,通常超时时间间隔会设置的比RTT稍微大一些。
- 连接管理
TCP通过三次握手建立连接、四次挥手断开连接。
- TCP以段为单位发送数据
虽然TCP是面向字节流的协议,但这并不意味着它的报文长度没有限制。
TCP的报文长度(段大小)通常为MSS(最大消息长度)。MSS的确认过程如下:
MSS在TCP三次握手时确定。
因为通信的两端可能所处的网络不同,所以MTU也不同(最大传输单元),所以传输层发送的数据最好不要超过MTU,否则就会触发IP层的分片和重组机制(这个机制是不好的)。
所以在TCP三次握手时,通信双方交换自己的MTU,发送端选择两个MTU当中的最小值作为MSS,所以传输层的每一个报文的最大长度不能超过MSS。
- 滑动窗口
滑动窗口提高了TCP的传输效率和速度。
它的原理如下:
发送端发送一个报文后需要等待确认应答的到来,如果这个时间段内什么也不做那将是一种资源浪费。所以TCP提供了滑动窗口的机制,使得在等待确认应答的事件段内能够发送其他的报文。
- 流量控制
流量控制可以避免网络资源浪费。流量控制与滑动窗口配合使用。
它的使用机制如下:
上面提到了滑动窗口,它的功能是利用等待确认应答的时间来发送更多的数据。那么发送多少数据就是由流量控制机制来控制的。
在TCP通信中,无论是什么TCP报文,都会带有接收端的接收窗口大小。发送端根据这个接收窗口大小来确认滑动窗口的大小,从而保证发送端发送的数据接收端一定能接收,从而避免网络资源浪费(发送的数据接收端接收不了而丢弃掉,不就是浪费网络资源了么)。
- 拥塞控制
本篇文章的主题,马上开始介绍。
2.拥塞控制
拥塞控制主要解决网络拥堵的问题。因为在真实的网络通信当中,有非常多的主机在同时使用网络,但是其中的某一主机并不知道其他主机发送了多少数据,如果当前主机一次性发送了海量的数据,则非常有可能造成网络崩溃甚至是瘫痪。
那么TCP就提供了拥塞控制的机制来避免这样的情况发生。
拥塞控制当中有一个概念叫做拥塞窗口,简单理解成是跟滑动窗口一样的东西。
数据发送的大小取决于拥塞窗口和滑动窗口的最小值。
试想这么一种情况,连接刚建立,那么接受端的接收窗口是非常大的,那么发送端会一次性发接收窗口大小那么多的数据吗?当然不可能啦,突然发送非常大的数据会造成什么影响上面已经介绍过了。
所以拥塞控制当中有一个叫做慢启动的机制,它的作用就是让TCP慢慢的发送数据。它的规则如下:
一开始的拥塞窗口为1MSS,也就是一开始只能发送1MSS数据大小的报文。随后每收到一个确认应答,拥塞窗口的大小就+1。
举个例子,一开始发送一个报文,收到一个确认应答,那么拥塞窗口就扩大为2MSS。随后发送两个报文,收到两个确认应答,然后拥塞窗口扩大为4MSS。随后发送四个报文,收到四个确认应答,然后拥塞窗口扩大为8MSS......以此类推。
从上面的规则来看,发送端能发送的数据呈指数级增长(但是要注意实际发送的数据为min(拥塞窗口,接收端窗口))。
发送的数据越多越容易造成网络拥堵,随机出现丢包的现象,最后触发超时重传。触发超时重传之后,可以得到慢启动阈值,这个阈值就是当前一次性发送的数据大小(假设为8MSS)。
因为发生了超时重传,那么慢启动阈值就会减半,即从8MSS降低为4MSS。然后又开始慢启动发送数据。
这里补充一条规则,即当拥塞窗口的大小超过了慢启动阈值,数据的发送只能呈线性增长。这个过程叫拥塞避免。
当前的慢启动阈值为4MSS,拥塞窗口为1MSS,所以它会重复上面的慢启动过程。直到拥塞窗口大于等于慢启动阈值,然后进入拥塞避免状态,发送的数据大小只能线性地、慢慢地增长。那么随着数据发送的慢慢增多,可能会出现一小部分的丢包现象,这个时候接收端会发送3次重复的确认应答以通知发送端有数据丢包了。
但是因为丢包的数据仅仅是一小部分,所以慢启动阈值又会减半。但是因为是接收到3次重复的确认应答,没有触发超时重传,所以拥塞窗口被设置为慢启动阈值+3。然后开始拥塞避免、发送数据。这个过程叫做高速重传。
如果在数据发送的过程中,又接收到了3次重复的确认应答,那么就继续做上面的动作。如果触发了超时重传机制,那么就要重新设置慢启动阈值,慢启动阈值就是触发超时重传的拥塞窗口大小的一半,然后又开始慢启动。
可以画一幅图来描述拥塞控制的过程:
简单的总结这个过程,连接刚建立之后不能直接发送大量数据,而是通过慢启动由少到多的发送数据,最后会因为发送过量数据而导致超时重传,可以得出慢启动阈值应当设置为引发超时重传的拥塞窗口的一半,然后进行慢启动,然后当拥塞窗口超过慢启动阈值的时候进入拥塞避免,随后如果收到了重复的确认应答就会触发高速重传,高速重传会重置慢启动阈值但是不会执行慢启动。
拥塞控制有点像发送端在慢慢吞噬整个网络一样,如果吞噬失败了就从头再来。
3.总结
TCP依靠序号、确认应答、滑动窗口、超时重传、流量控制等手段来确保通信过程的可靠性(可靠性就是确保数据的完整、按序、准确)。
拥塞窗口主要解决网络的问题,但正是因为TCP提供了拥塞控制的机制,即保证网络是正常工作的,所以拥塞控制也是保证可靠性的手段。