TCP协议:
TCP协议的包头格式如下所示
可以看出其包头格式是比较复杂的,因为TCP协议中包含的东西比较多,需要ack回应,还需要丢包重传,还有拥塞控制。
重点关注一下几个问题:
【1】顺序问题。数据包编号,按序达到。
【2】丢包重传。
【3】连接维护。
【4】流量控制和拥塞控制。
TCP协议的三次握手:用于建立连接
上述图形是握手的流程。可以看出如果一端想建立连接,必须从这端开始有去有回,才能建立完成。
TCP协议的四次挥手:用于释放连接
上述时序图能够看出,如果想结束连接需要四次传输过程。
等待的时间设为2MSL,MSL是Maximum Segment Lifetime,报文最大生存时间。
关于连接状态。
TCP协议是面向连接的,但是什么叫做面向连接。通过三次握手之后也不一定保证后面的连接状态一直很好。
因此,所谓的建立连接只是在两端维持一种状态信息,中间传输数据包的时候也会更新这个状态。
TCP如何实现可靠传输:
TCP协议为了保证传输可靠性,在建立连接的时候会商定起始ID编号。然后按照ID号码发送数据,而且在应答的时候也不会是每一个数据包都回复,而是回复某一包,此包之前的数据都收到了。这种模式称为累计确认或者累计应答。
传输顺序问题:
如果后续数据包到达,但是之前有一包数据未到达,说明这包数据丢失,因此接收端会发送这个数据的前一包的ack,连续发送三遍,发送端就会重传这个数据包。
丢包问题:
超时重传。主要是定时器时间的长短,定时时间不宜过长,过长回导致访问变慢;也不能过短,时间必须大于往返时间RTT,会导致一些不必要的重传。
估计往返时间,需要TCP通过采样RTT的时间,然后进行加权平均,算出一个值,而且这个值还是要不断变化的,因为网络状况不断的变化。除了采样RTT,还要采样RTT的波动范围,计算出一个估计的超时时间。由于重传时间是不断变化的,我们称为自适应重传算法(Adaptive Retransmission Algorithm)。
有需要重传的时候,TCP的策略是超时间隔加倍。每当遇到一次超时重传的时候,都会将下一次超时时间间隔设为先前值的两倍。两次超时,就说明网络环境差,不宜频繁反复发送。
流量控制:
流量控制问题主要是发送端发送太快,导致接收端的缓冲被填满。所以可以采用的缓冲窗口来解决此问题。通过把接收端的窗口大小发送给发送端,实现流量控制。当窗口长度为0的时候,可以暂时停止发送。
拥塞控制:
和流量控制不同,流量控制是塞满接收端缓冲,而拥塞控制是塞满传输通道。TCP的拥塞控制就是在不堵塞,不丢包的情况下,尽量发挥带宽。
为了优化这两个问题,后来有了TCP BBR拥塞算法。它企图找到一个平衡点,就是通过不断的加快发送速度,将管道填满,但是不要填满中间设备的缓存,因为这样时延会增加,在这个平衡点可以很好的达到高带宽和低时延的平衡。