HTTP 3.0徹底放棄TCP,TCP到底做錯了什麼?

2022.07.05
HTTP 3.0徹底放棄TCP,TCP到底做錯了什麼?

基於上面我們提到的兩個問題,有人提出來說:既然TCP存在這些問題,並且我們也知道這些問題的存在,甚至解決方案也不難想到,為什麼不能對協議本身做一次升級,解決這些問題呢?

​從HTTP/1.0開始,一直到HTTP/2,不管應用層協議如何改進,TCP一直以來都是HTTP協議的基礎,主要是因為他能提供可靠連接。

但是,從HTTP 3.0開始,這個情況就有所變化了。

因為,在最新推出的HTTP 3.0中,已經徹底啟用TCP協議了。

TCP隊頭阻塞

我們知道,TCP傳輸過程中會把數據拆分為一個個**按照順序**排列的數據包,這些數據包通過網絡傳輸到了接收端,接收端再**按照順序**將這些數據包組合成原始數據,這樣就完成了數據傳輸。

但是如果其中的某一個數據包沒有按照順序到達,接收端會一直保持連接等待數據包返回,這時候就會阻塞後續請求。這就發生了**TCP隊頭阻塞。**

HTTP/1.1的管道化持久連接也是使得同一個TCP鏈接可以被多個HTTP使用,但是HTTP/1.1中規定一個域名可以有6個TCP連接。而HTTP/2中,同一個域名只是用一個TCP連接。

所以,在HTTP/2中,TCP隊頭阻塞造成的影響會更大,因為HTTP/2的多路復用技術使得多個請求其實是基於同一個TCP連接的,那如果某一個請求造成了TCP隊頭阻塞,那麼多個請求都會受到影響。

TCP握手時長

我們都知道TCP的可靠連接是基於三次握手與四次揮手實現的。但是問題是三次握手是需要消耗時間的。

TCP三次握手的過程客戶端和服務器之間需要交互三次,那麼也就是說需要額外消耗1.5 RTT。

> RTT:網絡延遲(Round Trip Time)。他是指一個請求從客戶端瀏覽器發送一個請求數據包到服務器,再從服務器得到響應數據包的這段時間。RTT 是反映網絡性能的一個重要指標。

在客戶端和服務端距離比較遠的情況下,如果一個RTT達到300-400ms,那麼我握手過程就會顯得很”慢”了。

升級TCP

基於上面我們提到的兩個問題,有人提出來說:既然TCP存在這些問題,並且我們也知道這些問題的存在,甚至解決方案也不難想到,為什麼不能對協議本身做一次升級,解決這些問題呢?

其實,這就涉及到一個”協議僵化“的問題。

這樣講,我們在互聯網上瀏覽數據的時候,數據的傳輸過程其實是極其複雜的。

我們知道的,想要在家裡使用網絡有幾個前提,首先我們要通過運行商開通網絡,並且需要使用路由器,而路由器就是網絡傳輸過程中的一個中間設備。

中间设备是指插入在数据终端和信号转换设备之间,完成调制前或解调后某些附加功能的辅助设备。例如集线器、交换机和无线接入点、路由器、安全解调器、通信服务器等都是中间设备。

在我们看不到的地方,这种中间设备还有很多很多,一个网络需要经过无数个中间设备的转发才能到达终端用户。

如果TCP协议需要升级,那么意味着需要这些中间设备都能支持新的特性,我们知道路由器我们可以重新换一个,但是其他的那些中间设备呢?尤其是那些比较大型的设备呢?更换起来的成本是巨大的。

而且,除了中间设备之外,操作系统也是一个重要的因素,因为TCP协议需要通过操作系统内核来实现,而操作系统的更新也是非常滞后的。

所以,这种问题就被称之为”中间设备僵化”,也是导致”协议僵化”的重要原因。这也是限制着TCP协议更新的一个重要原因。

所以,近些年来,由IETF标准化的许多TCP新特性都因缺乏广泛支持而没有得到广泛的部署或使用!

QUIC

所以,摆在HTTP/3.0面前的就只有一条路,那就是放弃TCP。

于是,HTTP/3.0在基于UDP+迪菲赫尔曼算法(Diffie–Hellman)之上实现了QUIC协议(Quick UDP Internet Connections)。

QUIC协议有以下特点:

基于UDP的传输层协议:它使用UDP端口号来识别指定机器上的特定服务器。

可靠性:虽然UDP是不可靠传输协议,但是QUIC在UDP的基础上做了些改造,使得他提供了和TCP类似的可靠性。它提供了数据包重传、拥塞控制、调整传输节奏以及其他一些TCP中存在的特性。

 实现了无序、并发字节流:QUIC的单个数据流可以保证有序交付,但多个数据流之间可能乱序,这意味着单个数据流的传输是按序的,但是多个数据流中接收方收到的顺序可能与发送方的发送顺序不同!

快速握手:QUIC提供0-RTT和1-RTT的连接建立

使用TLS 1.3传输层安全协议:与更早的TLS版本相比,TLS 1.3有着很多优点,但使用它的最主要原因是其握手所花费的往返次数更低,从而能降低协议的延迟。

阻碍

以上,我们介绍了很多QUIC的相比较于TCP的优点,可以说这种协议相比较于TCP确实要优秀一些。

因为他是基于UDP的,并没有改变UDP协议本身,只是做了一些增强,虽然可以避开中间设备僵化的问题,但是,在推广上面也不是完全没有问题的。

首先,很多企业、运营商和组织对53端口(DNS)以外的UDP流量会进行拦截或者限流,因为这些流量近来常被滥用于攻击。

特别是一些现有的UDP协议和实现易受放大攻击(amplification attack)威胁,攻击者可以控制无辜的主机向受害者投放发送大量的流量。

所以,基于UDP的QUIC协议的传输可能会受到屏蔽。

另外,因为UDP一直以来定位都是不可靠连接,所以有很多中间设备对于他的支持和优化程度并不高,所以,出现丢包的可能性还是有的。。。

但是不管怎么样,HTTP/3.0的时代一定会到来的,QUIC协议全面代替TCP的时代也会到来的,让我们拭目以待吧。​