数据包如何准确送达目的程序?

175 阅读6分钟

在网络中,一个文件通常会被拆分为很多数据包进行传输,但是数据包在传输过程中却可能有很大概率会丢失或者出错。因此保证数据包完整送达浏览器就很重要。

接下来我们将讲述数据是如何实现完整可靠的传输。

数据包如何送达目的主机

首先需要考虑的第一点是数据包如何送达我们的主机。

数据包想要在互联网上进行传输,就首先需要符合网际协议标准。互联网上不同的 在线设备 都有唯一的地址,如果我们知道这个唯一的地址,就可以往这个地址发送数据包。计算机的网络地址就叫做 IP 地址(Internet Protocol Address),访问任何的网站,实际上都是我们的计算机向另外一台计算机请求信息。

尽管我们已经有了目的地址的 IP 地址,但是我们在向目的地址请求数据时,仍然需要附上我们源地址的 IP 地址。这是因为有了源地址的 IP 地址,目标地址才能够在收到我们的信息后回复信息到源地址。

计算机网络体系结构分为了若干层,由于底层(如物理层、数据链路层)的诸多知识并不是我们在此处需要关注的内容,因此在考虑当前问题下,我们将计算机网络结构简单视为从上到下的三层:应用层、网络层与底层。

我们将发送方称为 A,接受方称为 B,那么可以将数据包的传送简化为下面几个步骤:

  1. A 的应用层将数据发送给到 A 的网络层(此时数据就已经包含了源地址的 IP 地址)。
  2. A 的网络层在数据上添加目的地址 B 的 IP 地址。
  3. A 的网络层通过底层将新数据包传输到 B 的网络层。
  4. B 的网络层解析数据包得到 A 的 IP 地址,并将我们所发送的数据发送给 B 的应用层。
  5. B 的应用层最终收到了我们发送的数据包。

数据包如何送达应用程序

在上面所讲的三个层次中,我们要注意的是上层并不等同于我们的应用程序。而是应用程序被包含于上层。因此尽管我们已经将数据包发送到了目的地址的上层,但并不代表数据包已经送达了目的地址所对应的应用程序。

相对来说,IP 协议仍然是较为底层的协议,只负责将数据包传送到目的地址的电脑。而在当前情况下,电脑仍然不知道数据包应该交给哪一个应用程序,因此我们就需要与应用程序打交道的协议,在这中间最常见的便是 UDPUser Datagram Protocol 应用户数据包协议)。

UDP 中⼀个最重要的信息是 端口号,我们可以将端口号简单视作一个数值,每个想访问网络的程序都需要绑定⼀个端⼝号。UDP 协议便是通过端口号将指定的数据包发送给指定的程序。

与第一部分介绍的「应用层-网络层-底层」三层模型不一样的是,我们此处添加了「传输层」,变为「应用层—传输层—网络层—底层」四层模型。当数据包传输到 B 的传输层时,传输层便会将目的地址与源地址的端口号添加至数据包。

上面介绍的便是 UDP 协议如何实现将数据包送达应用程序,但是由于 UDP 是 无连接 协议,因此 UDP 协议存在下面两个缺点:

  1. 数据包在传输过程中容易丢失。尽管 UDP 协议提供了校验数据的方式,但是并不提供重发机制,而是在检验数据出错后,直接丢弃该数据。由于 UDP 协议并不会返回确认信息,因此我们也无法确定数据通过 UDP 协议发送后是否正确到达了目的地。

尽管 UDP 协议不能可靠保证数据传输,但是传输速度却非常快。因此,UDP 协议更多会应用在⼀些关注传输速度,但不那么严格要求数据完整性的领域。

  1. 大文件会被拆分成很多小的数据包来传输,这些小的数据包会经过不同的路由,并在不同的时间到达接收端,而 UDP 协议并不知道如何组装这些数据包,从而把这些数据包还原成完整的文件。

数据包如何完整送达应用程序

要注意的是,第二部分的 UDP 协议关注的是「如何送达」,而这一部分介绍的 TCP 协议关注的是「如何完整送达」。

TCPTransmission Control Protocol 传输控制协议)是⼀种面向连接、可靠的、基于字节流的传输层通信协议。

相对于 UDP,TCP 有以下两个特点:

  • TCP 提供了重传机制。
  • TCP 引入了数据包排序机制,从而实现顺序组合数据包。

因此,相比于 UDP 只提供了目的地址与原地址的端口号,TCP 还提供了用于排序的序列号。

一个完整的 TCP 链接的生命周期包括「建立连接」、「传输数据」和「断开连接」三个阶段:

  1. ⾸先,简历连接阶段。 这个阶段是通过「三次握手」来建立客户端和服务器之间的连接。
  2. 其次,传输数据阶段。 在该阶段,接收端需要对每个数据包进⾏确认操作,确认无误后,接收端将会发送确认数据包给发送端。所以当发送端发送了⼀个数据包之后,在规定时间内没有接收到接收端反馈的确认消息,则判断为数据包丢失,并触发发送端的重发机制。同样,⼀个大的⽂件在传输过程中会被拆分成很多⼩的数据包,这些数据包到达接收端后,接收端会按照 TCP 头中的序号为其排序,从而保证组成完整的数据。
  3. 最后,断开连接阶段。数据传输完毕之后,就要终止连接了,涉及到最后⼀个阶段「四次挥手」来保证双方都能断开连接。

此处不具体介绍「三次握手」与「四次挥手」。