连接到网站所涉及的详细 OSI 模型步骤是什么?

Ham*_*mmy 3 networking tcpip

使用新连接的计算机(http,并且没有缓存)连接到网站(例如 superuser.com 主页)所涉及的详细步骤是什么?在后台实际发生了什么来构建通过以太网发送的最后一位?

据我所知,例如,进行 DNS 查询以将 FQDN 解析为 IP 地址(第 7 层),或通过三向握手建立连接(第 4 层)。但是,在构建钻头时,这是如何发生的呢?各个层是否保存将成为最终位一部分的数据,而他们自己通过以太网发送查询/数据以收集相关信息/建立连接等?这究竟是如何工作的?

在讨论 OSI 模型或 TCP/IP 模型时,事物通常表现为数据按顺序构建并沿层向下流动,直到它作为一点发送出去,但我一直找不到更详细的解释关于每个方面所涉及的细节,在一个简单的例子中,如连接到一个网站。

Fra*_*mas 6

现在的应用程序使用抽象的高级库来解决网络问题,所以很多都是由操作系统自动完成的。你去的 OSI 越低,它就越自动化,编码人员就越不关心它。由于您的问题是关于数据结构和层,因此无论如何您确实更关心上层,因为下层比其他任何东西都更多地涉及电气工程、固件和驱动程序。在该层,它只是位或电信号。

应用层的作用远比 OSI 模型中显而易见的要多得多,因此您首先应该了解的是应用层驱动一切。在第 3 层和第 4 层创建数据结构的实际工作由在这些层操作的方法(编程函数)处理,但应用层协调每个操作,并将它需要的参数传递给每个方法,所以不,层不不“保存”他们的数据本身,并且事物不一定“传递”到后续层(尽管在某些情况下,它们确实如此)。而是将其视为定义任务的一组函数调用,这样一个函数的输出就是另一个函数的输入。关键是控制点总是在应用层。

因此,正如我在评论中所说,大多数现代应用程序都使用Berkley Sockets API 标准的变体。该库包含在 OSI 层 7、4、3 上运行的方法,并与 OS IP API 挂钩。

  1. 应用程序将调用Sockets.Socket(type)以创建新端口,并返回新端口号。这是一个 layer4 函数。

  2. 应用程序将询问操作系统它的 IP 地址是什么,然后调用Sockets.Bind(newPort, localIPAddr, addrLen)将新套接字附加到 IP 接口。这是一个 layer3 函数。

  3. 应用程序将调用Sockets.Connect(newPort, remoteAddrandPort, addrlen)以通过 TCP 三向握手发起连接。

  4. 这一切都完成后,应用程序可以使用Sockets.Send()Sockets.Recv()函数从套接字读取和写入套接字,就像它是一个 IO 流一样。在内部,Send()/Recv() 调用 sockets 库中定义的私有方法,这些方法封装了每一层的数据,使用前一个结构的输出作为下一个结构的输入,直到它告诉本地 IP 堆栈发送包。在大多数情况下,应用程序根本不知道或不关心第 3 层以下的任何内容,当它们确实关心第 3 或 4 层时,它只是提供有效的参数值。

该应用程序还负责协议命令序列。例如,要连接到超级用户,应用程序必须以HTTP 命令序列进行通信。

要在 superuser.com 上检索默认页面,浏览器将构造序列:

GET / \HTTP/1.1;
Run Code Online (Sandbox Code Playgroud)

应用程序只需将该字符串写入端口,它就会自动封装在一个 TCP 段、一个 IP 数据包和一个 802.11n 帧中,并由硬件转换为电信号。

应用程序可以从网络 IO 流中读取以检索响应,例如

200: <!DOCTYPE html> <html itemscope itemtype="http://schema.org/QAPage"> <head> <title>networking - What are the detailed OSI model....

然后浏览器去掉 200(一个表示 HTTP 命令工作的值,后面是标记),并呈现页面。

所以,我对这个答案并不完全满意,因为我在网络和编码方面花了很多年,才对所有这些在现实中的工作方式有一个整体的心理了解(而不是高度抽象的 OSI),我知道有至少可以从 3 个不同的角度来看待网络连接。在这种情况下,信号处理是正确的,听起来您已经在学习网络专业人士的观点,所以希望这个观点能帮助您更好地理解理论与现实的结合。

编辑:

哦,既然你提到了 DNS,大多数应用程序使用 Sockets getaddrinfo/getnameinfo 方法来执行快速 dns 查询,将 FQDN 作为输入。这些方法在内部创建、bind()、connect()、封装一个 UDP 数据报(注意,DNS 我们通常通过 UDP 执行,尽管大多数系统可以配置为使用 TCP)并发送它,监听响应,将其解析为一个结构,并通过一次调用将其返回给应用程序。它很整洁。其实现在想来,这就是封装的缩影。