图解HTTP-HTTP
文章目录
- HTTP
- HTTP是不保存状态的协议(对请求和响应不做持久化处理)
- 请求URI定位资源
- HTTP中的方法
- 1、GET(获取资源)
- 2、POST( 传输实体主体)
- 3、PUT(传输文件)
- 4、HEAD(获取报文首部)
- 5、DELETE:删除文件
- 6、OPTIONS
- 7、TRACE(追踪路径)
- 例子
- 8、CONNECT(要求用隧道协议连接代理,使用SSL或者TLS协议将通信内容加密后经网络隧道传输)
- 例子
- 总结
- 持久连接节省通信量
- 建立连接
- 断开TCP连接
- 持久连接(HTTP1.1所有的连接都是持久连接)
- 管线化(不需要等待响应即可直接发送下一个请求)
- 使用Cookie管理状态
- 例子
- HTTP报文内的HTTP信息
- 1、请求报文结构
- 首部字段分类
- 提升传输速率
- 编码提升传输速率(客户端收到后需要解码)
- 分割发送的分块传输编码
- 发送多种数据的多部分对象集合
- MIME类型
- multipart/form-data
- multipart/byteranges
- multipart/byteranges
- 获取部分内容的范围请求(Range首部来指定资源的byte范围)
- 内容协商返回合适内容
- 内容协商分类
- 返回结果的HTTP状态码
- 状态码告知从服务端返回的请求结果
- 2XX成功
- 200(表示请求被正常处理)
- 204(No Content)
- 206(Partial Content)
- 3XX重定向
- 1、301Moved Permanently(永久性重定向)
- 2、302 Found
- 303(略)
- 304(略)
- 307(略)
- 4XX客户端错误
- 400 Bad Request(请求报文存在语法错误)
- 401 Unauthorized
- 403Forbidden
- 404 Not Found
- 5XX服务器错误
- 500 Internal Server Error(执行请求时发生错误)
- 503 Service Unavailable(服务器处于超负载或正在进行停机维护)
- 与HTTP协作的Web服务器
- 1、用单个虚拟主机实现多域名(借助Host首部实现)
- 2、通信数据转发程序:代理、网关、隧道
- 代理(不会改变请求URI)
- 缓存代理
- 透明代理
- 网关
- 隧道(保证服务端和客户端可以安全通信)
- 保存资源的缓存
- HTTP首部(请求头、响应头部分)
- 首部传递重要信息
- 首部结构
- 4种首部字段类型
- 通用首部字段
- 请求首部字段
- 响应首部字段
- 实体首部字段
- 首部具体信息(略)
HTTP
在两台计算机之间使用HTTP协议进行通信的时候,在一条链路上必定有一端是客户端,另外一端则是服务端(但是角色可能会互换)。
就仅一条通信链路而言,服务端和客户端的角色是固定的,而用HTTP协议能够区分哪个是客户端,哪个是服务端。
HTTP协议规定,请求从客户端发出,最后服务器端响应请求并返回。也就是说服务端在没有接收到请求之前不会发送响应。
HTTP是不保存状态的协议(对请求和响应不做持久化处理)
HTTP协议是无状态的协议,HTTP协议自身不对请求和响应之间的通信状态进行保存。也就是说在HTTP这个级别,协议对于发送过的请求或者响应都不做持久化处理。
但是无状态可能会导致业务处理变得棘手的情况增多,比如登陆到一家购物网站,即使跳转到该网站的其他页面,也需要能继续保持登陆状态。为了实现这个功能,于是引入了Cookie技术
请求URI定位资源
1、URI为完整的请求URI
GET http://hackr.jp/index.htm HTTP/1.1
URI在请求头中2、在首部字段HOST中写明网络域名或IP地址
GET /index.htm HTTP/1.1
Host:hackr.jp
在Host中写明域名或者IP
HTTP中的方法
1、GET(获取资源)
GET方法用来请求访问已被URI识别的资源。指定的资源经服务端解析后返回内容。
也就是说,如果是文本,那么就直接原样返回,如果是像CGI那样的程序,那么返回经过执行后的输出结果
2、POST( 传输实体主体)
实体主体可以理解成请求体
虽然用GET也可以传输实体的主体,但是一般不用get,虽然POST和GET相似,但是POST的主要目的不是获取响应的主体内容。
3、PUT(传输文件)
要求在请求报文的主体中包含文件内容。然后保存到请求URI的指定的位置。
4、HEAD(获取报文首部)
HEAD和GET方法一样,只是不返回报文主体部分,用于确认URI的有效性即资源更新日期时间等。
5、DELETE:删除文件
DELETE方法用来删除文件,是与PUT相反的方法,用于按请求URI删除指定的资源。
6、OPTIONS
OPTIONS方法用来查询针对请求URI指定的资源支持的方法。
7、TRACE(追踪路径)
TRACE方法是让WEB服务器端将之前的请求通信返回给客户端。
发送请求的时候,在Max-Forwards首部字段中填入数值,每经过一个服务器端就将数字减去1,当数值刚好减到0的时候,就停止传输,最后接收到请求的服务器端返回状态码200 OK的响应。
客户端可以通过TRACE方法查询发送出去的请求是怎么样被加工修改的。这是因为连接到目标服务器可能会通过代理中转。
中间可能会经过多个代理服务器,返回当Max-Forwards为0的时候,此时那个服务器或者代理服务器收到的请求。
例子
请求:
TRACE /HTTP/1.1
Host:hackr.jp
Max-Forwards:2
响应:
HTTP/1.1 200 OK
Content-Type:message/http
Content-Length:1024TRACE /HTTP/1.1
Host:hackr.jp
Max-Forwards:2
在上面的响应体中,返回响应包含的请求内容
8、CONNECT(要求用隧道协议连接代理,使用SSL或者TLS协议将通信内容加密后经网络隧道传输)
CONNECT方法要求在代理服务器通信时候建立隧道,实现用隧道协议进行TCP通信。主要使用SSL(Secure Sockets Layer,安全套接字)和TLS(Transport Layer Security,传输层安全)协议把内容加密后经网络隧道传输。
CONNECT方法的格式如下所示:
- CONNECT 代理服务器名:端口号 HTTP版本
例子
使用CONNECT方法的请求-响应的例子:
请求
CONNECT proxy.hackr.jp:8080 HTTP/1.1
HOST:proxy.hackr.jp响应
HTTP/1.1 200 OK(之后进入网络隧道)
总结
方法 | 说明 | 支持的HTTP协议版本 |
---|---|---|
GET | 获取资源 | 1.0、1.1 |
POST | 传输实体实体 | 1.0、1.1 |
PUT | 传输文件 | 1.0、1.1 |
HEAD | 获取报文首部 | 1.0、1.1 |
DELETE | 删除文件 | 1.0、1.1 |
OPTIONS | 询问支持的方法 | 1.1 |
TRACE | 追踪路径 | 1.1 |
CONNECT | 要求用隧道协议连接代理 | 1.1 |
LINK | 建立和资源之间的联系 | 1.0 |
UNLINK | 断开连接关系 | 1.0 |
在这里列举了中多方法,LINK和UNLINK已经被HTTP/1.1废弃,不再支持。
持久连接节省通信量
HTTP协议的初始版本中,每进行一次HTTP通信就要断开一次TCP连接。
下面的建立连接和断开连接可以以左边为客户端右边为服务端为例子看
建立连接
- -----SYN—》
- 《----SYN/ACK-----
- -----ACK----》
断开TCP连接
- 《----FIN----
- ------ACK—》
- -----FIN—》
- 《-----ACK-----
如果不支持持久连接,在很多HTML页面中,可能要加载或者很多图片等,那么就需要多次TCP的连接和断开。
持久连接(HTTP1.1所有的连接都是持久连接)
为了解决TCP连接的问题,HTTP/1.1和一部分HTTP/1.0想出了持久连接的方法,持久连接的特点是,只要任意一端没有明确断开连接,则保持TCP连接状态。
在HTTP/1.1中,所有的连接默认都是持久连接,但是在1.0的时候还没有标准化。
管线化(不需要等待响应即可直接发送下一个请求)
持久连接使得多数请求以管线化(Pipeling)方式发送成为可能。从前发送请求需要等待并收到响应,才能发送下一个请求,管线化技术出现后,不用等待响应即可直接发送下一个请求。
使用Cookie管理状态
因为HTTP是无状态的,不对之前的请求和响应的状态进行管理。也就是说,无法根据之前的状态进行本次的请求处理。
无状态好处:
- 不必保存状态,自然可减少服务器的CPU以及内存的消耗。
Cookie技术通过在请求和响应的报文中写入Cookie信息来控制客户端的状态。
- 1、Cookie会根据从服务器发送的响应报文内的一个叫做Set-Cookie的首部字段信息,通知客户端保存Cookie。当下次客户端再往服务器发送请求的时候,客户端会自动在请求报文中加入Cookie值后发送出去。
- 2、服务器端发现客户端发送来的Cookie之后,会去检查究竟是从哪一个客户端发来的连接请求,然后对比服务器上的记录,得到之前的状态信息。
例子
- 1、请求报文(没有Cookie信息的状态)
GET /reader/ HTTP/1.1
Host:hackr.jp
- 2、响应报文(服务器端生成Cookie信息)
HTTP/1.1 200 OK
Date: Thu,12 Jul 2012 07:12:20 GMT
Server:Apache
Set-Cookie:sid=13520771420226724;path=/;expires=Wed,10-Oct-12 07:12:20 GMT
Context-Type:text/plain;charset=UTF-8
- 3、请求报文(自动发送保存着的Cookie信息)
GET /image/ HTTP/1.1
Host:hackr.jp
Cookie:sid=13520771420226724
HTTP报文内的HTTP信息
1、请求报文结构
请求报文结构
- 请求行
- 请求头(报文首部)
- 请求空行
- 请求体(报文主体)
响应报文结构:
- 响应行(状态行)
- 响应头
- 响应空行
- 响应体
首部字段分类
- 通用首部
- 请求首部
- 响应首部
- 实体首部
提升传输速率
编码提升传输速率(客户端收到后需要解码)
编码的操作需要计算机完成,因此会消耗更多的CPU资源。
常见的压缩编码有下面几种:
- gzip(GNU zip)
- compress(UNIX 系统的标准压缩)
- deflate(zlib)
- identity(不进行编码)
分割发送的分块传输编码
在HTTP通信过程中,请求的编码实体资源尚未传输完成之前是无法显示请求页面的,在传输大容量时,通过把数据分割成多块,能够让浏览器逐步显示页面。
这种把实体主体分块的功能称为分块传输编码。
发送多种数据的多部分对象集合
MIME类型
MIME(Multipurpose Internet Mail Extensions):多用途因特网邮件扩展
在把输出结果传送到浏览器上的时候,浏览器必须启动适当的应用程序来处理这个传输文档,这就可以通过MIME来完成。在HTTP中,MIME类型被定义在Content-Type Head中。
multipart/form-data
在web表单文件上传时使用
multipart/byteranges
状态码206响应报文包含了多个范围的内容时使用
multipart/byteranges
在HTTP报文中使用多部分对象集合时,需要在首部里加上Content-type。
获取部分内容的范围请求(Range首部来指定资源的byte范围)
要实现该功能需要指定下载的实体范围,像这样,指定范围发送的请求叫做范围请求。
5001-10000字节:
- Range:bytes=5001-10000
从5001字节之后全部:
- Range:bytes=5001-
从一开始到3000字节和5000-7000字节的多重范围:
- Range:bytes=0-3000,5000-7000
内容协商返回合适内容
在一个Web网站可能存在多份相同内容的页面,比如英语版本、中文版本的web页面,虽然内容上相同,但是使用的语言不同。
当浏览器的默认语言为英语或者中文,访问相同的URI的WEB页面的时候,则会显示对应的英语版或者中文版本的页面。这样的机制称为内容协商。
内容协商会以语言、字符集、编码方式等为基准判断响应的资源:
- ACCEPT
- ACCEPT-Charset
- Accept-Encoding
- Accept-Language
- Content-Language
内容协商分类
- 服务器驱动协商
以请求的首部为参考,在服务端自动处理。 - 客户端驱动协商
用户从浏览器显示的可选选项中进行手动选择 - 透明协商
这是服务器驱动和客户端驱动的结合体,是由服务器端和客户端各自进行内容协商的一种方法。
返回结果的HTTP状态码
状态码告知从服务端返回的请求结果
类别 | 原因短语 | |
---|---|---|
1XX | 信息性状态码 | 接收的请求正在处理 |
2XX | 成功状态码 | 请求正常处理完毕 |
3XX | 重定向状态码 | 需要进行附加操作以完成请求 |
4XX | 客户端错误状态码 | 服务器无法处理请求 |
5XX | 服务器错误状态码 | 服务器处理请求错误 |
只要遵守状态码类别的定义,即使改变RFC2616中定义的状态码或服务器端自行创建状态码都没问题。
2XX成功
200(表示请求被正常处理)
表示从客户端发来的请求在服务器端被正常处理了。
204(No Content)
表示服务器接收的请求已成功处理,但是在返回的响应报文中不含实体的主体部分,也不允许返回任何实体的主体。
当浏览器发出请求处理之后,返回204响应,那么浏览器显示的页面不发生更新。
206(Partial Content)
该状态码表示客户端进行了范围请求,而服务器成功执行了这部分的get请求。
响应报文中包含有Content-Range指定范围的实体内容。
3XX重定向
1、301Moved Permanently(永久性重定向)
永久性重定向.
这个状态码表示请求的资源已经被分配了新的URI。以后应该使用资源现在所指的URI。
2、302 Found
临时性重定向
该状态码表示请求的资源被分配了新的URI。希望用户(本次)能使用新的URI访问。
和301不同的是,302资源不是被永久移动。
303(略)
304(略)
307(略)
4XX客户端错误
400 Bad Request(请求报文存在语法错误)
该状态码表示请求报文中存在语法错误。
401 Unauthorized
表示发送的请求需要有HTTP认证(BASIC、DIGEST认证)的认证信息。如果之前以及进行过一次请求,那么表示用户认证失败。
403Forbidden
表示对请求资源的访问被服务器拒绝了。
服务器没有必要给出拒绝的理由,但是如果要给出拒绝理由的话,可以在实体的主体部分对原因进行描述。这样用户就能看到。
404 Not Found
表示服务器上无法找到请求的资源
5XX服务器错误
500 Internal Server Error(执行请求时发生错误)
表示服务器端在执行请求时发生错误
503 Service Unavailable(服务器处于超负载或正在进行停机维护)
表示服务器暂时处于超负载或者正在进行停机维护。
与HTTP协作的Web服务器
1、用单个虚拟主机实现多域名(借助Host首部实现)
在互联网上,域名通过DNS解析映射到IP地址,可见,当请求发送到服务器的时候,已经上以IP地址形式访问了。
所以如果多域名的话,当接收到请求的时候就要弄清楚究竟要访问哪个域名。
在相同的IP地址下,虚拟主机可以寄存多个不同主机名和域名的web网站,因此在发送HTTP请求的时候,必须在Host首部内完整指定主机名或域名的URI
2、通信数据转发程序:代理、网关、隧道
在HTTP通信的时候,还有一些用于转发通信数据的应用程序,如:代理、网关和隧道。
这些应用程序和服务器可以将请求转发给通信线路上的下一站服务器,并且能接收从那台服务器发送的响应再转发给客户端。
代理(不会改变请求URI)
代理是一种有转发功能的应用程序,位于服务器和客户端之间,接收由客户端发送来的请求再转发给服务器,同时也接收服务器返回的响应并转发给客户端。
代理的好处:利用缓存减少网络带宽的流量。
缓存代理
预先将资源的副本保存在代理服务器
当对相同资源请求的时候,可以不从原服务器取数据,而是将之前缓存的资源作为响应返回。
透明代理
不对报文做任何加工的代理。
网关
网关是其他服务器通信数据的服务器,接收从客户端发来的请求,它就像自己拥有资源的服务器一样对请求进行处理,有时客户都不会察觉自己的通信目标是一个网关。
网关和代理类似,但是网关能使通信线路上的服务器提供非HTTP协议服务。
隧道(保证服务端和客户端可以安全通信)
隧道可以按照要求建立起一条与其他服务器的通信线路,届时可以使用SSL等加密方式进行通信。隧道目的是为了保证服务端和客户端之间可以安全通信。
保存资源的缓存
缓存服务器好处在于利用缓存可以避免多次从原服务器转发资源,因此客户端就近从服务器上获取资源,而原服务器也不必多次处理相同请求。
HTTP首部(请求头、响应头部分)
首部传递重要信息
HTTP首部是构成HTTP报文的重要要素之一。无论是请求和响应都会使用首部字段,它能起到传递额外重要信息的作用。
首部是为了给浏览器和服务器提供报文主体大小、所使用的语言、认证等内容
首部结构
首部字段名:字段值
例如:
- Content-Type来表示报文主体的对象类型
Content-Type:text/html
4种首部字段类型
通用首部字段
在请求和响应两方都有的首部。
请求首部字段
从客户端向服务端发送请求报文时使用的首部,补充了请求的附加内容、客户端信息、响应内容相关内容优先级等信息
响应首部字段
从服务器端向客户端返回响应报文时使用的首部,补充了响应的附加内容,也会要求客户端附加额外的内容信息。
实体首部字段
补充了资源内容更新时间等与实体有关的信息。
首部具体信息(略)
图解HTTP-HTTP相关推荐
- CentOS 8 安装图解
继 RHEL 8 发布之后,CentOS 社区也发布了让人期待已久的 CentOS 8,并发布了两种模式: CentOS stream:滚动发布的 Linux 发行版,适用于需要频繁更新的开发者 Ce ...
- 图解DotNet框架系列
图解.Net框架系列(索引贴) (声明:本系列已完成,故索引帖重发) 众所周知,DotNet框架是非常庞大的,光项目创建时的种类就有WPF,WCF,WF这三种最新的技术,还有以前的Web,WinFor ...
- 二叉树线索化示意图_103-线索化二叉树思路图解
2.网上数据结构和算法的课程不少,但存在两个问题: 1)授课方式单一,大多是照着代码念一遍,数据结构和算法本身就比较难理解,对基础好的学员来说,还好一点,对基础不好的学生来说,基本上就是听天书了 2) ...
- centos 下安装mysql,linux(Centos7)下安装mysql8.0.18的教程图解
1 获取安装资源包 mysql-8.0.18-1.el7.x86_64.rpm-bundle.tar 提取码: rsif 2 在/usr/local目录下新建目录mysql8 3 将下载的资源包(my ...
- 女士细线毛衣起多少针_潇洒帅气的男童V领开襟毛衣编织,带教程图解
终于又完工一件. 用线:宝宝毛9号8团多用针:ADD2.75,3.0成衣尺寸:衣长43cm,胸围72cm,袖长42cm,肩宽32cm编织过程:1,用另线起针法起222针,织双螺纹5cm,排花,织20c ...
- bartender一行打印两个二次开发_C++ 智能指针和二叉树:图解层序遍历和逐层打印二叉树...
作者:apocelipes 链接:https://www.cnblogs.com/apocelipes/p/10758692.html 二叉树是极为常见的数据结构,关于如何遍历其中元素的文章更是数不 ...
- Android环境变量的设置(详细图解版)
Android环境变量的设置(详细图解版) 转载于:https://www.cnblogs.com/zhujiabin/p/4875182.html
- 选项选择Windows XP系统安装MySQL5.5.28图解
本文纯属个人见解,是对前面学习的总结,如有描述不正确的地方还请高手指正~ Windows XP系统安装MySQL5.5.28图解 MySQL数据库的安装一共分为两个部分:数据库的安装和数据库的配置. ...
- java备忘录模式应用场景_图解Java设计模式之备忘录模式
图解Java设计模式之备忘录模式 游戏角色状态恢复问题 游戏角色有攻击力和防御力,在大战Boss前保存自身的状态(攻击力和防御力),当大战Boss后攻击力和防御力下降,从备忘录对象恢复到大战前的状态. ...
- win mysql修改端口号_Windows10系统下查看mysql的端口号并修改的教程图解
mysql的端口号默认是3306,初学者可能有时会忘记或者之前修改了默认的端口号,忘记了,或者很多时候我们一台电脑需要安装两个mysql或者想设置一个自己的喜欢的数字,那么接下来我们来看看如何查看或者 ...
最新文章
- Spark Streaming实践和优化
- 前端、git入门至常用指令
- 2014年02月16日
- 2017年蓝桥杯省赛
- 0409互联网新闻 | 微信:朋友圈广告@好友评论互动能力全量开放;视频会议软件Zoom将于4月18日在纳斯达克交易所挂牌上市...
- 基于Cocos2d-x开发guardCarrot--4 《保卫萝卜2》主页面动画
- 如何彻底关闭windows10自动更新
- ubuntu16.04查看opencv版本
- 基于单片机的语音小车设计
- Typora实用快捷键
- 二手房房价影响因素分析
- 微信公众号js复制到手机剪贴板
- 应用泛函分析—距离空间
- snappy格式解析
- 力扣(647.516)补9.15
- 推荐系统领域对比学习和数据增强论文及代码集锦
- linux安装部署Hive详细教程
- 【无标题】C语言连续输出输入语句执行跳过的问题
- uni-app 二维码扫描识别功能
- html电视剧网页模板,电视剧列表.html