在前一章中,我们解释了如何通过不同的层从应用程序发送数据,创建协议数据单元 (PDU) 并通过介质将其传输出去。 在目的主机上,该进程以逆序的方式执行,直到数据传送到正确的应用程序。

一些应用程序需要传输大量的数据,有时能达到很多千兆字节 (GB)。 因此,将所有数据放在一个大数据片段中发送并不现实。 因为这样的话,网络将不能传输其他任何通信, 而且发送大段数据少则需要几分钟,多则需要数个小时。 此外,一旦发生错误,整个数据文件都会丢失或者必须重新发送。 而在数据传输或接收过程中,网络设备中也没有足够的内存缓冲区来存储如此大量的数据。 当然,这种局限性与网络技术和所使用的特定物理介质有关。

如果将应用程序数据分割成若干数据段,既可以保证所传输数据的大小符合传输介质的限制要求,也可以确保不同应用程序发出的数据能在介质中多路传输。

TCP 和 UDP 处理数据段的方式不同

如图所示,每个 TCP 数据段报头都包含一个序列号,以便目的主机上运行的传输层按数据段的传输顺序重组数据段。 这样就确保目的应用程序收到的数据与发送设备发送的数据完全相同。

尽管使用 UDP 的服务也跟踪应用程序间的会话,但它们并不关注信息传输的次序,也不维护连接。 UDP 报头中没有序列号。 与 TCP 相比,UDP 是一种简单设计,所需开销较低,因此数据传输速度较快。

由于不同数据包是经由不同的网络路径传输的,因此信息到达的次序可能不同。 采用 UDP 协议的应用程序必须接受数据到达的顺序和发送的次序不同这一后果。