传输层的段是否包含 IP 信息?

网络工程 联网 UDP
2022-02-22 19:38:32

我对传输层的 UDP 段如何工作几乎没有疑问。我读到了

传输层将应用层数据与目的IP和目的端口信息一起封装,并传递给网络层。请注意,不包含有关源 IP 或源端口的信息。

如果是这种情况,那么为什么 UDP 数据报头包含一个用于源端口的空格?

在此处输入图像描述

我的另一个问题是,由于在 OSI 模型标头的每一层都被剥离(帧-> 数据包-> 段-> 最后只是应用程序级别的数据)之后,如果 IP 标头,应用程序层如何知道要响应的 IP被剥夺了?

2个回答

这是一个案例,“理论上,理论与实践没有区别,......”

通常,应用程序使用称为套接字的抽象与操作系统的网络堆栈进行交互。套接字,也是在操作系统内部维护的某种对象,包含必要的信息。

如果是这种情况,那么为什么 UDP 数据报头包含一个用于源端口的空格?

UDP 标头必须包含这些值。您的操作系统(或网络堆栈的实现)可以选择何时设置这些值。

坦率地说,我不认为它像描述的那样工作,而是操作系统要求您为套接字指定本地地址,然后才能通过套接字发送数据包。

但这里有一个合理的解释,为什么它可以这样工作。源地址由路由功能决定。您可以有多个网络接口,每个接口都有不同的源地址。然后,您的主机可以配置为将数据包发送到一组目的地到一个地址,另一组目的地发送到另一个地址。然后,在路由决定完成之前,您无法真正设置源地址。在这种情况下,网络层必须设置标头中的值。

实际上更新 ,对不起,那句话没有意义。

传输层将应用层数据与目的IP和目的端口信息一起封装,并传递给网络层。

端口只存在于传输层,因此传输层肯定不会将目的端口传递给网络层。它传递目标(和潜在的源)IP 地址,但不传递端口。

请注意,不包含有关源 IP 或源端口的信息。

在发送数据包之前分配源端口。如果应用程序没有指定源端口,操作系统只会选择一个并将其放入标题中。这实际上与 TCP 相同。启动连接时,您指定目标端口,源端口为您随机选择。

结束更新

我的另一个问题是,由于在 OSI 模型标头中的每一层都被剥离(帧-> 数据包-> 段-> 最后只是应用程序级别的数据)之后,如果 IP 标头,应用程序层如何知道要响应的 IP被剥夺了?

操作系统/网络堆栈必须为您提供这些信息,而它如何做到这一点取决于套接字 API。这是recvfrom的 linux 手册页的链接,检查第二个函数。

通常,层之间相互通信,并且当下层剥离数据包头时,它仍然可以将所有必要的信息从该头传递到上层。这是如何完成的,具体取决于所讨论的网络堆栈是如何实现的。但它必须完成,否则它不能工作。

传输层将应用层数据与目的IP和目的端口信息一起封装,并传递给网络层。

这并不完全正确。虽然传输层确实使用和传递源和目标 IP 信息,但该信息不是由传输层封装,而是由底层网络层封装。

(传输层需要知道IP 地址,因为主机可以有多个接口或 IP 接口绑定。)

为什么UDP数据报头包含一个源端口的空间?

端口是传输层协议(L4)的一个概念。并非所有这些协议都使用端口,但最常见的 TCP 和 UDP 使用。

网络层 (IP) 上没有端口,因此将该字段放在 IP 标头中是没有意义的。

如果 IP 标头已被剥离,应用层如何知道要响应哪个 IP?

IP 标头对应用程序不可见,但其信息是可见的。操作系统堆栈为应用程序使用提供了一个 API,通常是 BSD 样式的套接字。该 API 还提供有关连接伙伴的 IP 和 L4 端口的信息。