什么是http协议?
http(HyperText Transfer Protocol):
超文本传输协议:在客户端和服务器端不仅可以进行文本传输,还可以传递图片,音视频;是浏览器和服务器端之间约定好了的一种规范;双方按照规范传递和接受数据
- https: 加密的传输协议;更安全,在协议中增加了秘钥,不容易被拦截和篡改,大多数对安全有要求的都会使用https
http:就像运行在客户端和服务端的快递小哥,可以把客户端的信息传递给服务器(请求: request),然后把服务器整理好的数据通过http协议发送给服务端(响应response)
前后端交互模型
在浏览器总输入一个url,到用户看到页面都经过了什么?
- http 请求阶段
- 浏览器得到地址栏中的地址,发送给DNS服务器
- DNS服务器进行域名解析,找到域名对应的IP地址
- 把客户端的请求发送给上一步查出来的服务器地址
- http 响应阶段
- 服务器接收到请求后,根据请求的信息,进行资源的整理,并且把响应的资源通过http返回给客户端(数据或者html、js、css文件等)
- 根据资源的类型不同,浏览器会进行不同的操作,如html和css进行解析渲染,js进行解析并执行
- 浏览器的渲染阶段
- 解析html文件形成DOM树根据节点间关系组织树的节点关系;
- 解析CSS形成CSS树
- 把DOM树和CSS树组合形成render树
- 接下来交给显卡,绘制成页面;
http的三次握手和四次挥手
http 协议建立和断开连接时不是一次就完成的,连接时而是通过三次握手,断开时要经历4次挥手
- 三次握手
- 第一次握手:客户端发送syn码数据包给服务器,客户端要求和服务器建立连接
- 第二次握手:服务端接收到连接请求后,会发送ack码数据到客户端,表示你的连接请求已经收到,再次询问客户端是否确认建立连接
- 第三次握手:客户端收到服务器的ack码后,检验是否正确,如果正确则再次发送ack给服务器,表示确认连接
三次握手如果成功,客户端和服务端的连接成功建立,才会开始传递数据
- 四次挥手
- 当客户端发送数据结束后,会发送fin告知服务器,客户端要给服务器的数据传输完了
- 服务端返回给客户端一个ack码,告知客户端已经知道数据传递完成。客户端收到ack,就会把发送到服务端的通道关闭
- 服务端数据传输结束后,也会发送fin给客户端
- 当客户端收到fin后,会发送ack给服务端,表示客户端知道服务端已经发送完毕,服务器收到ack后就可以放心的关闭数据传输通道
HTTP报文
HTTP报文用于http协议交互的信息,因为http通信分为请求和响应两个阶段,所以报文分为两种:
请求报文和响应报文
请求报文:
- 报文首部:请求首部分为请求行和请求头;请求行中包含 请求方法、协议、版本、URI
- 空行(CR+LF)
- 报文主体:客户端传递给服务端的数据
响应报文:
- 报文首部:状态行和响应头;状态行包含http协议版本,响应状态码
- 空行(CR+LF)
- 报文主体:响应体(服务端返回给客户端的数据)
Tip:
- 空行(CR+LF),CR(Carriage Return,回车符)和LF(Line Feed,换行符)
- 空行(CR+LF)可以用来区分报文首部和报文主体(通常,并不一定有报文主体。)这一行非常重要,必不可少
资源标示符
URI、URL和URN是用来识别、定位和命名互联网上的资源。 因为要通过多样的方式识别资源(人的名字可能相同,然而计算机文件只能通过唯一的路径名称组合访问),所以需要标准的识别WWW资源的途径。为了满足这种需要,Tim Berners-Lee 引入了标准的识别、定位和命名的途径:URI、URL和URN。
- URI: 统一资源标识符
- URN: 统一资源名称
- URL: 统一资源定位符
URL 和 URN 都属于 URI。
URI 和 URL 的区别是:URL 更具体。URI 和 URL 都定义了什么是资源。但 URL 还定义了如何获得资源。
一个url的例子:
1 | https://www.dahai.com:443/tech/ai.html?user=mabin&time=1e8239473784#top |
url各部分代表的意义:
- http http/https: 协议
- www.dahai.com 域名
- :443 端口号 http 协议默认80,https默认443
- /tech/ai.html 路径
- ?user=mabin&time=2323456 参数(可以有可以没有)放在?后面的都是告知服务器的数据
- #top 锚点:(哈希)
请求方法
请求方法用来定义操作资源的方式,HTTP/1.1 协议中定义了八种请求方法:
- GET:读取资源数据
- POST:新建资源数据
- PUT:更新资源数据
- DELETE:删除资源数据
- HEAD:读取资源的元数据
- OPTIONS:读取该资源所支持的所有请求方法
- TRACE:回显服务器收到的请求,主要用于测试或诊断
- CONNECT:HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接(经 由非加密的HTTP代理服务器)
此外,除了上述方法,特定的HTTP服务器还能够扩展自定义的方法。
状态码
HTTP 状态码(HTTP Status Code)是用以表示网页服务器 HTTP 响应状态的3位数字代码。
所有的状态码的第一个数字代表了响应的五种状态之一:
- 1xx:代表请求已被接受,需要继续处理。这类响应是临时响应,只包含状态行和某些可选的响应头信息,并以空行 结束。
- 2xx:代表请求接收、理解并且接受。
- 3xx:代表需要客户端采取进一步的操作才能完成请求。通常,这些状态码用来重定向,后续的请求地址(重定向目 标)在本次响应的Location域中指明。当且仅当后续的请求所使用的方法是GET或者HEAD时,用户浏览器才可以 在没有用户介入的情况下自动提交所需要的后续请求。
- 4xx:代表了客户端看起来可能发生了错误,妨碍了服务器的处理。除非响应的是一个HEAD请求,否则服务器就应 该返回一个解释当前错误状况的实体,以及这是临时的还是永久性的状况。
- 5xx:代表了服务器在处理请求的过程中有错误或者异常状态发生,,也有可能是服务器意识到以当前的软硬件资源 无法完成对请求的处理。
常见状态码有:
- 200: 请求已经成功,请求所希望的响应头或者数据体将随着此响应返回
- 202: 服务器已接受请求,但尚未处理。正如它可能被拒绝一样,最终该请求可能会也可能不会被执行。在异步操作的场合下,没有比发送这个状态码更方便的做法了
- 204: 服务器成功处理了请求,但不需要返回任何实体内容,并且希望返回更新了的元信息
- 304: 被请求的资源内容没有发生更改
- 400: 包含语法错误,无法被服务器解析
- 403: 服务器已经接收请求,但是拒绝执行
- 404: 请求失败,请求所希望得到的资源未在服务器上发现
- 408: 请求超时。客户端可以再次提交这一请求而无需任何修改
- 500: 服务器内部错误,无法处理请求
- 502: 作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效响应
- 504: 作为网关或者代理工作的服务器尝试执行请求时,未能及时从上游服务器(URI标识出的服务器,例如HTTP、FTP、LDAP)或者辅助服务器(例如DNS)收到响应