李志成的个人网站

李志成的个人网站

  • 博客
  • ·
  • 留言
  • ·
  • 友链
  • ·
  • 关于
  • ·
  • Rss

http协议

发表于2019-03-12 05:07:13分类于前端0条评论阅读次数37

概述

HTTP(hypertext transport protocol), 即超文本传输协议.这个协议详细规定了浏览器和万维网服务器之间互相通信的规则。

HTTP是一个客户端和服务器端请求和应答的标准(TCP)。客户端是终端用户,服务器端是网站。通常,由HTTP客户端发起一个请求,建立一个到服务器指定端口(默认是80端口)的TCP连接。HTTP服务器则在那个端口监听客户端发送过来的请求。可以简单归为请求/响应模式。

特点:

  • 灵活:HTTP允许传输任意类型的数据对象。
  • 无状态:HTTP是无状态协议。
  • 简单:客户向服务器请求服务时,只需传送请求方法和路径。

HTTP协议之URL

HTTP使用统一资源标识符(Uniform Resource Identifiers, URI)来传输数据和建立连接。

URL:统一资源定位符,就是一个网址:协议名://域名:端口/路径,例如:http://www.lizc.me:80/blog

HTTP协议之请求Request

Request请求的格式:请求首行 请求头信息 空行 请求体。

// 格式:请求方式(空格)请求路径(空格)协议版本(回车换行符)
// 请求方式:包括GET、HEAD、POST、PUT、DELETE等
// 例如:GET /index.html HTTP/1.1
请求首行;

// 格式:请求头名称:请求头内容,即为key:value格式
// 例如:Host:localhost
请求头信息;

空行;     // 用来与请求体分隔开

请求体。   // GET没有请求体,POST有请求体。

/**
* Request请求的格式:
* 请求首行;
* 请求头信息;
* 空行;
* 请求体;
*/

// 请求首行
> GET /api/articles?cid=5ac646026c06ab00153fa834 HTTP/1.1

// 请求头信息
> Host: www.lizc.me
> User-Agent: curl/7.55.1
> Accept: */*
> //换行

理解GET和POST的异同点

GET提交:

请求的数据会附在URL之后。如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密,得出如: %E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。

POST提交:

把提交的数据放置在是HTTP包的body中。 因此,GET提交的数据会在地址栏中显示出来,而POST提交,地址栏不会改变

传输数据的大小:

HTTP协议没有对传输的数据大小进行限制,HTTP协议规范也没有对URL长度进行限制。 但是在特定的浏览器上是对 URL 以及 请求数据体是有限制的。

一般来说 POST 请求能附带更多的内容相对于 GET 请求。

安全性 :

一般来说POST的安全性要比GET的安全性高,具体要根据实际情况来分析。

比如:通过GET提交数据,用户名和密码将明文出现在URL上除此之外,使用GET提交数据还可能会造成Cross-Site Request Forgery攻击。

GET和POST:

GET、POST协议都是建立在HTTP协议基础之上运行的 ,都是对服务器进行请求。

HTTP协议之响应Response

HTTP响应也由四个部分组成,分别是:响应状态行、消息报头、空行和响应正文。

// 响应协议为HTTP1.1,状态码为200,表示请求成功,OK是对状态码的解释;
< HTTP/1.1 200 OK 
// 服务器的版本信息;
< Server: nginx/1.14.0
// 响应时间
< Date: Tue, 12 Mar 2019 04:14:41 GMT
// 编码为UTF-8;
< Content-Type: application/json; charset=utf-8
// 响应体为5174字节;
< Content-Length: 5174
// 持续连接
< Connection: keep-alive
// 可指示代理来存储压缩和非压缩的版本资源。
< Vary: Accept-Encoding
// 自定义字段
< X-Paging: {"page":1,"limit":10,"total":1}
// 被请求变量的实体值
< ETag: W/"1436-6USDA6Aygefn7IZOz7s+1HJ2hUg"
< 
// 响应正文
[{"status":"pushed",...}...]

HTTP协议完整工作流程

HTTP协议规定了客户端向服务器端请求数据,以及服务器端如何返回数据给客户端的格式。

HTTP协议采用了请求/响应模型。

客户端需要向服务器发送一个请求报文,请求报文包含请求的方法、请求路径、请求头部、协议版本和请求实体。

服务器以一个状态行作为响应,响应的内容包括响应状态行、消息报头、空行、和响应数据。

以下是 HTTP 请求/响应的步骤:

1、客户端连接到Web服务器

客户端与服务器的HTTP端口(浏览器端口默认为80)TCP套接字连接。

2、发送HTTP请求

通过TCP连接,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。

3、服务器接受请求并返回HTTP响应

Web服务器解析请求,定位请求资源。服务器将相关资源信息写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。

4、释放连接TCP连接

若头部信息中的 connection 模式为 close,则服务器会主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;

若头部信息中的 connection 模式为 keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求。

5、客户端浏览器解析HTML内容

客户端浏览器首先会解析返回的响应报文。从解析得到的状态行中,查看表明请求是否成功的状态代码。然后再解析每一个响应头,逐步完成响应头功能操作。根据响应头告知响应文本为HTML文档以及相应字节长度后。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。

例如:在浏览器地址栏键入URL,按下回车之后会经历以下流程:

1、浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;

2、解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立TCP连接;

3、浏览器发出HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;

4、服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器;

5、释放TCP连接;

6、浏览器将该 html 文本进行渲染并生成html页面,呈现在浏览器上。

--发表评论--

🚀support markdown (* ̄▽ ̄*)ブ