ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 开启网络线程到发出一个完整的 http 请求 这一部分主要内容包括:`dns`查询,`tcp/ip`请求构建,`五层因特网协议栈`等等 仍然是先梳理主干,有些详细的过程不展开(因为展开的话内容过多) ### DNS 查询得到 IP 如果输入的是域名,需要进行dns解析成IP,大致流程: - 如果浏览器有缓存,直接使用浏览器缓存,否则使用本机缓存,再没有的话就是用host - 如果本地没有,就向dns域名服务器查询(当然,中间可能还会经过路由,也有缓存等),查询到对应的IP 注意,域名查询时有可能是经过了CDN调度器的(如果有cdn存储功能的话) 而且,需要知道dns解析是很耗时的,因此如果解析域名过多,会让首屏加载变得过慢,可以考虑`dns-prefetch`优化 这一块可以深入展开,具体请去网上搜索,这里就不占篇幅了(网上可以看到很详细的解答) ### tcp/ip请求 http的本质就是`tcp/ip`请求 需要了解3次握手规则建立连接以及断开连接时的四次挥手 tcp将http长报文划分为短报文,通过三次握手与服务端建立连接,进行可靠传输 **三次握手的步骤:(抽象派)** ``` 客户端:hello,你是server么? 服务端:hello,我是server,你是client么 客户端:yes,我是client ``` 建立连接成功后,接下来就正式传输数据 然后,待到断开连接时,需要进行四次挥手(因为是全双工的,所以需要四次挥手) **四次挥手的步骤:(抽象派)** ``` 主动方:我已经关闭了向你那边的主动通道了,只能被动接收了 被动方:收到通道关闭的信息 被动方:那我也告诉你,我这边向你的主动通道也关闭了 主动方:最后收到数据,之后双方无法通信 ``` **tcp/ip的并发限制** 浏览器对同一域名下并发的tcp连接是有限制的(2-10个不等) 而且在http1.0中往往一个资源下载就需要对应一个tcp/ip请求 所以针对这个瓶颈,又出现了很多的资源优化方案 **get和post的区别** get和post虽然本质都是tcp/ip,但两者除了在http层面外,在tcp/ip层面也有区别。 get会产生一个tcp数据包,post两个 具体就是: - get请求时,浏览器会把`headers`和`data`一起发送出去,服务器响应200(返回数据), - post请求时,浏览器先发送`headers`,服务器响应`100 continue`, 浏览器再发送`data`,服务器响应200(返回数据)。 再说一点,这里的区别是`specification`(规范)层面,而不是`implementation`(对规范的实现) ### 五层因特网协议栈 其实这个概念挺难记全的,记不全没关系,但是要有一个整体概念 其实就是一个概念: **从客户端发出http请求到服务器接收,中间会经过一系列的流程。** 简括就是: **从应用层的发送http请求,到传输层通过三次握手建立tcp/ip连接,再到网络层的ip寻址,再到数据链路层的封装成帧,最后到物理层的利用物理介质传输。** 当然,服务端的接收就是反过来的步骤 五层因特网协议栈其实就是: ``` 1.应用层(dns,http) DNS解析成IP并发送http请求 2.传输层(tcp,udp) 建立tcp连接(三次握手) 3.网络层(IP,ARP) IP寻址 4.数据链路层(PPP) 封装成帧 5.物理层(利用物理介质传输比特流) 物理传输(然后传输的时候通过双绞线,电磁波等各种介质) ``` 当然,其实也有一个完整的OSI七层框架,与之相比,多了会话层、表示层。 OSI七层框架:`物理层`、`数据链路层`、`网络层`、`传输层`、`会话层`、`表示层`、`应用层` ``` 表示层:主要处理两个通信系统中交换信息的表示方式,包括数据格式交换,数据加密与解密,数据压缩与终端类型转换等 会话层:它具体管理不同用户和进程之间的对话,如控制登陆和注销过程 ```