HTTP

请求报文由请求行(request line)、请求头(header)、请求体三个部分组成,即URI + header + body

基本请求类型: HEAD , GET , POST

三次握手和四次挥手:

html面试题-风君雪科技博客

基本请求和复杂请求

简单请求

满足一下两个条件的请求。

请求方法是以下三种方法之一:

HEAD
GET
POST

HTTP的头信息不超出以下几种字段:

Accept
Accept-Language
Content-Language
Last-Event-ID
Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain

复杂请求:

非简单请求就是复杂请求。

复杂请求在正式请求前都会有预检请求,在浏览器中都能看到有OPTIONS请求,用于向服务器请求权限信息的。

axios 都是复杂请求,ajax 可以是简单请求

HTTPS建立过程:

浏览器请求服务器:浏览器去到DNS服务器获取此url对应的ip,然后客户端连接上服务端的443端口,将此请求发送给到服务端,此时客户端同时将自己支持的加密算法带给服务端;

服务端收到这套加密算法的时候,和自己支持的加密算法进行对比(也就是和自己的私钥进行对比),如果不符合,就断开连接;如果符合,服务端就将SSL证书发送给客户端,此证书中包括了数字证书包含的内容:1、证书颁发机构;2、使用机构;3、公钥;4、有效期;5、签名算法;6、指纹算法;7、指纹。

客户端验证服务端发来的证书,并回传信息:

验证证书
生成随机数(此随机数就是后面用的对称加密的私钥):此随机数只有服务端的私钥能解开了、
生成握手信息:生成hash值,目的是确保传输过程中信息不被篡改

服务端接收随机数加密的信息,并解密得到随机数,验证握手信息是否被篡改。

客户端验证服务端发送回来的握手信息,完成握手

客户端收到服务端发送过来的握手信息后,用开始自己生成的随机数进行解密,验证被随机数加密的握手信息和握手信息hash值。

验证无误后,握手过程就完成了,从此服务端和客户端就开始用那串随机数进行对称加密通信了(常用的对称加密算法有AES)。

HTTP2

http2新特性总结:这里是参考

响应多路复用,请求信息和相应信息复用同一个TCP链接
头部的压缩头部域来减小头部的体积,
添加了请求优先级, 让更重要的请求更早的完成
服务端推送.

Specifically, it allows interleaving of request and response messages on the same connection and uses an efficient coding for HTTP header fields.

底层原理

与http1.0采用ASCII报文传输信息不同的是,2.0采用了二进制frame
html面试题-风君雪科技博客

采用流的方式进行多路复用

html面试题-风君雪科技博客

每个流都有对应的优先级,优先级高的先分配资源
一个典型的Web应用程序由几十个资源组成,所有这些资源都是客户端通过检查服务器提供的文档发现的。因此,为什么不消除额外的延迟并让服务器提前推送相关资源?服务器已经知道客户端需要哪些资源;这是服务器推动。

优点:快!减少了TCP连接,同时也提高了HTTPS的性能,因为仅需要更少的TLS层的握手.

HTML语意化标签的好处

为了在没有CSS的情况下,页面也能呈现出很好地内容结构、代码结构:为了裸奔时好看;
用户体验:例如title、alt用于解释名词或解释图片信息、label标签的活用;
有利于SEO:和搜索引擎建立良好沟通,有助于爬虫抓取更多的有效信息:爬虫依赖于标签来确定上下文和各个关键字的权重;
方便其他设备解析(如屏幕阅读器、盲人阅读器、移动设备)以意义的方式来渲染网页;
便于团队开发和维护,语义化更具可读性,是下一步吧网页的重要动向,遵循W3C标准的团队都遵循这个标准,可以减少差异化。

post请求发送数据的几种类型

默认post数据类型 — Content-Type: application/x-www-form-urlencoded

这个类型是我们使用ajax请求或者 curl 等工具的默认post数据类型。
除非使用curl -H ‘Content-Type:application/json’等方式声明类型。

浏览器的原生 form 表单,如果不设置 enctype 属性,那么最终就会以 application/x-www-form-urlencoded 方式提交数据。

Content-Type: application/json

使用最广

Content-Type: multipart/form-data

此类型一般用来发送文件/图片,不同part会有各自的content-type,有各自的编码类型

Content-Type: text/xml

http缓存

浏览器缓存分为强缓存和协商缓存,浏览器加载一个页面的简单流程如下:

浏览器先根据这个资源的http头信息来判断是否命中强缓存。如果命中则直接加在缓存中的资源,并不会将请求发送到服务器。
如果未命中强缓存,则浏览器会将资源加载请求发送到服务器。服务器来判断浏览器本地缓存是否失效。若可以使用,则服务器并不会返回资源信息(而是304),浏览器继续从缓存加载资源。
如果未命中协商缓存,则服务器会将完整的资源返回给浏览器,浏览器加载新资源,并更新缓存。

命中强缓存时,浏览器并不会将请求发送给服务器。在Chrome的开发者工具中看到http的返回码是200,但是在Size列会显示为(from cache)。

html面试题-风君雪科技博客

详细来讲:

是否命中强缓存:

强缓存是利用http的返回头中的Expires或者Cache-Control两个字段来控制的,用来表示资源的缓存时间。cache-control的优先级更高。Expire是绝对时间(容易产生客户端和服务器时间不一致问题),Cache-Control是一个相对时间,单位是秒

当未命中强缓存,需要发送请求到服务器,进行协商缓存。具体来讲,服务器根据http头信息中的Last-Modify/If-Modify-Since或Etag/If-None-Match来判断是否命中协商缓存。如果命中,则http返回码为304,浏览器从缓存中加载资源。

Last-Modify/If-Modify-Since

浏览器第一次请求一个资源的时候,服务器返回的header中会加上Last-Modify,Last-modify是一个时间标识该资源的最后修改时间。当浏览器再次请求该资源时,发送的请求头中会包含If-Modify-Since,该值为缓存之前返回的Last-Modify。服务器收到If-Modify-Since后,根据资源的最后修改时间判断是否命中缓存。

ETag/If-None-Match

与Last-Modify/If-Modify-Since不同的是,Etag/If-None-Match返回的是一个校验码(ETag: entity tag)。ETag可以保证每一个资源是唯一的,资源变化都会导致ETag变化

⚠️ 浏览器缓存行为还有用户的行为有关!!!

用户操作 Expires/Cache-Control Last-Modified/Etag
地址栏回车 有效 有效
页面链接跳转 有效 有效
新开窗口 有效 有效
前进、后退 有效 有效
F5****刷新 无效 有效
Ctrl+F5****刷新 无效 无效

html面试题-风君雪科技博客

t c p/ip的四个层次

网络接口层、网络层、传输层、应用层

OSI

七层模型:应用层(HTTP、STMP)、表示层(压缩与解缩)、会话层(SSL、TLS)、传输层(TCP、UDP)、网络层(IP、ICMP)、数据链路层(ARP、网卡)、物理层
网卡实现的主要功能在于: 物理层和数据链路层