HTTP(超文本传输协议)详细解析
文章目录
- 概念
- http协议格式
- 首行
- 请求行
- 请求方法
- URL
- urlencode和urldecode
- 协议版本
- HTTP0.9
- HTTP1.0
- HTTP1.1
- HTTP2.0
- 响应行
- 响应状态码
- 状态码描述
- 头部
- 常用头部字段
- cookie
- 无状态协议
- 流程
- =cookie不安全
- session
- cookie和session区别
- 空行
- 正文
概念
HTTP(HyperText Transfer Protocol)即超文本传输协议,它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应,是一个明文字符串传输协议,是一个简单的请求—响应协议。
http协议格式
首行:请求行 响应行(对于请求响应的简单描述)
头部:对于请求响应或者正文的关键描述
由键值对组成:key:value,每个键值对以\r\n结尾
空行:\r\n间隔头部和正文 \r\n\r\n头部结尾
正文:客户端提交给服务端或者 服务端响应给客户端的数据
首行
请求行
请求方法 URL 协议版本\r\n
请求方法
GET:
从服务端获取资源,请求没有正文,也可以提交数据,提交的数据放在URL中。
- 提交数据在URL中不安全
- 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
- 仅支持请求方式GET
- 仅能请求访问HTML格式的资源。
HTTP1.0
- 规范协议格式
- 增加了请求方式POST和HEAD
- 不再局限于0.9版本的HTML格式,支持多媒体资源传输,根据Content-Type可以支持多种数据格式
- 每个连接只能发送一个请求,发送数据完毕,连接就关闭,如果还要请求其他资源,就必须再新建一个连接
HTTP1.1
- 支持长链接即连接默认不关闭,可以被多个请求复用,使用Connection:keep-alive/close控制长连接打开关闭的状态
- 加入了管道机制,在同一个连接里,允许多个请求同时发送,增加了并发性,进一步改善了HTTP协议的效率;
- 新增PUT、PATCH、OPTIONS、DELETE等请求方式
注意:
虽然1.1版允许复用TCP连接,但是同一个TCP连接里面,所有的数据通信是按次序进行的。服务端是按队列顺序处理请求的,服务器只有处理完一个回应,才会进行下一个回应。假如前面的请求处理时间很长,后面就会有许多请求排队等着,这样就造成了“队头阻塞”的问题;同时HTTP是无状态的连接,因此每次请求都需要添加重复的字段,降低了带宽的利用率。
HTTP2.0
- 因为HTTP协议的庞大冗余,2.0重新定义HTTP协议
- 使用二进制数据传输
- 支持主动推送资源
- 服务器进行场链接响应不需要按序进行
响应行
协议版本 响应状态码 状态码描述\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头来指定。
HTTP(超文本传输协议)详细解析相关推荐
- http超文本传输协议
http简介 超文本传输协议(HyperText Transfer Protocol),详细规定浏览器和万维网之间互相通信的规则,是万维网交换信息的基础,允许将HTML文档从Web服务器传送到Web服 ...
- 超文本传输协议HTTP
在了解HTTP 协议之前需要先了解一些其他的概念,了解它们之间的关系才能更好的理解HTTP 协议. 内容偏于理论知识,理解起来可能不是很容易,所以在阅读之前希望带着以下几个问题,增加阅读的兴趣. 为什 ...
- 超文本传输协议版本 2 [http/2 spec]
Github:中英对照版 超文本传输协议版本 2 IETF HTTP2草案(draft-ietf-httpbis-http2-13) 摘要 本规范描述了一种优化的超文本传输协议(HTTP).HTTP/ ...
- 超文本传输协议-HTTP/1.1
说明 本文档规定了互联网社区的标准组协议,并需要讨论和建议以便更加完善.请参考 "互联网官方协议标准"(STD 1)来了解本协议的标准化状态.本协议不限流传发布. 版权声明 Cop ...
- 超文本传输协议HTTP/1.1
文章来源: http://www.blogjava.net/sunchaojin/archive/2007/08/09/http.html 说明 本文档规定了互联网社区的标准组协议,并需要讨论和建议以 ...
- 超文本传输协议(HTTP/1.1)中文翻译
超文本传输协议-HTTP/1.1 说明 本文档规定了互联网社区的标准组协议,并需要讨论和建议以便更加完善.请参考 "互联网官方协议标准"(STD 1)来了解本协议的标准化状态.本协 ...
- HTTP超文本传输协议-HTTP/1.1中文版
HTTP超文本传输协议-HTTP/1.1中文版 摘要 超文本传输协议(HTTP)是一种为分布式,合作式,多媒体信息系统服务,面向应用层的协议.它是一种通用的,不分状态(stateless)的协议,除了 ...
- (转载)HTTP超文本传输协议-HTTP/1.1中文版
HTTP超文本传输协议-HTTP/1.1中文版 摘要 超文本传输协议(HTTP)是一种为分布式,合作式,多媒体信息系统服务,面向应用层的协议.它是一种通用的,不分状态(stateless)的协议,除了 ...
- 超文本传输协议 -- HTTP/1.1(二)
超文本传输协议 -- HTTP/1.1(二) 13 HTTP中的缓存 13.1 警告模式 13.1.1 缓存正确性 13.1.2 警告 13.1.3 缓存控制机制 13.1.4 显式用户代理警告 13 ...
最新文章
- Kotlin成为正式的Android编程语言
- Ubuntu 下Ape转Mp3[88250原创]
- Unity3D ShaderLab 菲涅耳内轮廓
- 牛客网-剑指offer 第一题(二维数组中的查找)
- CodeForces - 1174D Ehab and the Expected XOR Problem(构造+思维+位运算)
- ngixn+tomcat负载均衡 动静分离配置 (nginx反向代理)
- PHP高级——抽象类与接口的区别
- Oracle精简客户端配置
- Druid 配置及内置监控,Web页面查看监控内容
- JavaScript中清空数组的三种方式对比以及JavaScript常用数组操作方法
- Locally weighted linear regression
- 【笔记】工具 - 输入法 - rime 小狼毫(weasel)
- 基于springboot助学贷款管理毕业设计源码061528
- 【笔记】一些Attention 方面的网络
- vue项目中如何下载excel表格模板
- 3d效果图设计师接私单的渠道介绍和避坑指南
- 简图记录-GAMMA技术基础
- java过滤微信昵称emoji表情
- 2013 即将上映电影
- 宏碁(Acer)笔记本的型号解析
热门文章
- 4G,64bit,PAE
- 秋冬季健康生活小常识
- 2019年Java大厂面试题讲解(周阳) 之Github学习(自学路上助推器)
- phpadmin删除数据库中的用户
- linux安装软件之./configure、make、make install 命令含义
- php解压有密码的压缩包,linux下解压有密码的rar压缩包
- 程序员无处安放的青春
- 微信js 已经填写JS接口安全域名了,仍然报invalid url domain
- C++-点到点、点到线、共线等常用计算
- 互联网平台埋点方案对比 Mixpanel vs Heap vs GrowingIO vs MTA