本篇文章诶学习 程序员乔戈里 的一篇微信推文的学习笔记,非原创,侵删。
TCP
TCP通过序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现可靠性传输。
一、重传机制
当TCP针对数据包丢失的情况,会用重传机制解决。
以下四种是常见的重传机制。
1、 超时重传
发送数据后,设定一个定时器,当超过指定时间后,没有收到对方的 ACK 确认应答报文后,就会重发该数据。
超时重传的原因:
- 数据包丢失
- 确认应答丢失
注:可以这样想,超时重传发生了,那么应该是一段时间内没收到ACK了,这时,丢弃的包一般是大量的;如果只是某个ACK丢了,大有后面的 D-SACK 来解决哦。
超时时间(RTO Retransmission Timeout)应该设置为多少呢?
略大于RTT(Round-Trip Time 往返时延)
- 太大的话,重发就很慢,丢了老半天才重发,没有效率,性能差
- 太小的话,导致没有丢就重发,增加网络拥塞(负担),导致更多的超时,导致更多的重发。
2、 快速重传(Fast Retransmit)
不以时间为驱动,以数据驱动重传。
什么意思呢?
当发送端收到了三个相同的ACK,就说明之前的SEQ还没有收到,就会在定时器过期之前,重传丢失的SEQ。
注:快速重传发生了,一般是某一个包丢失了,导致连续收到的三个 ACK 都是一样的。
3、 SACK
SACK(selective ACknowledge 选择性确认) 。
该方式需要在TCP头部 [选项] 字段里加一个 SACK 的东西。它可以将缓存的地图发给发送方。
发送方收到后就可以知道哪些数据丢失,哪些需要重传。
注:如果要支持 SCAK,必须双方都支持。
在Linux下,可以通过 net.ipv4.tcp_sack 参数打开这个功能。