对层中 TCP/IP 数据流的混淆

网络工程 ip tcp 互联网 奥西
2022-02-27 11:25:52

我对数据如何在 TCP/IP 模型的各个层中流动感到困惑,所以我将告诉我我认为它会发生什么(使用电子邮件示例),如果您能指出我的错误,我将不胜感激。


假设 A 想通过 gmail 向 B 发送电子邮件。A 打开 gmail,写入文本并发送。此时,gmail 调用Application Layer,它将为 gmail 提供正确的电子邮件协议(在本例中是 IMAP,但它可以是 SMTP 或 POP3)。这些协议所做的就是将该电子邮件变成一个“盒子”,其中仅包含该电子邮件的二进制表示,其方式只有相同的协议可以解释:它可以被加密、压缩等。在此之前,没有“盒子”中的地址,只有纯数据,而“盒子”是单个数据单元(可以非常大)。“盒子”的名称是data

然后,数据被提供给传输层(假设它使用 TCP),它将处理端口。我的困惑从这里开始。假设 gmail 选项卡使用端口 1000 来建立连接,IMAP 端口是 143。我读过传输层在数据太大时将数据分成多个部分。在每个部分(称为)中,它添加了一些东西:源端口和目标端口以及一些安全/完整性信息(校验和等)。

  • 这些始发港和目的港是什么?
  • 是将大文件分成几部分的传输层还是已经从应用层中分离出来?

然后是Internet 层,它获取分段并在其上添加源 IP 地址和目标 IP 地址,将分段转换为数据包

  • Internet 层如何找出目标 IP 地址?

最后,网络访问层使用 ARP 协议,找出目标 IP 的 MAC 地址,并将源 MAC 地址和目标 MAC 地址添加到数据包中,将它们转换为,然后使用以下协议在网络上物理发送,例如WiFi、以太网等

1个回答

这些始发港和目的港是什么?

源/源端口由客户端随机选择。目的端口由应用程序确定。

例如,如果我正在发出 Web 请求 (HTTP),我的目标端口将是 TCP 端口 80,而我的源端口将是随机选择的。

为了更进一步,让我们使用您的示例:

gmail 选项卡使用端口1000来建立连接,IMAP 端口是 143。

假设您的 IP 地址是 1.1.1.1,Gmail 的 IP 地址是 9.9.9.9。我还将源端口更改为 2222,因为随机源端口的典型范围是 1024-65535

当您发出请求时,数据包 L3/L4 属性将如下所示:

SRC:  1.1.1.1:2222
DST:  9.9.9.9:143

gmail 服务器在端口 143 上“侦听”传入的 IMAP 请求。收到该数据包后,它会生成响应,并且响应具有反向 L3/L4 属性作为初始数据包:

SRC:  9.9.9.9:143
DST:  1.1.1.1:2222

响应被发送到目标端口 2222。您的操作系统已保留此端口,因此“侦听”对出站数据包的响应

所以你看,端口并没有被浪费。该端口用于侦听传入流量。运行 IMAP 软件的 Gmail 正在侦听端口 143 上的传入请求。向 Gmail 发送 IMAP 请求的客户端正在侦听端口 2222(您随机选择的端口号)上的响应。

一旦“对话”完成,您的操作系统将释放端口 2222,这将允许其他连接再次随机使用该端口来处理未来的入站响应流量。

是将大文件分成几部分的传输层还是已经从应用层中分离出来?

这在各种实现中有所不同,但通常 TCP 能够将数据块分割成必要的大小以通过线路发送。因此,在 TCP 的情况下,应用程序可以发送要发送的整个数据“块”,并让 TCP 根据需要将其分解。

UDP 没有这个能力。如果应用程序打算使用 UDP 发送一个大文件,它必须将文件分成适合网络路径的部分。

Internet 层如何找出目标 IP 地址?

通过外部进程。

例如,如果您在命令提示符中键入“ping 8.8.8.8”,则您(用户)提供了 IP 地址 8.8.8.8。

如果您在网络浏览器中键入“google.com”,那么您的操作系统将使用 DNS 将“google.com”转换为 IP 地址,现在您的网络浏览器知道将网络流量发送到的 IP 地址。


我建议通读这篇文章(以及它来自的整个系列):

https://www.practicalnetworking.net/series/packet-traveling/osi-model/

它讨论了数据包通过网络移动所需的各种步骤。

免责声明:博客/文章是我自己的。它没有广告,没有货币化,我只是为了让读者受益。