TCP可靠性传输机制
确认 重传 排序 流控
排序机制
分段 --- TCP是一款基于字节流的协议 --- 由传输层的TCP执行
MSS --最大段长度 --- TCP建立连接需要协商的参数 --- TCP在建立三次握手时前两个SYN报文中将携带该参数,并且双方的该参数允许不同,如果不同,将按照数值较小的执行。 --- MSS最大典型值为1460字节。
MTU --- 最大传输单元 --- 默认1500字节

分片 --- 由网络层的IP协议执行
序列号 --- TCP是基于"字节流" 的协议,这个序列号就是字节流的编号

确认机制
TCP为了保证对方能够收到本端发送的数据段的方法,使让对方回复一个确认报文段,这就是确认机制的做法。
确认序列号 --- 接收方期望收到发送方发送的下一个字节的序号 --- 累积确认
重传机制
超时重传
本端在一定时间内,没有收到对端反馈的确认报文而触发的重传机制。
RTO --- 超时重传时间
RTT --- 往返时间 --- 指的是发出端将数据发出后,到他接收到对端反馈的确认报文之后的这一段时间

如果RTO过长 --- 则会导致丢包之后,重传的效率降低,无法及时做出响应
如果RTO过短 --- 则会导致不必要的重传,导致网络负载增大
RTO的值在计算时,需要略大于RTT,因为RTT是一个可变化的值,所以RTO也是一个动态变化的值。

超时间隔加倍
原理
在 TCP 中,发送端发送数据后会启动一个定时器,若在超时时间内未收到接收端的确认应答(ACK),就会触发超时重传机制,重新发送未收到 ACK 的数据包。当超时重发的数据再次超时时,TCP 会将下一次的超时时间间隔设为先前值的两倍。例如,首次超时时间设为 1 秒,若重传后仍超时,下次超时时间就会变为 2 秒,再超时则变为 4 秒,以此类推,超时间隔呈指数增长。
作用
1、避免网络拥塞加剧:定时器过期很可能是由网络拥塞引起的,此时如果源持续重传分组,会使拥塞更加严重。通过超时间隔加倍,TCP 在网络不稳定时能够适当延长等待时间,以期待数据包能够成功传输,避免过早地重传数据,从而减少网络拥塞和带宽浪费。
2、 适应网络变化:网络状况是动态变化的,报文往返时间(RTT)也会经常波动。超时间隔加倍可以让 TCP 根据网络的实际情况调整等待时间,在网络延迟较大或出现丢包时,给予足够的时间让数据传输成功,提高数据传输的成功率和效率。

快速重传
失序报文
接收方收到一个数据段中的序列号大于自己期望的序列号,这样的报文就是一个失序报文。

冗余ACK --- Duplicate ACK
原因:
在 TCP 数据传输过程中,接收方会对收到的数据包进行确认,并向发送方发送 ACK。当发送方收到的 ACK 不是按顺序的下一个期望的 ACK 时,就会产生冗余 ACK。例如,发送方按顺序发送了 1、2、3、4 号数据包,接收方收到了 1 号数据包,会发送 ACK1;如果接收方接着收到了 3 号数据包,由于 2 号数据包丢失,接收方会再次发送 ACK1,这个重复的 ACK1 就是冗余 ACK。
作用:
1、检测丢包:冗余 ACK 的出现是数据包丢失的一个重要信号。发送方通过接收冗余 ACK,可以快速判断出有数据包在传输过程中丢失,而不必等待超时定时器超时后才进行重传,从而加快了重传的速度,减少了数据传输的延迟。
2、 触发快速重传:TCP 规定,当发送方连续收到三个相同的冗余 ACK 时,就会认为相应的数据包丢失了,立即触发快速重传机制,而不等待超时。例如,发送方收到了三个 ACK1,就会马上重传 2 号数据包,而不是等到超时时间到了才重传,这样可以更快地恢复丢失的数据,提高数据传输的效率。

选择确认机制(SACK)
在快速重传机制中,接收方在回复冗余ACK时,里面将携带自身已经收到的数据信息,避免重复发送,造成资源浪费。
工作过程
1、SACK 选项协商:在 TCP 连接建立时,通信双方通过在 SYN 报文中携带 SACK 选项来协商是否启用 SACK 机制。如果双方都支持 SACK,那么在后续的通信过程中就可以使用该机制。
2、数据接收与确认:当接收方收到数据时,它会检查接收到的数据段的序号,并将已接收的数据段的边界信息记录在 SACK 选项中。例如,接收方收到了序号为 1 - 1000、3001 - 4000 和 5001 - 6000 的数据段,那么它会在确认报文中通过 SACK 选项告知发送方这些不连续的数据段已经被接收。
3、发送方重传:发送方根据接收方发送的带有 SACK 选项的确认报文,得知哪些数据段已经被成功接收,哪些数据段丢失。然后,发送方只重传丢失的数据段,而不是像传统的 TCP 重传机制那样重传从丢失点开始的所有后续数据。
三次握手的可靠性保障

第一个SYN报文丢失 --- 这个报文发送后,客户端进入SYN_SENT状态等待服务器回复ACK。如果这个报文丢失,客户端没有等到回复,超过了RTO超时时间,则触发超时重传机制,客户端再次发送SYN,两次发送内容完全一样。因为是第一次发送数据包,则RTO超时时间的值为定义值,推荐时间为1S。如果再次丢失则触发超时间隔加倍,超时时间RTO为2RTO。如若一直丢失,系统会设置最大重传次数,达到最大重传次数则关闭TCP连接。
第二个SYN+ACK报文丢失 --- 这个报文具有双重作用,一方面对之前SYN进行确认ACK,另一方面本身发送SYN进行请求建立连接。一旦丢失,客户端收不到确认包导致客户端认为自己出现问题进行超时重传,并且服务器收不到客户端发送的ACK也会怀疑自身SYN丢失并触发超时重传机制。两端如果都达到超时重传的最大次数,则都会关闭连接进入CLOSE状态。
第三个ACK报文丢失 --- 在发送这个报文后客户端已经处于ESTABLISHED建立完成状态,而服务器还在等待客户端的ACK,服务器等不到认为自己出现问题触发超时重传机制并再次发送SYN+ACK报文,如果服务器收到客户端ACK则进入建立完成阶段,如果收不到待达到最大重传次数则服务器关闭连接
四次挥手的可靠性保证
与三次握手类似
