【网络通信】从输入网址开始说起(原理 + 例子 + 详解)

517 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第25天,点击查看活动详情 >>

从输入网址开始说起

相信各位朋友对计算机网络已经非常熟悉了,本着查漏补缺的初心,咱们今天就一起来学习一下吧。

(1)生成HTTP请求信息

在生成HTTP请求信息之前,浏览器需要对URL进行解析,因为只有这样它才知道即将要访问的服务器及其资源等。换句话说,浏览器生成HTTP请求信息需要用到对URL解析的结果。

下面给出一个HTTP请求信息的例子:

image.png

(2)进行DNS域名解析

在这一步最主要的是要找出web服务器所对应的IP地址,因为操作系统内的网络通信是基于IP来的,而不是基于域名(域名只是为了用户方便而使用)

使用DNS对域名解析,其实就是使用解析器。电脑设备上都会有DNS客户端,而DNS解析器其实是一段程序,它包含在操作系统的Socket库中。应用程序只需要调用相应的组件即可。

下面给出DNS的一般流程图:

image.png

具体的DNS解析过程,请参考上篇文章:【DNS解析】多DNS服务器接力解析IP(原理 + 例子 + 图解) - 掘金 (juejin.cn)

(3)委托协议栈发送信息

创建套接字:

客户端调用Socket库中的socket程序组件,可在协议栈中创建套件字,并返回相应的描述符(用于区别不同套接字的)

其实套件字的实体就是一些通信控制信息,包括通信对象的IP,端口,操作状态等。

连接服务器(准备阶段):

在上一步创建套件字的时候,其实它的通信控制信息是空白的,也就是说刚创建套接字的时候,它连通信对象都不知道,这也就是什么需要这一步了。在这一步中,会将通信对象的IP等信息,通过connect组件告诉协议栈。

而另一边,web服务器在创建后套件字之后,它也不知道会合谁连接,这就等客户端发来的SYN = 1的报文之后,才知道。因为该报文携带着客户端相关的通信控制信息。

其实通俗点来说,连接服务器这个阶段是三次握手阶段,它是为了后面真正收发数据做准备的。

(4)收发数据

经过了以上操作之后,客户端和服务器的通信就已经连接上了,他们可以正常进行数据的收发了。

客户端发送数据调用的是Socket库中的write组件(需要指定描述符和发送数据0,在调用该组件之后,操作系统的协议栈就会将数据发送给服务器。

而另一边,服务器时调用Socket库中的read组件进行数据接收的。

(5)结束连接

当客户端和服务器的数据通信已经结束了,就可以调用Socket库中的close组件进行连接的断开。

其实通俗点来说,在这个阶段进行的主要是四次挥手阶段。

总结

这一次,我们从输入网址开始说起,主要讲述了网络通信是如何连接起来的,在这个过程汇中我们讲述了Socket库的一部分组件以及协议栈的网络通信功能。