在 ISO 模型中,网络层和应用层如何分别知道帧和段何时完成

网络工程 奥西
2022-02-12 14:12:25

我了解 ISO 模型的一般意义,但我的理解是来自应用程序层的通常很大的数据会分成许多 TCP 数据包。同样的事情也会发生在数据链路层上,它将来自第 3 层的 IP 数据包分成帧。看看这张图片。

我的问题是第 3 层网络和第 5 层数据 (TCP/IP) 如何知道它们何时拥有来自较低层的所有数据。

如果不清楚我的意思是我是否有 HTTP 请求;这将被分成许多 TCP(第 4 层)数据包。某处某台计算机会收到这些 TCP 数据包,但我怎么知道这些数据包是否足以让我查看整个 HTTP 请求。第 4 层是否只是连续附加数据包,而第 5 层可以查看它拥有的数据并确定这是否是一个完整的 HTTP 请求。HTTP 请求中是否有信息表明这是 HTTP 请求的结束。

这也适用于第 3 层。因为 IP 数据包被分成帧;网络层(3)是否有办法在接收到一些以太网帧后确定它有一个完整的 TCP 数据包。

我试图了解第 3 层(较低层)帧本身是否有一种说法,这是一个完整 IP 数据包的结束,或者以太网帧是否只是不断附加,这取决于第 3 层(较高层)说这是一个完整的 IP 数据包,与第 4 层和第 5 层相同。

2个回答

在现实世界中,每个数据链路协议都有自己的方法来确定它是否收到了完整的帧。例如,以太网具有包间间隙和 FCS。如果帧未能通过 FCS(损坏的帧、太小、太大等),则会丢弃该帧。如果一切都通过,它将帧有效负载发送到由以太类型字段指示的进程,例如 IPv4。

IP,无论是 IPv4 还是 IPv6,在 IP 标头中都有一个长度字段。IPv4 有一个总长度字段,可以从中得出有效载荷长度,而 IPv6 有一个有效载荷长度字段。IP 会将数据包有效负载传递给由协议字段 (IPv4) 或 Next Header 字段 (IPv6) 指示的进程(UDP、TCP 等)。

一些传输协议将端口号用于接收数据报有效负载的进程。TCP 和 UDP 在它们的报头中都有一个 Length 字段,可以从中得出有效负载长度。两者都会将有效负载发送到为标头中的端口号注册的进程。

UDP 是一种基于消息的协议,它只是在收到有效载荷时发送。TCP 是一种流式协议,它通常会缓冲数据并在缓冲区满时将其发送给应用程序,或者如果它得到一个立即发送的标志。它真正做的是特定于操作系统实现的(这里是题外话)。

层(在任何模型中)的特征之一是抽象。分层将信息抽象为数据“向上移动”层。

在您的 HTTP 情况下,这些层抽象了所有网络、碎片、验证成数据流。对于您的应用程序,它所知道的只是获取数据流。该数据如何到达是从浏览器中抽象(隐藏)的。

由应用程序(您的浏览器)来理解它并决定它是否收到了有效的 HTTP 消息。