1.常规的网络交互过程是从客户端发起网络请求,用户态的应用程序(浏览器)会生成 HTTP 请求报文、并通过 DNS 协议查找到对应的远端 IP 地址 。
2.在套接字生成之后进入内核态,浏览器会委托操作系统内核协议栈中的上半部分,也就是 TCP/UDP 协议发起连接请求 。
3.然后经由协议栈下半部分的 IP 协议进行封装,使数据包具有远程定位能力 。
4.经过 mac 层处理,找到接收方的目标 MAC 地址 。
5.最终数据包在经过网卡转化成电信号经过交换机、路由器发送到服务端,服务端经过处理拿到数据,再通过各种网络协议把数据响应给客户端 。
6.客户端拿到数据进行渲染
7.客户端和服务端之间反复交换数据,客户端的页面数据就会发生变化 。刚才的过程中,提到了多个层级和网络协议,那么网络为什么要分层呢?网络协议又是什么?
前置知识:网络分层和网络协议在计算机网络时代初期,各大厂商推出了不同的网络架构和标准,为统一标准,国际标准化组织 ISO 推出了统一的 OSI 参考模型 。
当前网络主要遵循的 IEEE 802.3 标准,就是基于 OSI 模型提出的,主要定义的是物理层和数据链路层有线物理数据流传输的标准 。
那网络为什么要分层?
通过分层处理简化问题难度,降低复杂度,由于分层后的各层之间相互独立,我们可以把大问题分割成小问题 。同样,分层也保证了网络的松耦合和相对的灵活,分层拆分后易于各层的实现和维护,也方便了各层的后续扩展 。网络分层解决了网络复杂的问题,在网络中传输数据中,我们对不同设备之间的传输数据的格式,需要定义一个数据标准,所以就有了网络协议 。网络协议是双方通信的一种约定,以便双方都可以理解对方的信息 。接下来我们就用 OSI 协议体系中广泛应用的 TCP/IP 层的体系结构来分析整个过程,需要重点关注数据处理的过程和网络协议
ISO_OSI通信流转示意图:

文章插图
发起请求阶段(应用层)先来看下网络应用层的工作流程,依然以浏览器中输入URL开始 。
用户输入:在浏览器中输入URL在浏览器中输入URL,浏览器会根据输入内容,先匹配对应的URL以及关键字,给出输入建议,同时校验URL的合法性,并且会在URL前后补全URL
以输入 cosmos.com 为例,首先浏览器会判断出这是一个合法的 URL,并且会补全为 http://www.cosmos.com 。
其中 http 为协议,cosmos.com 为网络地址,每个网络栏的地址都符合通用 URI 的语法 。URI 一般语法由五个分层序列组成 。后面的第一行内容我给你列了 URL 的格式,第二行做了行为说明 。
URI = scheme:[//authority]path[?query][#fragment]
URI = 方案:[//授权]路径[?查询][#片段ID]
接着,浏览器从 URL 中会提取出网络的地址,也叫做主机名(host),一般主机名可以为域名或 IP 地址,此处使用域名 。
对 URL 进行解析之后,浏览器确定了服务器的主机名和请求路径,接下来就是根据这些信息来生成 HTTP 请求消息了,但此时并未将HTTP请求发送出去
网络请求前:查看浏览器缓存浏览器在 HTTP 报文生成完成后,它并不是马上就开始网络请求的 。
在请求发出之前,浏览器首先会检查保存在本地计算机中的缓存,如果访问过当前的 URL,会先进入缓存中查询是否有要请求的文件 。此时存在的缓存有路由器缓存、DNS 缓存、浏览器缓存、Service Worker、Memory Cache、Disk Cache、Push Cache、系统缓存等 。
如果在浏览器缓存里没有命中缓存,浏览器会做一个系统调用获得系统缓存中的记录,就是我们的 gethostbyname 方法,它的作用是通过域名获取 IP 地址 。这个方法会返回如下结构 。
struct hostent
{
char *h_name;// 主机的别名.www.cosmos.com就是google他自己的别名
char **h_aliases;// 主机ip地址的类型,到底是ipv4(AF_.NET),还是pv6(AF_INET6)
int h_addrtype;// 主机ip地址的长度
int h_length;// 主机ip地址的长度
char **h_addr_list; // 主机的ip地址,注意,这个是以网络字节序存储的
#define h_addr h_addr_list[0] 这个函数,是将类型为af的网络地址结构src,转换成主机序的字符串形式,存放在长度为cnt的字符串中 。返回指向dst的一个指针 。如果函数调用错误,返回值是NULL
};
如果没有访问过当前的 URL,就会跳过缓存这一步,这时我们就会进入网络操作了 。
域名解析:DNS接着上一小节在浏览器确认了输入的 URL 之前没有访问,浏览器就会生成对应的 HTTP 请求,这时浏览器需要委托操作系统将 HTTP 报文发送到对应的服务端 。在发送消息之前,还有一个工作需要做,就是查找服务端的 IP 地址,因为操作系统在发送消息时,必须知道对方的 IP 地址才可以发送 。
推荐阅读
- 使用 Python 进行网络爬虫——从0构建简单爬虫
- 重生的 SDN?云原生网络功能介绍
- 使用树莓派安装OpenVPN,在外部访问家庭内部网络
- 高中女孩早恋家长正确处理 高中女生早恋家长应该怎样处理
- 外蒙古正式脱离中国,成为独立主权国家是在什么时期 当年外蒙古是怎么独立出去的
- 怎样让初中孩子爱上学习
- 初中女孩早恋家长怎么办如何正确处理
- 孩子不想上学可以办休学吗高中 孩子不想上学可以办休学吗
- 怎样处理初中儿子早恋 儿子初中早恋父母该怎么处理
- 高中孩子浮躁怎么办,高中孩子浮躁家长怎么办
