我们从研究传输层协议可以提供给网络应用程序的服务开始本章。在一个极端,传输层协议可以非常简单,并为应用程序提供简单的服务,仅为通信进程提供多路复用/多路分解功能。互联网的UDP协议就是这样一个简单的传输层协议的例子。在另一个极端,传输层协议可以为应用程序提供各种保证,如数据的可靠传递、延迟保证和带宽保证。然而,传输协议能够提供的服务常常受到底层网络层协议的服务模型的约束。如果网络层协议不能为传输层段提供延迟或带宽保证,那么传输层协议就不能为进程之间发送的消息提供延迟或带宽保证。<br />在第3.4节中我们了解到,即使底层网络层不可靠,传输层协议也能提供可靠的数据传输。我们看到,提供可靠的数据传输有许多微妙之处,但是这个任务可以通过仔细地组合确认、计时器、重传和序列号(acknowledgments, timers, retransmissions, and sequence numbers)来完成。<br />虽然我们在本章中介绍了可靠的数据传输,但我们应该记住,可靠的数据传输可以通过链路、网络、传输或应用层协议提供。协议栈的上面四层中的任何一层都可以实现确认、计时器、重传和序列号,并向上面一层提供可靠的数据传输。事实上,多年来,工程师和计算机科学家已经独立设计和实现了提供可靠数据传输的链路、网络、传输和应用层协议(尽管许多协议已经悄然消失)。<br />在第3.5节中,我们详细介绍了TCP, Internet的面向连接和可靠的传输层协议。我们了解到TCP是复杂的,涉及连接管理、流量控制、往返时间估计以及可靠的数据传输(connection management, flow control, and round-trip time estimation, as well as reliable data transfer)。事实上,TCP实际上比我们所描述的要复杂——我们有意不讨论TCP的各种版本中广泛实现的各种TCP补丁、修复和改进。然而,所有这些复杂性对网络应用程序都是隐藏的。如果一台主机上的客户机想要可靠地向另一台主机上的服务器发送数据,它只需打开到服务器的TCP套接字并将数据注入该套接字。客户机-服务器应用程序完全不知道TCP的复杂性。<br />在第3.6节中,我们从一个广泛的角度研究了拥塞控制,在第3.7节中,我们展示了TCP如何实现拥塞控制。我们了解到拥塞控制对于网络的健康发展是必不可少的。如果没有拥塞控制,网络很容易陷入阻塞,端到端传输的数据很少或根本没有。在3.7节中,我们了解到经典TCP实现了端到端拥塞控制机制,当 TCP 连接的路径被判断为无拥塞时,它会加性地增加其传输速率,并在发生丢失时乘性地降低其传输速率。这种机制也努力给每个通过拥塞链路的TCP连接分配相同的链路带宽。我们还研究了TCP拥塞控制的几个新变体,它们试图比传统TCP更快地确定TCP的发送速率,使用基于延迟的方法或显式网络拥塞通知(而不是基于丢失的方法)来确定TCP的发送速率。我们还深入研究了TCP连接建立和缓慢启动对延迟的影响。我们观察到,在许多重要的场景中,连接建立和缓慢启动显著地导致端到端延迟。我们再次强调,虽然TCP拥塞控制已经发展了多年,但它仍然是一个深入研究的领域,并可能在未来几年继续发展。为了总结本章,在3.8节中,我们研究了在使用QUIC协议的应用层中实现传输层的许多功能——可靠数据传输、拥塞控制、连接建立等等——的最新进展。<br />在第 1 章中,我们说过计算机网络可以划分为“网络边缘”和“网络核心”。 网络边缘涵盖了终端系统中发生的一切。 现在已经涵盖了应用层和传输层,我们对网络边缘的讨论就完成了。 是时候探索网络核心了! 这个旅程从接下来的两章开始,我们将学习网络层,并继续到第 6 章,我们将学习链路层。