一、TCP报文段结构
二、TCP连接管理
(1)三次握手
为什么要三次握手?
1.防止过期、失效的连接请求到达后,导致无效连接的建立。
2.确保连接双方彼此完全清楚对方状态,保证可靠、稳定的建立连接。
(2)四次挥手
为什么要四次挥手?
1.为了确保连接断开的可靠,不会由于不可靠连接断开破坏TCP的可靠数据传输。
2.四次挥手断开连接称为对称断开连接,要求两端都主动提出断开连接请求,这样可以确保双方均能确认是否全部收到对方的数据,达到可靠传输的目的
为什么客户端需要等待2MSL才关闭连接?
1.主要原因是保障客户端最后一个ACK报文能够顺利到达服务端。服务端的fin+ack可能会丢失,这个时候服务端会重传。如果客户端不等待2MSL就关闭连接了,那么就接收不到服务端重传的FIN+ACK,当然也不会再发送一次ACK,这就会导致服务端关闭不了连接。
三、TCP可靠数据传输
保证可靠传输的手段:差错编码、确认、序号、重传、计时器等。序列号是每个字节编号;确认序列号为期望接收字节序号,TCP通常采用累积确认;采用单一的重传计时器,计时器超时时间采用自适应算法设置超时时间;重传主要针对计时器超时、三次重复确认。
TCP可靠传输的工作机制:
1.
2.
3.
4.
5.
6.
快速重传:
接收端每收到一个失序的报文段后就立即发出重复确认,以便更早的通知发送端有包丢失。接收端未收到丢失的包,则会多次发送ack_seq确认端进行重复确认。发送端会在第4次收到ack_seq确认段时,认为发了丢失,需要立即向接收端发送丢失的报文段,而不需要等待计时器超时。
四、TCP流量控制
主要是依靠滑动窗口协议进行控制的
五、TCP拥塞控制
拥塞控制的后果:
1.数据发送时延增加
2.缓冲队列太满导致分组数据丢弃
拥塞控制的作用:合理调度、规范、调整向网络发送数据的主机数量、发送速率、数据量,避免发送拥塞或尽快消除拥塞。
拥塞控制算法:慢启动、拥塞避免、快速重传、快速恢复4部分;
慢启动:发送数据报文时,将拥塞窗口CongWin设置一个TCP最大段长度MSS的值。每收到一个报文段确认后,就将CongWin增加一个MSS的数值。CongWin是连续增长,不是跳跃式增长。
拥塞避免:TCP设置一个拥塞窗口阈值Threshold,"分割"慢启动阶段和拥塞避免阶段。当CongWin小于Threshold时,拥塞窗口按慢启动执行,CongWin大于Threshold时,拥塞窗口切换为按拥塞避免执行。
当拥塞避免算法执行到某个时刻,发送端发生了计时器超时,则意味着网络发生了拥塞。发送端将新的阈值设置为CongWin/2。同时将CongWin设置为1,重新执行慢启动阶段。
(“加性增,乘性减”)
快速重传:当接收端收到3次重复确认,则认为发生了报文段的丢失,发送端立即发送被重复确认的报文段。
快速恢复:快速恢复是配合快速重传使用的算法,具体做法:当接收端收到3次重复确认时,将阈值减半,并将CongWin设置为减半后的阈值,然后开始拥塞避免算法,使CongWin缓慢的增长。
存在的问题:
- 基于丢包的拥塞控制算法并不能区分拥塞丢包和错误丢包,基于这点传统的拥塞控制算法在有错误率的管到上会收敛到一个很小的发送窗口。
- 其次,网络中会有一些 buffer,就像输液管里中间膨大的部分,用于吸收网络中的流量波动。由于标准 TCP 是通过 “灌满水管” 的方式来估算发送窗口的,在连接的开始阶段,buffer 会被倾向于占满。后续 buffer 的占用会逐渐减少,但是并不会完全消失。客户端估计的水管容积(发送窗口大小)总是略大于水管中除去膨大部分的容积。这个问题被称为 bufferbloat(缓冲区膨胀)。
TCP BBR算法
参考资料:
MTU: Maxitum Transmission Unit 最大传输单元
MSS: Maxitum Segment Size 最大分段大小
而一般以太网MTU都为1500, 所以在以太网中, 往往TCP MSS为1460。
https://blog.csdn.net/xiaofei0859/article/details/51058192
拥塞避免算法: