HTTP协议学习笔记
1 HTTP简介
超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议。是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)的协议。
HTTP是万维网的数据通信的基础,它允许将HTML(超文本标记语言)文档从Web服务器传送到Web浏览器。
HTTP协议通信流程:
HTTP协议目前最新版的版本是1.1,HTTP是一种无状态的协议,无状态是指Web浏览器与Web服务器之间不需要建立持久的连接,这意味着当一个客户端向服务器端发出请求,然后Web服务器返回响应(Response),连接就被关闭了,在服务器端不保留连接的有关信息。也就是说,HTTP请求只能由客户端发起,而服务器不能主动向客户端发送数据。==》 短连接
1.1 HTTP 工作原理
HTTP协议工作于客户端-服务端架构上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。
Web服务器有:Apache服务器,IIS服务器(Internet Information Services)等。
Web服务器根据接收到的请求后,向客户端发送响应信息。
HTTP默认端口号为80,但是你也可以改为8080或者其他端口。
1.2 特点
- HTTP是无连接的:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。短连接。
- HTTP是媒体独立的:这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。
- HTTP是无状态的:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
- 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
- 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
- 支持B/S及C/S模式。
1.3 概述
Http协议:简单的对象访问协议,对应于应用层。Http协议是基于TCP链接的。
tcp协议:对应于传输层
ip协议:对应与网络层
TCP/IP是传输层协议,主要解决数据如何在网络中传输;而Http是应用层协议,主要解决如何包装数据。
Http连接:短连接,即客户端向服务器发送一次请求,服务器端相应后连接即会断掉。
客户端发送请求都需要服务器端回送响应.请求结束后,主动释放链接,因此为短连接。通常的做法是,不需要任何数据,也要保持每隔一段时间向服务器发送"保持连接"的请求。这样可以保证客户端在服务器端是"上线"状态。
HTTP连接使用的是"请求-响应"方式,不仅在请求时建立连接,而且客户端向服务器端请求后,服务器才返回数据。
有两种HTTP报文的类型,请求与响应,每种都有其特定的格式。
2 HTTP请求(请求协议)
2.1 请求格式
客户端发送一个HTTP请求到服务器的请求消息包括以下格式:请求行(request line)、请求头部(header)、空行和请求数据四个部分组成,下图给出了请求报文的一般格式。
Content-length表示请求体里面的数据长度,Content-length:16对应 内容实体 “name=ueno&age=37” 正好16个字节
客户端请求实例:
下面实例是一点典型的使用GET来传递数据的实例:
HTTP请求第二行为请求头(也被称为消息头)。其中,User-Agent代表浏览器的标识,请求头由客户端自行设定,HOST代表请求主机地址,Accept-Language代表可接受的响应内容语言列表。
GET /hello.txt HTTP/1.1 //请求行,方法是GET,路径是"/hello.txt", 版本是HTTP/1.1
User-Agent: curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3 //请求头部
Host: www.example.com //服务器域名:www.example.com
Accept-Language: en, mi // 可接受语言:英语、毛利语
2.2 请求行
HTTP请求第一行为请求行,由3个部分组成:
- 请求方法(method):说明了该请求时POST请求
- 路径(url):用来说明请求是该域名根目录下的什么对象
- 版本(version):HTTP协议版本号。
2.2.1 请求方法
HTTP1.0 定义了三种请求方法: GET, POST 和 HEAD方法。
HTTP1.1 新增了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。
方法 | 描述 |
---|---|
GET | 请求指定的页面信息,并返回实体主体。 |
POST | 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。 |
HEAD | 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头 |
PUT | 从客户端向服务器传送的数据取代指定的文档的内容。 |
DELETE | 请求服务器删除指定的页面。 |
CONNECT | HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。 |
OPTIONS | 返回服务器针对特定资源所支持的HTTP请求方法。也可以利用向Web服务器发送’*'的请求来测试服务器的功能性。 |
TRACE | 回显服务器收到的请求,主要用于测试或诊断。 |
PATCH | 是对 PUT 方法的补充,用来对已知资源进行局部更新 。 |
在实际应用中常用 get 和 post,其他请求方式也都可以通过这两种方式间接的来实现。
GET、POST、HEAD、PUT请求:
GET
:GET方法用于获取请求页面的指定信息。如果请求资源为动态脚本(非HTML),那么返回文本是Web容器解析后的HTML源代码。GET请求没有消息主体,因此在消息头后的空白行是没有其他数据。POST
:POST方法也与GET方法相似,但最大的区别在于,GET方法没有请求内容,而POST是有请求内容的。HEAD
:这个请求的功能与GET请求相似,不同之处在于服务器不会再其响应中返回消息主体,因此,这种方法可用于检查某一资源在向其提交GET请求前是否存在。PUT
:PUT方法用于请求服务器把请求中的实体存储在请求资源下,如果请求资源已经在服务器中存在,那么将会用此请求中的数据替换原先的数据。向服务器上传指定的资源。
2.2.2 URL
路径(url):用来说明请求是该域名根目录下的什么对象
http协议与url简介
URL:(Uniform Resource Locator)统一资源定位符,对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。
URI:(Uniform Resource Identifier)统一资源标识符,用于定位web上的资源。该种标识允许用户对任何(包括本地和互联网)的资源通过特定的协议进行交互操作。URL是URI的子集。
URN:(uniform resource name)统一资源命名,是通过名字来标识资源,比如mailto:java-net@java.sun.com。
HTTP的URL是一种特殊类型的URI,包含了用于定位查找某个网络资源的路径,格式:
http://host[':'port][abs_path]
http
表示通过http协议来定位网络资源; host
表示合法的Internet主机域名或者IP地址; port
指定一个端口,如果缺省,默认是80端口. abs_path
表示的是请求的资源的URL,如果什么都没写,则浏览器会帮我们加上/,作为初始的路径地址.
URL详解
以下面这个URL为例:
http://www.aspxfans.com:8080/news/index.asp?boardID=5&ID=24618&page=1#name
1.协议部分:代表网页使用的是HTTP协议。在Internet中可以使用多种协议,如HTTP,FTP等等。在"HTTP"后面的“//”为分隔符
2.域名部分:“www.aspxfans.com”。一个URL中,也可以使用IP地址作为域名使用
3.端口部分:跟在域名后面的是端口,域名和端口之间使用“:”作为分隔符。端口不是一个URL必须的部分,如果省略端口部分,将采用默认端口80/tcp
4.虚拟目录部分:从域名后的第一个“/”开始到最后一个“/”为止,是虚拟目录部分。虚拟目录也不是一个URL必须的部分。本例中的虚拟目录是“/news/”
5.文件名部分:从域名后的最后一个“/”开始到“?”为止,是文件名部分,如果没有“?”,则是从域名后的最后一个“/”开始到“#”为止,是文件部分,如果没有“?”和“#”,那么从域名后的最后一个“/”开始到结束,都是文件名部分。本例中的文件名是“index.asp”。文件名部分也不是一个URL必须的部分,如果省略该部分,则使用默认的文件名
6.锚部分:从“#”开始到最后,都是锚部分。本例中的锚部分是“name”。锚部分也不是一个URL必须的部分(可以理解为定位)
7.参数部分:从“?”开始到“#”为止之间的部分为参数部分,又称搜索部分、查询部分。本例中的参数部分为“boardID=5&ID=24618&page=1”。参数可以允许有多个参数,参数与参数之间用“&”作为分隔符。
2.2.3 协议版本
版本(version):HTTP协议版本号,如HTTP/0.9、HTTP/1.0、HTTP/1.1、HTTP/2.0。
当前主流的协议版本还是HTTP/1.1版本,其最大的变化就是引入了长链接,也就是TCP链接默认是不关闭的可以被多个请求复用。客户端或者服务器如果长时间发现对方没有活动就会关闭链接,但是规范的做法是客户端在最后一个请求的时候要求服务器关闭链接。对于同一个域名,目前浏览器支持建立6个长链接。
版本 | 产生时间 | 内容 | 发展现状 |
---|---|---|---|
HTTP/0.9 | 1991年 | 不涉及数据包传输,规定客户端和服务器之间通信格式,只能GET请求 | 没有作为正式的标准 |
HTTP/1.0 | 1996年 | 传输内容格式不限制,增加PUT、PATCH、HEAD、 OPTIONS、DELETE命令 | 正式作为标准 |
HTTP/1.1 | 1997年 | 持久连接(长连接)、节约带宽、HOST域、管道机制、分块传输编码 | 2015年前使用最广泛 |
HTTP/2 | 2015年 | 多路复用、服务器推送、头信息压缩、二进制协议等 | 逐渐覆盖市场 |
HTTP/3 | 2018年 | 多路复用、0-RTT、TLS加密、流量控制、丢包重传、向前纠错机制 | 快速发展中 |
具体区别、工作原理,以及与SPDY的比较,见下一篇博文HTTP、HTTPS、SPDY、HTTP2.0、HTTP3.0 —— 通信协议学习笔记(二)
多路复用:通过单一的HTTP/2连接请求发起多重的请求-响应消息,多个请求stream共享一个TCP连接,实现多留并行而不是依赖建立多个TCP连接。
2.3 请求头部——常见报文头的属性
字段 | 说明 | 示例 |
---|---|---|
Accept | 可接受的行营内容类型 | Accept:text/plain (文本类型) |
Accept-Charset | 可接收的字符集 | Accept-Charset: utf-8 |
Accept-Encoding | 可接受的响应内容的编码方式 | Accept-Encoding: gzip, deflate |
Accept-Language | 可接受的响应内容语言列表 | Accept-Language: en-US |
Accept-Datetime | 可接受的按照时间来表示的响应内容版本 | Accept-Datetime: Sat, 26 Dec 2015 17:30:00 GMT |
Authorization | HTTP协议中需要认证资源的认证信息 | Authorization: Basic OSdjJGRpbjpvcGVuIANlc2SdDE== |
Cache-Control | 请求/回复中的,是否使用缓存机制 | Cache-Control: no-cache |
Connection | 客户端想要优先使用的连接类型 | Connection: keep-alive Connection: Upgrade |
Content-Length | 以8进制表示的请求体的长度 | Content-Length: 348 |
Content-Type | 请求体的MIME类型 | Content-Type: application/x-www-form-urlencoded |
Date | 发送该消息的日期和时间 | Date: Dec, 26 Dec 2015 17:30:00 GMT |
Expect | 表示客户端要求服务器做出特定的行为 | 表示客户端要求服务器做出特定的行为 |
From | 发起此请求的用户的邮件地址 | From: user@itbilu.com |
Host | 服务器域名和端口号,默认端口可省略 | Host: www.itbilu.com:80 or www.itbilu.com |
If-Match | 主要用于PUT,实体匹配才可以操作 | If-Match: “9jd00cdj34pss9ejqiw39d82f20d0ikd” |
If-Modified-Since | 资源未被修改的情况下返回304未修改 | If-Modified-Since: Dec, 26 Dec 2015 17:30:00 GMT |
User-Agent | 浏览器的身份标识字符串 | User-Agent: Mozilla/ |
Upgrade | 要求服务器升级到一个高版本协议 | Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11 |
Via | 告诉服务器,这个请求是由哪个代理发出的 | Via: 1.0 fred, 1.1 itbilu.com.com (Apache/1.1) |
Referer | 表示跳转到当前页面的之前的页面 | Referer: http://itbilu.com/nodejs |
Origin | 发起一个针对跨域资源共享的请求 | Origin: http://www.itbilu.com |
2.4 空白行
空行是作为请求行、消息报头 与 请求正文 之间的分隔符。也有一些博客将其归到请求报头的结尾中。
2.5 请求正文
HTTP请求第三行为请求正文,请求正文是可选的,它最常出现在POST请求方式中。
具体HTTP协议请求举例解析如下:
①是请求方法 POST
②为请求对应的URL地址,它和报文头的Host属性组成完整的请求URL
③是协议名称及版本号。
④是HTTP的报文头,报文头包含若干个属性,格式为“属性名:属性值”,服务端据此获取客户端的信息。
⑤是报文体,它将一个页面表单中的组件值通过param1=value1¶m2=value2的键值对形式编码成一个格式化串,它承载多个请求参数的数据。不但报文体可以传递请求参数,请求URL也可以通过类似于“/chapter15/user.html? param1=value1¶m2=value2”的方式传递请求参数。
注意:
1、HTTP是无状态的面向连接的协议,无状态不代表HTTP不能保持TCP连接,HTTP使用的不是UDP协议(无连接)
2、从HTTP/1.1起,默认都开启了Keep-Alive,保持连接特性,简单地说,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接
3、Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间
3 HTTP响应(响应协议)
3.1 响应格式
HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。
第一部分:状态行,由HTTP/1.1(协议版本) 200(状态码) OK(状态码的描述) 构成
第二部分:响应头,由一些键值对构成,用来说明客户端要使用的一些附加信息
第三部分:空行,响应头后面的空行时必须的
第四部分:响应正文,服务器返回给客户端的文本信息
服务端响应实例:
HTTP/1.1 200 OK // 状态行,(HTTP/1.1)表明HTTP版本为1.1版本,状态码为200,状态消息为(ok)
Date: Mon, 27 Jul 2009 12:28:53 GMT // 消息报头, Date:生成响应的日期和时间为2009.7.27 12:28:53 GMT
Server: Apache // Server服务器名字为 Apache
Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT // 文档的最后改动时间为2009 7.22 19:15:56 GMT
ETag: "34aa387-d-1568eb00" // Entity tag,被请求变量的实体值是“34aa...”
Accept-Ranges: bytes // 返回值为 bytes,这代表了该服务器可以接受范围请求,这样我们就可以做断点下载的功能了。如果该值为 none,则代表不允许范围请求。
Content-Length: 51 // 内容长度为51
Vary: Accept-Encoding // Accept-Encoding表示客户端支持的编码格式,Vary决定了对于未来的一个请求头,应该用一个缓存的回复(response)还是向源服务器请求一个新的回复。
Content-Type: text/plain // 表示后面的文档属于什么MIME类型。Servlet默认为text/plain,但通常需要显式地指定为text/html。
输出结果:
Hello World! My payload includes a trailing CRLF.
3.2 状态行
第一部分:状态行,由HTTP协议版本号, 状态码, 状态消息 三部分组成。
- 版本:HTTP协议版本号。
- 状态号(status code):一个状态码,来告知对应请求执行成功或失败,以及失败的原因。
- 状态信息:非权威的状态码描述信息,可以由服务端自行设定。
3.2.1 HTTP协议版本
与请求一致,具体见本文2.2.3 HTTP协议版本
3.2.2 状态码
常用状态码:
还有其他,诸如302:重定向,临时移动。具体见:HTTP状态码
3.2.3 状态消息
非权威的状态码描述信息,可以由服务端自行设定。具体见上一节的图片。
其中状态码为“200”的状态信息为“OK”,状态码为“404”的状态信息为“Not Foundt”,
3.3 响应头部
第二部分:消息报头,由一些键值对构成,用来说明客户端要使用的一些附加信息
更多常用响应头极其示例、状态详见:常用的HTTP响应头
应答头 | 说明 |
---|---|
Allow | 服务器支持哪些请求方法(如GET、POST等) |
Content-Encoding | 文档的编码(Encode)方法,只有在解码之后才可以得到Content-Type头指定的内容类型。利用gzip压缩文档能够显著地减少HTML文档的下载时间。 |
Content-Length | 内容长度 |
Content-Type | 表示后面的文档属于什么MIME类型。Servlet默认为text/plain,但通常需要显式地指定为text/html。 |
Date | 当前的GMT时间 |
Expires | 指定一个日期/时间,超过该时间则认为此回应已经过期 |
Last-Modified | 所请求的对象的最后修改日期(按照 RFC 7231 中定义的“超文本传输协议日期”格式来表示) |
Location | 表示客户应当到哪里去提取文档。Location通常不是直接设置的,而是通过HttpServletResponse的sendRedirect方法,该方法同时设置状态代码为302。 |
Refresh | 用于重定向,或者当一个新的资源被创建时。默认会在5秒后刷新重定向。 |
Server | 服务器的名称 |
Set-Cookie | 设置和页面关联的Cookie |
WWW-Authenticate | 表示在请求获取这个实体时应当使用的认证模式 授权信息 |
另外,HTTP content-type,(内容类型),一般是指网页中存在的 Content-Type,用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件,这就是经常看到一些 PHP 网页点击的结果却是下载一个文件或一张图片的原因。
Content-Type 标头告诉客户端实际返回的内容的内容类型。
3.4 空行
第三部分:空行,响应头后面的空行时必须的。
空行是作为响应行、响应报头 与 响应正文 之间的分隔符。
3.5 响应正文
第四部分:响应正文,服务器返回给客户端的文本信息。
空行后面的html部分为响应正文。
<html>
<head></head>
<body>
<!--body goes here-->
</body>
</html>
4 总体图解
拦截HTTP请求的分析点:
其他参考:
HTTP协议详解
HTTP详解-菜鸟
HTTP协议超级详解
关于HTTP协议,一篇就够了
HTTP协议分析(还有Cookie)