计算机网络知识总结
一、TCP流量控制
TCP
用滑动窗口做流量控制,TCP
头里有一个字段叫Advised Window
,用来通知发送方自己还有多少缓存区可以用来接收数据。而发送方根据接收方的处理能力来处理数据,避免发送数据过多,接收方处理不过来。
计算方法:
- 接收方在
Ack
中记录自己的AdvertisedWindow
=MaxRcvBuffer
– (LastByteRcvd
-LastByteRead
),随Ack
回复到发送方。 - 发送方根据
Ack
中的AdvertisedWindow
值,需保证LastByteSent
-LastByteAcked
≤AdvertisedWindow
,则窗口内剩余可发送的数据大小EffectiveWindow
=AdvertisedWindow
- (LastByteSent
-LastByteAcked
),以保证接收方可以处理。(就是说保证已经发送过去待确认的数据+这次即将发送的数据 <=AdvertisedWindow
)。
二、QUIC(HTPP/3.0)
1.为什么需要QUIC?
在HTTP2.0
的版本中,已经实现了多路复用,但是TCP
报文数据是依赖报文数据之间的顺序的,所以HTTP2.0
并没有从根本上解决队头阻塞的问题。Google
考虑到修改TCP
协议难度较大,而使用UDP
并不需要三次握手,可以从根本上解决队头阻塞的问题。因此对UDP
下手,基于UDP
提出了QUIC
(Quick UDP Internet Connections
)。
2.QUIC的特点
- 与
TCP
不同,不需要三次握手来建立链接 - 实现了自己的加密层,也不不需要
TLS
,TLS
握手也避免了 - 由于
UDP
数据包不依赖于数据包的顺序,因此从根本上解决了队头阻塞问题 - 由于
UDP
并没有建立链接,没有重传机制,但是有自己的前向纠错机制:发送的每个数据包还包含了足够的其他数据包的数据,可以重建出丢失的数据 TCP
的链接依赖IP
和端口号,只要有一个发生了变化,就得重新建立链接,这使得移动端的网络体验会因为wifi
的切换或者基站的切换而变差。而QUIC
拥有自己的标识符(Connection UUID
),不依赖于IP
和端口号,不会因为上述问题导致重连。
参考博文:
[1]: https://juejin.cn/post/6844903588922130440
[2]: https://ma.ttias.be/googles-quic-protocol-moving-web-tcp-udp/#why-fewer-packets-matter-so-much