HTTP(超文本传输协议)详细解析

  • Post author:
  • Post category:其他




概念

HTTP(HyperText Transfer Protocol)即超文本传输协议,它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应,是一个明文字符串传输协议,是一个简单的请求—响应协议。



http协议格式

首行:请求行 响应行(对于请求响应的简单描述)

头部:对于请求响应或者正文的关键描述

由键值对组成:key:value,每个键值对以\r\n结尾

空行:\r\n间隔头部和正文 \r\n\r\n头部结尾

正文:客户端提交给服务端或者 服务端响应给客户端的数据



首行



请求行

请求方法 URL 协议版本\r\n



请求方法

GET:

从服务端获取资源,请求没有正文,也可以提交数据,提交的数据放在URL中。

  1. 提交数据在URL中不安全
  2. URL长度有限

HEAD:

与GET功能一致,但是不要正文实体。

POST:

向服务端提交数据,请求有正文,数据放在正文中。



URL

就是我们通常说的网址,统一资源定位符,用于定位网络中某个主机上的资源。

协议名称://用户名:密码@域名:端口/资源路径?查询字符串#标识

例:https://user:pass@www.iqiyi.com:80/s?ie=utf-8&wd=ASCII

域名:

服务器别名访问服务器需要经过域名解析得到IP地址

/资源路径:

相对根目录

查询字符串:

由key=val键值对组成,键值对之间以&间隔



urlencode和urldecode

urlencode编码

用户请求资源路径或者在查询字符串中存在特殊字符,可能和URL中的特殊字符冲突。将特殊字符的每个字节转换成16进制数字字符,前缀%。

urldecode解码

遇到%则认为后面的两个字符进行过编码,将这两个字符转换为数字,第一个数字左移4位加上第二个数字。



协议版本

参考: https://blog.csdn.net/qq_22238021/article/details/81197157



HTTP0.9
  1. 仅支持请求方式GET
  2. 仅能请求访问HTML格式的资源。


HTTP1.0
  1. 规范协议格式
  2. 增加了请求方式POST和HEAD
  3. 不再局限于0.9版本的HTML格式,支持多媒体资源传输,根据Content-Type可以支持多种数据格式
  4. 每个连接只能发送一个请求,发送数据完毕,连接就关闭,如果还要请求其他资源,就必须再新建一个连接


HTTP1.1
  1. 支持长链接即连接默认不关闭,可以被多个请求复用,使用Connection:keep-alive/close控制长连接打开关闭的状态
  2. 加入了管道机制,在同一个连接里,允许多个请求同时发送,增加了并发性,进一步改善了HTTP协议的效率;
  3. 新增PUT、PATCH、OPTIONS、DELETE等请求方式


注意:

虽然1.1版允许复用TCP连接,但是同一个TCP连接里面,所有的数据通信是按次序进行的。服务端是按队列顺序处理请求的,服务器只有处理完一个回应,才会进行下一个回应。假如前面的请求处理时间很长,后面就会有许多请求排队等着,这样就造成了“队头阻塞”的问题;同时HTTP是无状态的连接,因此每次请求都需要添加重复的字段,降低了带宽的利用率。



HTTP2.0
  1. 因为HTTP协议的庞大冗余,2.0重新定义HTTP协议
  2. 使用二进制数据传输
  3. 支持主动推送资源
  4. 服务器进行场链接响应不需要按序进行



响应行

协议版本 响应状态码 状态码描述\r\n



响应状态码

向客户端反馈处理结果



状态码描述

针对状态的文字描述

参考 https://www.runoob.com/http/http-status-codes.html

在这里插入图片描述
在这里插入图片描述



头部

关于请求响应或者正文的一些描述字段

组成:

key:val\r\nkey:val\r\n



常用头部字段

Connection:设置当前连接和hop-by-hop协议请求字段列表的控制选项

Referer:记录本次请求的来源链接

Content-Type:设置正文的数据格式

Content-Length:设置正文的字节长度



cookie



无状态协议

首先,我们要知道http协议是一个

无状态协议。

由于http是无状态协议,所以服务端需要记录用户的状态时,就需要用某种技术来识具体的用户。

比如:购物车,当你点击下单按钮时,由于HTTP协议无状态,所以并不知道是哪个用户操作的,也就需要一中机制维护通信状态。


cookie就是一个维护http通信状态的机制。



流程

一个客户端登录后,服务端验证登录,成功之后通过Set-Cookie字段设置cookie信息(用户信息,状态,密码……)返回给客户端

客户端收到响应后,将cookie信息保存,下次请求服务器时从cookie文件中读取cookie信息,通过Cookie字段发送给服务器。



=cookie不安全

cookie是不安全的,因为它存储在客户端,一些别有用心的人能够通过浏览器截获cookie(脚本、利用工具抓取等)。



session

由于cookie存在安全隐患,所以也就有了解决方案:session。

session是服务端针对每个客户端建立的会话,当客户端登录成功后,创建会话,在会话中保存客户端的用户信息、状态,通过Set-Cookie字段将session_id返回给客户端。

这样用户的信息一直保存在服务器不容易泄露。



cookie和session区别


cookie:

是维护http通信状态的技术,将用户信息保存在客户端,每次请求服务器时,读取出来发送给服务器


session:

是解决cookie安全隐患的技术,将用户信息保存在服务端,往后请求传输都是用seeion_id,解决泄密的风险。



空行

\r\n

与头部最后一个字段结尾的\r\n组成的特殊标,表示http头部结尾



正文

部分是传输的实际内容,它们的格式是任意的,通常用Content-Type头来指定。



版权声明:本文为qq_34270874原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。