1、http报文的请求会有几个部分
http的报文分为:请求报文和响应报文
1】请求报文
请求行、请求头部、空行、请求数据(请求体)
1)请求行
请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。比如 GET /data/info.html HTTP/1.1
2)请求头部(见上)
3)空行
它的作用是通过一个空行,告诉服务器请求头部到此为止
4)请求数据
若方法字段是GET,则此项为空,没有数据
若方法字段是POST,则通常来说此处放置的就是要提交的数据
2】响应报文
HTTP响应报文也由三部分组成:响应行、响应头、响应体
1)响应行
响应行一般由协议版本、状态码及其描述组成
比如 HTTP/1.1 200 OK
2)响应头(见下)
3)响应体
响应体就是响应的消息体,如果是纯数据就是返回纯数据,如果请求的是HTML页面,那么返回的就是HTML代码,如果是JSON就是JSON
2、常见http请求头和响应头?
1】请求头
Accept
可接受的响应内容类型(Content-Types) Accept: text/plain
Authorization
用于表示HTTP协议中需要认证资源的认证信息 Authorization: Basic OSdjJGRpbjpvcGVuIANlc2SdDE==
Cache-Control
用来指定当前的请求/回复中的,是否使用缓存机制。 Cache-Control: no-cache
Cookie
由之前服务器通过Set-Cookie(见下文)设置的一个HTTP协议Cookie Cookie: $Version=1; Skin=new;
Host
表示服务器的域名以及服务器所监听的端口号。如果所请求的端口是对应的服务的标准端口(80),则端口号可以省略。 Host: www.itbilu.com:80 Host: www.itbilu.com
Origin
发起一个针对跨域资源共享的请求(该请求要求服务器在响应中加入一个Access-Control-Allow-Origin的消息头,表示访问控制所允许的来源)。 Origin: http://www.itbilu.com
User-Agent
浏览器的身份标识字符串 User-Agent: Mozilla/……
2】响应头
Access-Control-Allow-Origin
指定哪些网站可以跨域源资源共享 Access-Control-Allow-Origin: *
Cache-Control
通知从服务器到客户端内的所有缓存机制,表示它们是否可以缓存这个对象及缓存有效时间。其单位为秒 Cache-Control: max-age=3600
Content-Length
响应消息体的长度,用8进制字节表示 Content-Length: 348
Server
服务器的名称 Server: nginx/1.6.3
Set-Cookie
设置HTTP cookie Set-Cookie: UserID=itbilu; Max-Age=3600; Version=1
Status
通用网关接口的响应头字段,用来说明当前HTTP连接的响应状态 Status: 200 OK
3、常见的一些HTTP状态码
1】2开头 (请求成功)
200 (成功) 服务器已成功处理了请求。 通常,这表示服务器提供了请求的网页
201 (已创建) 请求成功并且服务器创建了新的资源
2】3 开头 (请求被重定向)
301 (永久移动) 请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。
304 (未修改/缓存) 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。
3】4开头 (请求错误)
400 (错误请求) 服务器不理解请求的语法(参数缺失)
401 (未授权) 请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应
403 (禁止) 服务器拒绝/禁止请求
404 (未找到) 服务器找不到请求的网页
405 (方法禁用) 禁用请求中指定的方法
413 (请求实体过大) 服务器无法处理请求,因为请求实体过大,超出服务器的处理能力(上传文件)
415 (不支持的媒体类型) 请求的格式不受请求页面的支持
4】5开头(服务器错误)
500 (服务器内部错误) 服务器遇到错误,无法完成请求
502 (错误网关) 服务器作为网关或代理,从上游服务器收到无效响应
503 服务不可用
504 (网关超时) 服务器作为网关或代理,但是没有及时从上游服务器收到请求
4、http1.1
1】相比1.0新增的属性
a、长连接
b、节约带宽
HTTP1.0中存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能。HTTP1.1支持只发送header信息(不带任何body信息),如果服务器认为客户端有权限请求服务器,则返回100,客户端接收到100才开始把请求body发送到服务器;如果返回401,客户端就可以不用发送请求body了节约了带宽。
c、HOST域
HTTP1.1的请求消息和响应消息都支持host域,且请求消息中如果没有host域会报告一个错误(400 Bad Request)
d、缓存处理
在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略
2】如何复用tcp连接
HTTP 的header里有一个“Keep-Alive”参数,用来告知服务器:我想要保存此次连接,我稍后还会请求,这样我们可以避免再次TCP三次握手
5、介绍http2.0
1)介绍
1】解析速度快
服务器解析 HTTP1.1 的请求时,必须不断地读入字节,直到遇到分隔符 CRLF 为止。
而解析 HTTP2 的请求就不用这么麻烦,因为 HTTP2 是基于帧的协议,每个帧都有表示帧长度的字段。
2】多路复用
HTTP1.1 如果要同时发起多个请求,就得建立多个 TCP 连接,因为1个 TCP 连接同时只能处理1个 HTTP1.1 的请求。
在 HTTP2 上,多个http请求可以共用1个TCP 连接,这称为多路复用。同1个请求和响应用1个流来表示,并有唯一的流 ID 来标识。
3】首部压缩
HTTP2 提供了首部压缩功能。
多个请求如果数据重复的部分比较多,可以把相同的首部存储起来,仅发送它们之间不同的部分,就可以节省不少的流量,加快请求的时间。
4】服务器推送
HTTP2 新增的一个强大的新功能,就是服务器可以对一个客户端请求发送多个响应。
无需客户端明确地请求,服务器还可以额外向客户端推送资源。
2)应用
一般是由后端和nginx来启用。
6、TCP三次握手
1】传输层传输协议分为UDP和TCP两种
UDP是无连接的协议,而TCP是可靠的有连接的协议
由于HTTP协议使用的是TCP协议
2】握手过程
第一次握手
客户主动(active open)去connect服务器,并且发送SYN 假设序列号为J,
服务器是被动打开(passive open)
第二次握手
服务器在收到SYN后,它会发送一个SYN以及一个ACK(应答)给客户,
ACK的序列号是 J+1表示是给SYN J的应答,新发送的SYN K 序列号是K
第三次握手
客户在收到新SYN K, ACK J+1 后,也回应ACK K+1 以表示收到了,
然后两边就可以开始数据发送数据了
3】握手意义
解决的不仅仅有数据包序号问题,还解决了包括窗口大小、MTU(Maximum Transmission Unit,最大传输单元),以及所期望的网络延时等其他问题。
4】构建TCP请求会增加大量的网络时延,常用的优化方式如下所示
(1)资源打包,合并请求
(2)多使用缓存,减少网络传输
(3)使用keep-alive建立持久连接
(4)使用多个域名,增加浏览器的资源并发加载数,或者使用HTTP2的管道化连接的多路复用技术
7、TCP四次挥手
(1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
(2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
(3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
(4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。
8、计算机网络分层
1)OSI模型的七层
1】物理层
集线器和网线,比特流
2】数据链路层
交换机通过MAC地址转发数据,逻辑链路控制
3】网络层
路由器通过 ip 进行寻址
4】传输层
负责网络传输,tcp 和 udp
5】会话层
6】表示层
7】应用层
为应用程序提供网络服务,telnet, ssh, http, ftp, smtp
2)TCP/IP模型的四层
1】链路层:包括操作系统中的设备驱动程序、计算机中对应的网络接口卡
2】网络层:处理分组在网络中的活动,比如分组的选路。
3】传输层:主要为两台主机上的应用提供端到端的通信。
4】应用层:负责处理特定的应用程序细节。
9、从输入URL到页面加载全过程
1】浏览器构建HTTP Request请求
1)应用层进行DNS解析
通过DNS将域名解析成IP地址,若浏览器缓存有对应的解析结果,则直接取出来,若无,将这次的解析结果保存到浏览器
2)应用层生成HTTP请求报文(见上)
3)传输层建立TCP三次握手(见上)
4)网络层使用IP协议来选择路线
5)数据链路层将数据封装成帧,然后实现网络相邻结点间可靠的数据通信
6)物理层传输数据,将数据链路层的帧(Frame)转换成二进制形式的比特(Bit)流,从网卡发送出去
2】网络传输
从客户机到服务器需要通过许多网络设备, 一般地,包括集线器、交换器、路由器和防火墙
3】服务器构建HTTP Response 响应
服务器接收到这个比特流,把比特流转换成帧格式,上传到数据链路层,服务器发现数据帧中的目的MAC地址与本网卡的MAC地址相同,服务器拆除数据链路层的封装后,把数据包上传到网络层。服务器的网络层比较数据包中的目的IP地址,发现与本机的IP地址相同,服务器拆除网络层的封装后,把数据分段上传到传输层。传输层对数据分段进行确认、排序、重组,确保数据传输的可靠性。数据最后被传到服务器的应用层
HTTP服务器,如nginx通过反向代理,将其定位到具体的后台服务的实际的端口位置,比如,8080端口对应的是一个nodejs服务,然后nodejs接收到这些数据之后,经过一系列的逻辑处理,生成对应的响应报文
4】网络传输
应用层的响应报文,通过传输层、网络层、数据链路层的层层封装,最终在物理层将响应报文封装成二进制比特流,并转换成其他信号,如电信号到网络中传输
5】浏览器渲染页面
客户机接受到二进制比特流之后,把比特流转换成帧格式,上传到数据链路层,客户机发现数据帧中的目的MAC地址与本网卡的MAC地址相同,拆除数据链路层的封装后,把数据包上传到网络层。网络层比较数据包中的目的IP地址,发现与本机的IP地址相同,拆除网络层的封装后,把数据分段上传到传输层。传输层对数据分段进行确认、排序、重组,确保数据传输的可靠性。数据最后被传到应用层。
应用层开始处理:
1、如果HTTP响应报文是301或302重定向,则浏览器会相应头中的location再次发送请求
2、浏览器处理HTTP响应报文中的主体内容,首先使用loader模块加载相应的资源
loader模块有两条资源加载路径:主资源(index.html)加载路径和派生资源(静态文件)加载路径
3、使用parse模块解析HTML、CSS、Javascript资源
4、构建DOM树、Render树及RenderLayer树
Render树用于表示文档的可视信息,记录了文档中每个可视元素的布局及渲染方式
5、布局和渲染
布局:就是安排和计算页面中每个元素大小位置等几何信息的过程。HTML采用流式布局模型,基本的原则是页面元素在顺序遍历过程中依次按从左至右、从上至下的排列方式确定各自的位置区域
渲染:Paint模块负责将Render树映射成可视的图形,它会遍历Render树调用每个Render节点的绘制方法将其内容显示在一块画布或者位图上
6、硬件加速
硬件渲染是指网页各层的合成是通过GPU完成的
【重绘和回流】
重绘和回流是在页面渲染过程中非常重要的两个概念。页面生成以后,脚本操作、样式表变更,以及用户操作都可能触发重绘和回流
回流reflow是firefox里的术语,在chrome中称为重排relayout
回流是指窗口尺寸被修改、发生滚动操作,或者元素位置相关属性被更新时会触发布局过程,在布局过程中要计算所有元素的位置信息。由于HTML使用的是流式布局,如果页面中的一个元素的尺寸发生了变化,则其后续的元素位置都要跟着发生变化,也就是重新进行流式布局的过程,所以被称之为回流。
10、浏览器缓存:强缓存(本地缓存) 和协商缓存
1)浏览器在第一次请求发生后,再次请求时:
1】先判断是否命中强缓存
浏览器在请求某一资源时,会先获取该资源缓存的header信息,判断是否命中强缓存(cache-control和expires信息),若命中直接从缓存中获取资源信息,包括缓存header信息;本次请求根本就不会与服务器进行通信;
2】再判断是否命中协商缓存
如果没有命中强缓存,浏览器会发送请求到服务器,请求会携带第一次请求返回的有关缓存的header字段信息(Last-Modified/If-Modified-Since和Etag/If-None-Match),由服务器根据请求中的相关header信息来比对结果是否协商缓存命中;若命中,则服务器返回新的响应header信息更新缓存中的对应header信息,但是并不返回资源内容,它会告知浏览器可以直接从缓存获取;否则返回最新的资源内容。
2)强缓存
强缓存是利用http头中的Expires和Cache-Control两个字段来控制的,用来表示资源的缓存时间。强缓存中,普通刷新会忽略它,但不会清除它,需要强制刷新。
1】Expires
代表这这个资源的失效时间,只要发送请求时间是在Expires之前,那么本地缓存始终有效。
Expires有一个非常大的缺陷,它使用一个固定的时间,要求服务器与客户端的时钟保持严格的同步,并且这一天到来后,服务器还得重新设定新的时间。
2】Cache-Control
HTTP1.1引入了Cathe-Control,它使用max-age指定组件被缓存多久,从请求开始在max-age时间内浏览器使用缓存,之外的使用请求,这样就可以消除Expires的限制。如果对浏览器兼容性要求很高的话,可以两个都使用。
a、no-cache:不使用本地缓存,需要使用缓存协商
b、no-store:直接禁止浏览器缓存数据
c、public:可以被所有的用户缓存,包括终端用户和CDN
d、private:只能被终端用户的浏览器缓存,不允许CDN缓存
3)应用
1】html标签
2】nginx
location ~ .(gif|jpg|jpeg|png|bmp|ico)$ {
root /var/www/img/;
expires 30d;
}
location / {
root /home/www/html;
add_header Cache-Control max-age=3600;
}
11、提交方式post和get有什么区别?
(1)post是向服务器传送数据;get是从服务器上获取数据。
(2)在客户端,get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。
post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。
(3)对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。
例如:get 提交Request.QueryString[“aa”].ToString();
post 提交用 Request.Form[“aa”].ToString();
(4)get可以传送的数据量则非常小,只能有1024字节,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。
(5)安全性问题。正如在(1)中提到,使用 get 的时候,参数会显示在浏览器地址栏上,而 post 不会。
(6)get请求可以被缓存,post不可以被缓存
12、http请求中的keep-alive有了解吗
通过使用keep-alive机制,可以减少tcp连接建立次数,也意味着可以减少TIME_WAIT状态连接,以此提高性能和提高httpd服务器的吞吐率(更少的tcp连接意味着更少的系统内核调用,socket的accept()和close()调用)。 但是,长时间的tcp连接容易导致系统资源无效占用。配置不当的keep-alive,有时比重复利用连接带来的损失还更大。所以,正确地设置keep-alive timeout时间非常重要
13、DNS解析的具体过程
当一个用户在地址栏输入www.taobao.com时,DNS解析有大致十个过程,如下:
但是这种操作系统级别的域名解析规程也被很多黑客利用,通过修改你的hosts文件里的内容把特定的域名解析到他指定的ip地址上,造成所谓的域名劫持。所以在windows7中将hosts文件设置成了readonly,防止被恶意篡改。
3. 如果至此还没有命中域名,才会真正的请求本地域名服务器(LDNS)来解析这个域名,这台服务器一般在你的城市的某个角落,距离你不会很远,并且这台服务器的性能都很好,一般都会缓存域名解析结果,大约80%的域名解析到这里就完成了。
4. 如果LDNS仍然没有命中,就直接跳到Root Server 域名服务器请求解析
5. 根域名服务器返回给LDNS一个所查询域的主域名服务器(gTLD Server,国际顶尖域名服务器,如.com .cn .org等)地址
6. 此时LDNS再发送请求给上一步返回的gTLD
7. 接受请求的gTLD查找并返回这个域名对应的Name Server的地址,这个Name Server就是网站注册的域名服务器
8. Name Server根据映射关系表找到目标ip,返回给LDNS
9. LDNS缓存这个域名和对应的ip
10. LDNS把解析的结果返回给用户,用户根据TTL值缓存到本地系统缓存中,域名解析过程至此结束
14、介绍HTTPS
1)简介
HTTPS=HTTP+SSL,在 HTTP 层和 TCP 之间加了一个 SSL/TLS 层。SSL(Secure Sockets Layer)中文叫“安全套接层”,后来由于广泛应用,SSL 标准化之后就改名为 TLS(Transport Layer Security)
它的工作流程一般如以下方式:
1】TCP 三次同步握手
2】客户端验证服务器数字证书
3】DH 算法协商对称加密算法的密钥、hash 算法的密钥
4】SSL 安全加密隧道协商完成
5】网页以加密的方式传输,用协商的对称加密算法和密钥加密,保证数据机密性;用协商的hash算法进行数据完整性保护,保证数据不被篡改。
2)https请求可以拦截吗
使用axios,使用请求和响应统一拦截器。
3)https对称和非对称加密
对称:加密和解密都是通过同一个秘钥
非对称:是指使用一对非对称密钥,即公钥和私钥,公钥可以随意发布,但私钥只有自己知道。发送密文的一方使用对方的公钥进行加密处理,对方接收到加密信息后,使用自己的私钥进行解密