为什么TCP会被UDP代替
TCP 行使三次握手成立连策应该是全天下全部工程师都异常相识的常识点,三次握手的首要目标是停止汗青错误毗连的成立并让通讯的两边确定初始序列号[^12],然而三次握手的本钱相等高,在不丢包的环境下,它必要成立 TCP 毗连的两边举办三次通讯。 basic-3-way-handshake 图 3 - 常见的 TCP 三次握手 假如我们要从北京会见上海的处事器,因为北京到上海的直线间隔约为 1000 多公里,而光速是今朝通讯速率的极限,以是 RTT 必然会大于 6.7ms: 然而由于光在光纤中不是直线撒播的,真正的传输速率会比光速慢 ~31%[^13],并且数据必要在各类收集装备之间往返跳转,以是很难到达理论的极限值。在出产情形中从北京到上海的 RTT 或许在 40ms 阁下,以是 TCP 成立毗连所必要最短时刻也必要 60ms(1.5RTT)。 在收集情形较差的地铁、趁魅站等场景中,由于丢包率较高,客户端很难与处事端快速完成三次通讯并成立 TCP 毗连。当客户端长时刻没有收随处事端的相应时,只能不绝提倡重试,跟着哀求次数逐渐增进,会见的耽误也会越来越高。 因为大大都的 HTTP 哀求都不会携带大量的数据,未被压缩的哀求和相应头巨细在 ~200B 到 2KB 阁下,而 TCP 三次握手带来的特殊开销是 222 字节,个中以太网数据帧占 3 * 14 = 42字节,IP 数据帧占 3 * 20 = 60 字节,TCP 数据帧占 120 字节: tcp-three-way-handshake-overhead 图 4 - TCP 三次握手的特殊开销 固然 TCP 不会为每一个发出的数据段成立毗连,可是三次握手成立毗连必要的本钱照旧相等高,不只必要特殊增进 1.5RTT 的收集延时,还必要增进 222 字节的特殊开销,以是在弱网情形下,通过三次握手成立毗连会加剧 TCP 的机能题目。 重传机制 TCP 传输的靠得住性是通过序列号和吸取方的 ACK 来担保的,当 TCP 传输一个数据段时,它会将该数据段的副本放到重传行列上并开启计时器[^14]: 假如发送方收到了该数据段对应的 ACK 相应,当前数据段就会从重传行列中删除; 假如发送方在计时器到期之间都没有收到该数据段对应的 ACK,就会从头发送当前数据段; TCP 的 ACK 机制也许会导致发送方从头传输吸取方已经收到了数据段。TCP 中的 ACK 动静暗示该动静之前的所有动静都已经被乐成吸取和处理赏罚,譬喻: 发送偏向吸取方发送了序号为 1-10 的动静; 吸取偏向发送方发送 ACK 8 相应; 发送方以为序号为 1-8 的动静已经被乐成吸取; 这种 ACK 的方法在实现上较量简朴,更轻易担保动静的次序性,可是在以下环境也许会导致发送方重传已经吸取的数据: tcp-retransmission-al 图 5 - TCP 的重传计策 如上图所示,吸取方已经收到了序号为 2-5 的数据,可是因为 TCP ACK 的语义是当前数据段前的所稀有据段都已经被吸取和处理赏罚,以是吸取方无法发送 ACK 动静,因为发送方没有收到 ACK,全部数据段对应的计时器就会超时并从头传输数据。在丢包较为严峻的收集下,这种重传机制会造成大量的带宽挥霍。 总结 TCP 协议的一些计划在本日来看固然如故具有庞大的代价,可是并不能合用于全部场景。为了办理 TCP 的机能题目,今朝业界有两种办理方案: 行使 UDP 构建机能越发优秀、更机动的传输协议,譬喻:QUIC[^15] 等; 通过差异的本领优化 TCP 协议的机能,譬喻:选择性 ACK(Selective ACK, SACK)[^16],TCP 快开启(TCP Fast Open, TFO)[^17]; 因为 TCP 协议在操纵体系内核中,倒霉于协议的更新,以是第一种方案今朝成长的更好,HTTP/3 就行使了 QUIC 作为传输协议[^18]。我们在这里从头回首一下导致 TCP 机能题目的三个重要缘故起因: TCP 的拥塞节制在产生丢包时会举办退让,镌汰可以或许发送的数据段数目,可是丢包并不必然意味着收集拥塞,更多的也许是收集状况较差; TCP 的三次握手带来了特殊开销,这些开销不但包罗必要传输更多的数据,还增进了初次传输数据的收集耽误; TCP 的重传机制在数据包丢失时也许会从头传输已经乐成吸取的数据段,造成带宽的挥霍; TCP 协议作为互联网数据传输的基石可以说是当之无愧,固然它确其实应对非凡场景时有些题目,可是它的计划头脑有着很是多的小心意义并值得我们进修。 到最后,我们照旧来看一些较量开放的相干题目,有乐趣的读者可以细心思索一下下面的题目: QUIC 协议是可否担保丢包率较高时的传输机能? 除了 SACK 和 TFO 之外尚有哪些本领可以优化 TCP 的机能? 假如对文章中的内容有疑问可能想要相识更多软件工程上一些计划决定背后的缘故起因,可以在博客下面留言,作者会实时回覆本文相干的疑问并选择个中吻合的主题作为后续的内容。 [^1]: TCP Selective Acknowledgment Options, October 1996 https://tools.ietf.org/html/rfc2018 [^2]: KCP - A Fast and Reliable ARQ Protocol https://github.com/skywind3000/kcp [^3]: Measuring Network Performance: Links Between Latency, Throughput and Packet Loss https://accedian.com/enterprises/blog/measuring-network-performance-latency-throughput-packet-loss/ [^4]: Wikipedia: TCP congestion control https://en.wikipedia.org/wiki/TCP_congestion_control [^5]: Wikipedia: Network congestion https://en.wikipedia.org/wiki/Network_congestion#Congestive_collapse [^6]: Wikipedia: Additive increase/multiplicative decrease https://en.wikipedia.org/wiki/Additive_increase/multiplicative_decrease [^7]: Bandwidth-delay product https://en.wikipedia.org/wiki/Bandwidth-delay_product [^8]: TCP_INIT_CWND https://github.com/torvalds/linux/blob/738d2902773e30939a982c8df7a7f94293659810/include/net/tcp.h#L226 [^9]: RFC2414 Increasing TCP's Initial Window https://tools.ietf.org/html/rfc2414 [^10]: RFC3390 Increasing TCP's Initial Window https://tools.ietf.org/html/rfc3390 [^11]: RFC6928 Increasing TCP's Initial Window https://tools.ietf.org/html/rfc6928 [^12]: 为什么 TCP 成立毗连必要三次握手, October 2019 https://draveness.me/whys-the-design-tcp-three-way-handshake (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |