HTTP协议
首先,通过简单的分析,http的请求流程(同时,也是浏览器输入URL敲击回车的过程)大概是:一,建立链接:TCP/IP协议作为底层,使用浏览器URL解析,然后可以通过DNS查询:域名系统,也就是相当于一种将域名翻译成ip地址的翻译官,在各层服务器查询其ip地址(递归查询),然后使用TCP连接(传输控制协议):稳定、可靠、基于字节流;二、发送请求:前端向后端发送数据包,后端就使用http协议解读;三、返回相应,与发送请求相反,给前端发送数据包,然后前端根据http协议解读;四、断开链接:因为服务器访问量很大,一般访问结束都会自动断开,不造成服务器堵塞。
下面让我们来看看完整的流程吧
一、HTTP请求的完整流程
https://vue3js.cn/interview/http/after_url.html
URL解析
协议
http://
默认80端口
https://
默认443端口
主机
两种形式
域名形式
www.baidu.com
localhost
IP+端口形式
12.34.56.78:80
IP
12.34.56.78
宇宙中的唯一主机(具有唯一性)
0~255 * 4段
端口
:80
该主机中的唯一进程(应用程序)
0~65535
0~1024为系统保留端口
路径
查询参数
哈希(锚点)
DNS查询
Domain Name Server
将域名解析为IP+端口
TCP连接
客户端发送请求报文
服务端返回响应报文
客户端渲染页面
图解
连接断开
渲染流程图详述:HTML左手把负责交互效果的script拿到手里,右手把负责渲染样式的CSS也拿到手里,然后合成一棵DOM 树;于此同时,CSS把自己所有的属性值总合起来也归类成一棵CSS规则树;然后两者合一,合成一棵渲染树,实现渲染效果,但是呢,因为JS的交互性,数据会时不时的更新,这个过程就叫做回流(reflow),无论更新多少次,最后一次都叫做有效回流,前面的都是无效回流,当JS完成有效回流后再次与渲染树结合,完成重绘过程,最终显示出来,这就是整个渲染流程了。
二、TCP/IP协议(管连接)
OSI七层网络模型 <#ID_1017168846>
Transmission Control Protocol
传输控制协议
TCP协议宗旨
稳定连接 + 可靠传输
客户端确认
我能往服务端发送数据报文
我能接收服务端发来的数据报文
服务端能向我发送数据报文
服务端能接收我发送的数据报文
服务端确认
我能往客户端发送数据报文
我能接收客户端发来的数据报文
客户端能向我发送数据报文
客户端能接收我发送的数据报文
UDP协议:连上,发送数据,完事
直播
影视娱乐
游戏
User Datagram Protocol 用户报文协议
连接:三次握手
1 客户端:在吗服服
C向S发送消息
2 服务端:在的客客,能看到信息吗
S向C回复消息
可以确认
C端可以发送消息
S端能收到消息
3 客户端:是的服服
C回复S的消息
可以确认
C端能接收消息
S端能发送消息
图解
三次握手详细述说:首先是客户端向服务器发起请求建立连接,然后,服务器给客户端发起回应以及发起请求连接,最后,客户端会再次向服务器发起回应,总共三次过程。注意:无论是客户端和服务器都是做出针对性请求以及应答,并且不会携带数据
断开:四次挥手
1 client:分手吧服服
2 server:好的客客
3 server:这是服服的最后一条信息了哦(收到请回复)
4 client:嗯,这也是客客的最后一条信息,勿回(系统提示:客户端已断开与您的连接)
图解
四次挥手的详细述说:注意:前者三次握手本质上是连接,而四次挥手是断开连接。首先呢,是客户端发起请求断开连接,然后服务器端针对性的确认应答,并且,向客户端发起请求断开连接,最后客户端对服务器端针对性确认应答。注意:此过程中,客户端以及服务器端都不会携带数据包。双方确认断开连接,保证可靠传输不丢包。之后才是真正的数据传输
三、HTTP协议(管数据解读)
请求报文
请求行
POST /user HTTP/1.1
# POST 请求方式
# /user 请求URL(不包含域名)
# HTTP/1.1 请求协议版本
请求头
accept: application/json # 表示客户端希望接受的数据类型**(数据类型为:JSON)**
text/html
text/plain
accept-encoding: gzip #浏览器可接受的压缩算法(例如1111111110转变成1*10^11+…)
Accept-Language: zh-CN,zh;q=0.9
客户能接受的语言
Connection: keep-alive #保持一次TCP连接活跃(直到所有资源加载完毕为止)
Content-Type: application/x-www-form-urlencoded # 客户端发送的实体数据格式(GET请求通常无此字段)
application/x-www-form-urlencoded
表单数据
application/json
JSON数据
Content-Length:123
Host: 127.0.0.1 # 请求的主机名(IP)
cookie: 携带客户端用户信息(CS双方都可以编辑)
If-None-Match
携带上次数据的指纹E-tag
If-Modified-Since
携带上次数据的最后更新时间Last-Modified
user-agent: Mozilla/5.0 # 产生请求的浏览器信息
空行
请求体
# GET 请求是没有请求体数据的
# POST 请求才有请求体数据
完整报文范例
o
响应报文
状态行
HTTP/1.1 200 OK
# HTTP/1.1 服务器使用的 HTTP 协议版本
# 200 响应状态码
# OK 对响应状态码的简单解释
响应头
Content-Type: text/html # 服务端给客户端的数据类型
text/html
text/plain
普通文本
application/json
Content-Length: 11 # 服务端给客户端的数据长度
Content-Encoding: gzip #
------
Cache-Control:xxx
缓存时间
maxAge(3600)
旧版本的Cache-Control
Expires: Wed, 22 Dec 2021 07:56:25 GMT
响应超时时间
E-tag
数据的指纹
If-None-Match=携带指纹的请求头
Last-Modified
最后更新时间
If-Modified-Since=携带数据的最后更新时间的请求头
----------
Server: Apache/2.4.23 (Win32) OpenSSL/1.0.2j PHP/5.4.45 # 服务器类型
Access-Control-Allow-Origin:xxx
允许哪些前端跨域访问我
Date: Jan, 14 Aug 2019 12:42:30 GMT # 服务器时间
Set-Cookie:服务端写入客户端的COOKIE信息
Set-Cookie:isrich=true
Set-Cookie:istall=true
响应体
hello world
# 服务端给客户端的响应数据
常见的 HTTP 响应状态码
1. 100 ~ 199
- 100: 继续请求,前面的一部分内容服务端已经接受到了,正在等待后续内容
- 101: 请求者已经准备切换协议,服务器页表示同意
2. 200 ~ 299
- 2 开头的都是表示成功,本次请求成功了,只不过不一样的状态码有不一样的含义(语义化)
- 200: 标准请求成功(一般表示服务端提供的是网页)
- 201: 创建成功(一般是注册的时候,表示新用户信息已经添加到数据库)
- 203: 表示服务器已经成功处理了请求,但是返回的信息可能来自另一源
- 204: 服务端已经成功处理了请求,但是没有任何数据返回
3. 300 ~ 399
- 3 开头也是成功的一种,但是一般表示重定向
- 301: 永久重定向
- 302: 临时重定向
- 304: 资源未被修改(使用的是缓存的数据)
- 305: 使用代理
4. 400 ~ 499
- 4 开头表示客户端出现错误了
- 400: 请求的语法服务端不认识
- 401: 未授权(你要登录的网站需要授权登录)
- 403: 服务器拒绝了你的请求(账户/角色/权限问题)
- 404: 服务器找不到你请求的 URL
- 407: 你的代理没有授权
- 408: 请求超时
- 410: 你请求的数据已经被服务端永久删除
5. 500 ~ 599
- 5 开头的表示服务端出现了错误
- 500: 服务器内部错误
- 504:网关超时
- 503: 服务器当前不可用(过载或者维护)
- 505: 请求的协议服务器不支持
常见的 HTTP 请求方法(也可以主要分成两类,post与get,因为post提交数据的时候可以实现更改数据)
2. POST: 新建数据
- 参数以 request body
的形式发送,也就是放在请求体中
- POST 请求不会被浏览器主动缓存,除非手动设置
- POST 请求理论上是没有限制的,除非服务端做了限制
- 对参数类型没有限制,理论上可以传递任意数据类型,只不过要和请求头对应
- POST 请求数据封装在请求体里,相对安全
4. DELETE: 删除数据
3. PUT/PATCH: 更新数据
1. GET: 获取数据
- 参数以 querystring
的形式发送,也就是直接拼接在 请求路径的后面
- GET 请求会被浏览器主动缓存
- GET 请求根据不同的浏览器对长度是有限制的
- IE: 2083 个字符
- FireFox: 65536 个字符
- Safari: 80000 个字符
- Opera: 190000 个字符
- Chrome: 8182 个字符
- APACHE(server): 理论上接受的最大长度是 8192 个字符(有待商榷)
- 对参数的类型有限制,只接受 ASCII 码的格式
- GET 请求是明文发送,相对不安全
其它请求方式
1. HEAD: 类似于 GET 的请求,只不过一般没有响应的具体内容,用于获取报文头
2. CONNECT: HTTP/1.1 中预留的方式,一般用于管道链接改变为代理的时候使用
3. OPTIONS: 允许客户端查看服务端性能
GET VS POST的区别
GET请求获取数据,POST请求提交数据
POST请求可以携带数据
可以在数据详情中对操作意图做具体说明
{type:delete,studentid:123}
{type:update,studentid:123,name:“黑哥”}
{type:add,name:“黑哥”}
GET请求的数据在地址栏中,POST请求在请求体里
localhost/login?username=admin&password=123456
GET没有请求体
携带的信息暴露(考虑安全问题)
POST等其他请求也可以携带查询参数
localhost/login
POST请求体中有username=admin&password=123456
信息在请求体中(相对安全)
根本安全主要依赖HTTPS协议
服务端创建一个证书(密钥对)
公钥分发给所有客户端(客户端安装某网站的证书)
服务端自己保留私钥
大家发给服务端的信息通过公钥加密
数据被截获也无法解读
服务通过自己的私钥进行解密
Security安全
GET请求携带的数据量有限
GET请求携带的参数长度不同浏览器限制不一样
POST请求体中携带的数据理论上没有上限
四、RESTful-API风格的API/URL
Representational State Transfer,简称REST,意思:表述性状态转换
倡议内容
路径代表了想访问的资源
localhost:8888/goods/toys/345
345=飞机模型
请求方法代表相对资源执行的操作
POST=想要添加该资源
DELETE=想要删除该资源
PUT/PATCH=想要修改该资源
GET=想要查询该资源
实例:访问玩具信息
请求方式
POST
提交数据
localhost/goods/toys/0
携带数据
{name:xxx,price:xxx,factory:xxx}
DELETE
localhost/goods/toys/345
PUT/PATCH
携带数据
{price:999}
localhost/goods/toys/345
GET
localhost/goods/toys/345
传统风格(getalltoys动宾结构)
localhost:8888/goods/addtoys?page=10
localhost:8888/goods/deletetoys?page=10
localhost:8888/goods/updatetoys?page=10
localhost:8888/goods/getalltoys?page=10
localhost:8888/goods/gettoydetail?cid=12&tid=3435
五、HTTP缓存机制
强制缓存
Cache-Control
max-age
以秒为单位
示意图
Expires
Cache-Control的老版本Header
no-cache
前端不使用缓存
no-store
前后端皆不使用缓存
其它
private
只允许终端浏览器缓存
public
允许所有中间路由环节进行缓存
强制缓存原理图
协商缓存
缓存内容比对方式
ResponseHeader + ETag
响应内容的指纹(类似于哈希)
RequestHeader + If-None-Match=ETag值
ResponseHeader + LastModified
响应内容的最后修改时间(秒级)
RequestHeader + If-Modified-Since=LastModified值
示例图
304状态码
NOT MODIFIED 未更新(滚回去用自己的缓存)
服务端对比后告诉前端浏览器,内容没有任何变化,请使用浏览器端缓存
示例图
协商缓存原理图
完整流程
http缓存综述详细讲述:第一次http请求服务器,服务器会给几个缓存标记,catche-control(强制缓存时间) 、eTag(电子指纹)以及Last-Modified(最后修改时间),当第二次请求该数据的时候回先看强制缓存时间是否过期,如果没有过期,直接读取强制缓存进行渲染,如果过期,看看有没有给etag、last-modified,有的话,再次发起请求,得到数据,一边渲染一边缓存,如果有,两个数据特征,走协商缓存,使用(if-none-match:携带电子指纹)以及(if-modified-since携带最后更新时间),请求服务器,服务器查询最新电子指纹以及最新更新时间,如果指纹未变,时间未变,最后空数据回来,还是读取之前的(1.0版本)的数据缓存;但是如果数据库的结果,发现二者都改变(指纹更有说服力),最新数据jia200加上最新的缓存数据一边渲染一边缓存
刷新动作对缓存的影响
——如有侵权,请联系本人