携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第25天,点击查看活动详情 >>
从输入网址开始说起
相信各位朋友对计算机网络已经非常熟悉了,本着查漏补缺的初心,咱们今天就一起来学习一下吧。
(1)生成HTTP请求信息
在生成HTTP请求信息之前,浏览器需要对URL进行解析,因为只有这样它才知道即将要访问的服务器及其资源等。换句话说,浏览器生成HTTP请求信息需要用到对URL解析的结果。
下面给出一个HTTP请求信息的例子:
(2)进行DNS域名解析
在这一步最主要的是要找出web服务器所对应的IP地址,因为操作系统内的网络通信是基于IP来的,而不是基于域名(域名只是为了用户方便而使用)
使用DNS对域名解析,其实就是使用解析器。电脑设备上都会有DNS客户端,而DNS解析器其实是一段程序,它包含在操作系统的Socket库中。应用程序只需要调用相应的组件即可。
下面给出DNS的一般流程图:
具体的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库的一部分组件以及协议栈的网络通信功能。