# 用TCP還是UDP
## 用TCP還是UDP
如果我們無法解決TCP內的隊頭阻塞問題,那么按道理,我們應該在網絡棧中發明一個UDP和TCP之外的新型傳輸層協議。或者我們應該用IETF在[RFC 4960](https://tools.ietf.org/html/rfc4960)中標準化的[SCTP](https://en.wikipedia.org/wiki/Stream_Control_Transmission_Protocol)傳輸層協議,它也有多個我們所需的特征。
但在近些年來,因為在互聯網上部署遭遇很大的困難,創造新型傳輸層協議的努力基本上都失敗了。用戶與服務器之間要經過許多防火墻、NAT(地址轉換)、路由器和其他中間設備(middle-box),這些設備有很多只認TCP和UDP。如果使用另一種傳輸層協議,那么就會有N%的連接無法建立,這些中間設備會認為除TCP和UDP協議以外的協議都是不安全或者有問題的。如此高的的失敗率一般被認為不值得再做出努力。
另外,網絡棧中的傳輸層協議改動一般意味著操作系統內核也要做出修改。更新和部署新款操作系統內核的過程十分緩慢,需要付出很大的努力。由IETF標準化的許多TCP新特性都因缺乏廣泛支持而沒有得到廣泛的部署或使用。
## 為什么不基于UDP使用SCTP
SCTP是一個支持數據流的可靠的傳輸層協議,而且在WebRTC上已有基于UDP的對它的實現。
這看上去很好,但與QUIC相比還不夠好,它:
- 沒有解決數據流的隊頭阻塞問題
- 連接建立時需要決定數據流的數量
- 沒有穩固的TLS/安全性支持
- 建立連接時候需要4次握手,而QUIC一次都不用(0-RTT)
- QUIC是類TCP的字節流,而SCTP是信息流(message-based)
- QUIC連接支持IP地址遷移,SCTP不行
若要了解更多SCTP與QUIC的差異,請參閱[A Comparison between SCTP and QUIC](https://tools.ietf.org/html/draft-joseph-quic-comparison-quic-sctp-00)