web开发基础-http协议

什么是http协议?

http(HyperText Transfer Protocol):
超文本传输协议:在客户端和服务器端不仅可以进行文本传输,还可以传递图片,音视频;是浏览器和服务器端之间约定好了的一种规范;双方按照规范传递和接受数据

  • https: 加密的传输协议;更安全,在协议中增加了秘钥,不容易被拦截和篡改,大多数对安全有要求的都会使用https

http:就像运行在客户端和服务端的快递小哥,可以把客户端的信息传递给服务器(请求: request),然后把服务器整理好的数据通过http协议发送给服务端(响应response)

前后端交互模型

在浏览器总输入一个url,到用户看到页面都经过了什么?

  • http 请求阶段
  1. 浏览器得到地址栏中的地址,发送给DNS服务器
  2. DNS服务器进行域名解析,找到域名对应的IP地址
  3. 把客户端的请求发送给上一步查出来的服务器地址
  • http 响应阶段
  1. 服务器接收到请求后,根据请求的信息,进行资源的整理,并且把响应的资源通过http返回给客户端(数据或者html、js、css文件等)
  2. 根据资源的类型不同,浏览器会进行不同的操作,如html和css进行解析渲染,js进行解析并执行
  • 浏览器的渲染阶段
  1. 解析html文件形成DOM树根据节点间关系组织树的节点关系;
  2. 解析CSS形成CSS树
  3. 把DOM树和CSS树组合形成render树
  4. 接下来交给显卡,绘制成页面;

http的三次握手和四次挥手

http 协议建立和断开连接时不是一次就完成的,连接时而是通过三次握手,断开时要经历4次挥手

  • 三次握手
  1. 第一次握手:客户端发送syn码数据包给服务器,客户端要求和服务器建立连接
  2. 第二次握手:服务端接收到连接请求后,会发送ack码数据到客户端,表示你的连接请求已经收到,再次询问客户端是否确认建立连接
  3. 第三次握手:客户端收到服务器的ack码后,检验是否正确,如果正确则再次发送ack给服务器,表示确认连接

三次握手如果成功,客户端和服务端的连接成功建立,才会开始传递数据

  • 四次挥手
  1. 当客户端发送数据结束后,会发送fin告知服务器,客户端要给服务器的数据传输完了
  2. 服务端返回给客户端一个ack码,告知客户端已经知道数据传递完成。客户端收到ack,就会把发送到服务端的通道关闭
  3. 服务端数据传输结束后,也会发送fin给客户端
  4. 当客户端收到fin后,会发送ack给服务端,表示客户端知道服务端已经发送完毕,服务器收到ack后就可以放心的关闭数据传输通道

HTTP报文

HTTP报文用于http协议交互的信息,因为http通信分为请求和响应两个阶段,所以报文分为两种:

请求报文和响应报文

请求报文:

  1. 报文首部:请求首部分为请求行和请求头;请求行中包含 请求方法、协议、版本、URI
  2. 空行(CR+LF)
  3. 报文主体:客户端传递给服务端的数据

响应报文:

  1. 报文首部:状态行和响应头;状态行包含http协议版本,响应状态码
  2. 空行(CR+LF)
  3. 报文主体:响应体(服务端返回给客户端的数据)

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各部分代表的意义:

  1. http http/https: 协议
  2. www.dahai.com 域名
  3. :443 端口号 http 协议默认80,https默认443
  4. /tech/ai.html 路径
  5. ?user=mabin&time=2323456 参数(可以有可以没有)放在?后面的都是告知服务器的数据
  6. #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)收到响应