前提
- 发送发发送数据时,需要给出一个seq编号。
- 第一个数据包的seq编号是一个随机数, 从第二个开始,seq编号就是【第一次的seq+数据包大小】, 即接收方响应过来的期待数据包编号
ACK机制
- 接收方收到数据后,要给发送方回应一个ACK确认
- 回应的ACK需包含两部分,一部分: 期待收到下一个数据包的编号。 另一部分: 当前接收方的接收窗口剩余的容量
- 当接收方长指定时间内没收到ACK,就会重新发送。
流量控制(属于端对端控制,不算过程中发生的事情)
- 当接收方ACK发送方时,同时会返回一个win=xxx的报文,该win就表示通知发送方,我的缓冲区还能接受多大的数据
- 发送方接收到收到win后,下一次发送数据就不会超过win = xxx这个值,这样就保证了服务端不会因为接收超量的数据而丢包
- 流量控制就是控制发送方不要发送太快,可以让接收方能够及时处理
- 每次数据传递给出ACK时都会携带win。
拥塞控制
- 自适应算法,根据网络环境来发送数据
- 慢启动:
(1). 发送端会以一个较小的数据量进行试探性发送,每接收到一个,窗口值就会翻倍
(2). 如果不丢包,就会加速发送,如果丢包就是降低速率发送
快速重传
- 快速重传: 当发送方在指定时间内每收到ACK回应,就会认为发送失败了,此时会立即重新发送
- 拥塞避免: 当3次收到同样的ACK回应,即回应的ack值都一样3次,就会认为这个包发送失败了,此时会重新发送接收端期待的那个数据
- 缺点: 只会知道某次的数据发送失败了,但发送端并不知道之后的包是否要重发,如下图,发送发仅通过3次相同ACK能判定出第二次的发送失败,但第三第四次是否成功,发送方其实并不知道,所以发送方就不清楚是否要重发第三和第四次的数据包。
超时重传
- 当发送端在超时时间内没有收到ACK,则会认为失败,会发起重传
- 超时重传时间就是RTO, 一般大于RTT(往返时间)