面经:TCP协议保证可靠传输的机制: 校验和:将发送的数据段都当成是16位整数(将TCP报头和数据一起分成16位的数据段,不足的后面补0),将这些16位的数字相加,最高位的进位放到最后再加一次,最后取反,得到校验和,接收端做相同的计算并和发送端比较,若不一样则发生了传输错误。 序列号:每一个TCP包都包含一个32位的序列号,第三次握手的时候就,可以传送TCP数据了,接收端发送确认消息ack的时候应该是接收到的序列号+1 超时重传:发送的数据包在一定时间内没有收到相应的ACK消息,就重传消息,这个等待时间成为重传超时时间RTO,RTO是根据一个连接的往返时间(RTT)动态确认的,RTT(包括链路传输时间,接受端缓存中排队时间,接收端处理时间),其中第一个和最后一个相对确定,排队时间变化较大,用到的是超时重传计时器。 流量控制:控制发送方的发送速率和接收方匹配,接收方缓存区的剩余大小称为接收窗口,在发送报文的时候会告诉发送方能发送多少,接收窗口为0则发送方就不发送数据了,而是定时发送消息询问接收方,用到的是持续计时器(Persistence timer)。 拥塞控制:首先使用慢开始算法,也是使用一个窗口来记录,叫做拥塞窗口(cwnd),初始大小为1,收到确认报文之后cwnd每次*2,当窗口大小超过预设门限值的时候,采用拥塞避免,拥塞避免每次窗口长度+1,一旦发生丢包,将预设门限值设为丢包时的窗口大小的一半然后重新开始慢开始算法过程。 非拥塞的丢包会导致重新执行慢开始,影响TCP性能,因此有了快重传和快恢复 快重传:接收方提醒发送方不要等待超时重传计时器超时再重传,接收方收到了失序的报文就缓存起来,继续连续发送针对未收到的报文的确认报文,发送方连续收到3个这样的确认报文就立即重传该报文,接收方收到之后会发送之前缓存的所有失序报文已经成功接收,发送方不用再重复发送。 快恢复:发送方连续收到3个这样快重传确认报文,在重传丢失报文之前,会将发送窗口的门限值和发送窗口的大小都设置为当前窗口的一半(或者将拥塞窗口设为当前窗口一半+3),并开始执行拥塞避免算法 连接控制:三次握手和四次挥手(终止连接的时候会有持续时间为报文段期望寿命两倍时间的时间等待计时器(Time_Wait Timer)) 补充:保活计时器(Keeplive Timer):防止TCP两端长时间没有数据传送,浪费连接资源。 参考链接:https://www.bilibili.com/video/BV1c4411d7jb
|