HTTP(超文本传输协议)简介
超文本传输协议主要用于访问WWW上的数据。协议以普通文本、超文本、音频、视频等格式传输数据。称为超文本协议,原因是在应用环境中,它可以快速的在文档之间跳转。HTTP在公认端口80上使用TCP服务。
HTTP协议从诞生到现在已经有若干个版本,其中最关键的版本为:HTTP/1.0、HTTP/1.1,其中 HTTP/1.1版本 是当前使用的主流版本。
HTTP协议在运输层的使用 TCP协议提供的服务。
HTTP报文
HTTP 请求报文由四部分组成,分别是请求行、请求头、空行和请求体,其中空行、冒号也是组成部分之一,作用是进行分隔,必不可少。
HTTP报文有两种一般的类型:请求和响应。这两种报文类型的格式差不多。
格式如下:
请求报文格式如下:
响应报文格式如下:
请求报文
请求报文由4个部分组成,分别是:1、1请求行、请求头部、空行和报文主体;其中请求行、请求头部和空行是必需的而报文主体是可选的。
请求报文格式如下:
请求行
请求行包含3个部分:请求方法、URL和协议版本;它们之间用空格分开。
请求行最后以一个回车符和一个换行符结尾。回车符是"\r",换行符是"\n"。
请求方法字段
1、OPTIONS
返回服务器针对特定资源所支持的HTTP请求方法,也可以利用向web服务器发送‘*’的请求来测试服务器的功能性。
2、HEAD
向服务器索与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以再不必传输整个响应内容的情况下,就可以获取包含在响应小消息头中的元信息。
3、GET
向特定的资源发出请求。注意:GET方法不应当被用于产生“副作用”的操作中,例如在Web Application中,其中一个原因是GET可能会被网络蜘蛛等随意访问。
4、POST
向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
5、PUT
向指定资源位置上传其最新内容。
6、DELETE
请求服务器删除Request-URL所标识的资源。
7、TRACE
回显服务器收到的请求,主要用于测试或诊断。
8、CONNECT
HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
注意:
1)方法名称是区分大小写的 ,当前HTTP协议中的方法都是大写
2)HTTP服务器至少应该实现GET和HEAD/POST方法,其他方法都是可选的。
HTTP的方法表
方法 |
描述 |
GET |
从指定的资源请求数据。 |
POST |
向指定的资源提交要被处理的数据。 |
HEAD |
与 GET 相同,但只返回 HTTP 报头,不返回文档主体。 |
PUT |
上传指定的 URI 表示。 |
DELETE |
删除指定资源。 |
OPTIONS |
返回服务器支持的 HTTP 方法。 |
CONNECT |
把请求连接转换到透明的 TCP/IP 通道。 |
GET与POST区别
1. GET是从服务器上获取数据,
POST 是向服务器传送数据。
2. GET请求把参数包含在URL中,将请求信息放在URL后面,POST请求通过request body传递参数,将请求信息放置在报文体中。
3. GET安全性非常低, GET设计成传输数据,一般都在地址栏里面可以看到,POST安全性较高, 在地址栏看不到。(如果没有加密,他们安全级别都是一样的,随便一个监听器都可以把所有的数据监到。)
4. GET请求在URL中传送的参数是有长度限制的,而POST没有(在浏览器中非HTTP规定的)。
get有长度限制为1024B吗?网上大多是这么说的,很长一段时间我也以为是HTTP规定的。
实际上HTP get方法提交的数据大小长度并没有限制,Http协议规范没有对URL长度进行限制。目前说的get长度有限制,是特定的浏览器及服务器对它的限制。
POST是没有大小限制的(浏览器没有)。HTTP协议规范也没有进行大小限制,起限制作用的是服务器处理程序的处理能力。
5. GET请求能够被缓存,GET请求会保存在浏览器的浏览记录中,以GET请求的URL能够保存为浏览器书签,post请求不具有这些功能。
6. HTTP的底层是TCP/IP,GET/POST都是TCP链接。GET和POST能做的事情是一样的。
7.GET产生一个TCP数据包,对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
POST产生两个TCP数据包,对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据),并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。
HTTP状态码:
1xx:指示信息–表示请求已接收,继续处理。
2xx:成功–表示请求已被成功接收、理解、接受。
3xx:重定向–要完成请求必须进行更进一步的操作。
4xx:客户端错误–请求有语法错误或请求无法实现。
5xx:服务器端错误–服务器未能实现合法的请求。
HTTP常用的状态码 |
|
消息: |
描述: |
200 OK |
请求成功(其后是对GET和POST请求的应答文档。) |
300 Multiple Choices |
多重选择。链接列表。用户可以选择某链接到达目的地。最多允许五个地址。 |
301 Moved Permanently |
所请求的页面已经转移至新的url。 |
400 Bad Request |
服务器未能理解请求。 |
401 Unauthorized |
被请求的页面需要用户名和密码。 |
403 Forbidden |
对被请求页面的访问被禁止。 |
404 Not Found |
服务器无法找到被请求的页面。 |
500 Internal Server Error |
请求未完成。服务器遇到不可预知的情况。 |
万维网的大致工作工程
HTTP长连接
在HTTP/1.0时期,每次HTTP请求都会创建一个新的TCP连接,请求完成后之后这个TCP连接就会被关闭。这种通信模式的效率不高,所以在HTTP/1.1中,引入了HTTP长连接的概念,使用长连接的HTTP协议,会在响应头加入Connection:keep-alive。这样当浏览器完成一次请求后,浏览器和服务器之间的TCP连接不会关闭,再次访问这个服务器上的网页时,浏览器会继续使用这一条已经建立的连接,也就是说两个请求可能共用一个TCP连接。省去了下一次的TCP三次握手。
HTTP/1.1中的长连接依然没有解决 head of line blocking 的问题,后面的连接必须等待前面的返回了才能够发送,这个问题直到HTTP/2.0采取二进制分帧编码方式才彻底解决。
Cookie和Session
UDP协议具有不可靠性和不安全性,这很难满足web应用的需要。而TCP协议是基于连接和三次握手的,虽然具有可靠性,但也比较消耗资源。
场景:如果几十万个客户端和服务器一直保持连接状态,那服务器需要多高的要求才能满足承载!
于是就产生了HTTP协议。基于TCP的可靠性连接。在请求之后,服务器端立即关闭连接、释放资源。这样既保证了资源可用,又满足了安全性和可靠性。
正因为HTTP在请求之后,服务器端立即关闭连接、释放资源,所以大家通常说http协议是“无状态”的,也就是“服务器不知道你客户端干了什么”,其实很大程度上是基于性能考虑的。于是后面就有了cookie和session这些技术。
HTTP协议是无状态的,请求与请求之间是没有关系的。因此HTTP协议需要一种技术让请求与请求之间建立起联系,并且服务器需要知道这个请求来自哪个用户,于是Cookie技术就出现了。
Cookie
Cookie是HTTP报文的一个请求头,Web应用可以将用户的标识信息或者其他一些信息(用户名等)存储在Cookie中。用户经过验证之后,每次HTTP请求报文中都包含Cookie,这样服务器读取这个Cookie请求头就知道用户是谁了。
Cookie储存在客户端,里面包含了每次请求中都需要传递的信息。
由于Cookie存储在本地,这样就非常的不安全。浏览器在Cookie中填充了一个Session ID之类的字段用来标识请求。
Session
Session储存在服务器端,里面保存了用户的状态,用户信息以Session的形式存储在服务端。当用户请求到来时,服务端可以把用户的请求和用户的Session对应起来。
工作过程:
服务器在创建Session的同时,会为该Session生成唯一的Session ID,当浏览器再次发送请求的时候,会将这个Session ID带上,服务器接受到请求之后就会依据Session ID找到相应Session,找到Session后,就可以在Session中获取或者添加内容了。而这些内容只会保存在服务器中,发到客户端的只有Session ID,这样相对安全,也节省了网络流量,因为不需要在Cookie中存储大量用户信息。
sessionId的生成过程和过期时间
sessionId是一个会话的key,浏览器第一次访问服务器会在服务器端生成一个session,并且有一个sessionId。
tomcat生成的sessionId叫做jsessionid; jetty为sessionId。
在Java中,是Web应用程序在调用HttpServletRequest的getSession方法时,由Web容器(比如Tomcat、Jetty、Netty)创建的。
Tomcat的Session管理器提供了多种持久化方案来存储Session,通常会采用高性能的存储方式,比如Redis,并且通过集群部署的方式,防止单点故障,从而提升高可用。同时,Session有过期时间,因此Tomcat会开启后台线程定期的轮询,如果Session过期了就将Session失效。
URL字段
URL字段用来指明目标资源的位置,它只包含一个完整URL中的文件路径和查询字符串这两部分,比如"/index.html?id=666",而不包含协议、主机名和端口号。如果同一服务器上部署了多个网站,那么为了准确判断出请求的是哪个资源需要将URL字段和Host请求头的值(指定要访问的网站名)相结合使用。
协议版本字段
说明该请求报文属于哪一版的http协议,比如HTTP/1.1或HTTP/1.0。
请求头部

请求头部用来告知服务器该请求和客户端本身的一些额外信息,有多个请求头部,每个请求头都是一个键值对,键和值之间用英文冒号隔开。每个请求头单独形成一行,它们的末尾都是一个回车符加一个换行符。
请求报文中常见的请求头部:
来自:https://www.cnblogs.com/yanggb/p/11684494.html
Request Headers的候选属性
候选属性 | 说明 | 示例 |
---|---|---|
Accept | 指定客户端能够接收的内容类型 | Accept: text/plain, text/html |
Accept-Charset | 浏览器可以接受的字符编码集 | Accept-Charset: iso-8859-5 |
Accept-Encoding | 指定浏览器可以支持的web服务器返回内容压缩编码类型 | Accept-Encoding: compress, gzip |
Accept-Language | 浏览器可接受的语言 | Accept-Language: en,zh |
Accept-Ranges | 可以请求网页实体的一个或者多个子范围字段 | Accept-Ranges: bytes |
Authorization | HTTP授权的授权证书 | Authorization: Basic QWxhZLRpbjpvcGVuIHNoc2FtZQ== |
Cache-Control | 指定请求和响应遵循的缓存机制 | Cache-Control: no-cache |
Connection | 表示是否需要持久连接。(HTTP 1.1默认进行持久连接) | Connection: close |
Cookie | HTTP请求发送时,会把保存在该请求域名下的所有cookie值一起发送给web服务器 | Cookie: $Version=1; Skin=new; |
Content-Length | 请求的内容长度 | Content-Length: 348 |
Content-Type | 请求的与实体对应的MIME信息 | Content-Type: application/x-www-form-urlencoded |
Date | 请求发送的日期和时间 | Date: Tue, 15 Nov 2018 08:22:31 GMT |
Expect | 请求的特定的服务器行为 | Expect: 100-continue |
From | 发出请求的用户的Email | From: user@email.com |
If-Match | 只有请求内容与实体相匹配才有效 | If-Match: "737060ff8c284d8af7ad2082f209582d" |
If-Modified-Since | 如果请求的部分在指定时间之后被修改则请求成功,未被修改则返回304代码 | If-Modified-Since: Sat, 29 Oct 2018 19:43:31 GMT |
If-None-Match | 如果内容未改变返回304代码,参数为服务器先前发送的Etag,与服务器回应的Etag比较判断是否改变 | If-None-Match: "737060cd8c284d8af7ad3082f209582d" |
If-Range | 如果实体未改变,服务器发送客户端丢失的部分,否则发送整个实体。参数也为Etag | If-Range: "737060cd8c284d8af7ad3082f209582d" |
If-Unmodified-Since | 只在实体在指定时间之后未被修改才请求成功 | If-Unmodified-Since: Sat, 29 Oct 2018 19:23:11 GMT |
Max-Forwards | 限制信息通过代理和网关传送的时间 | Max-Forwards: 10 |
Pragma | 用来包含实现特定的指令 | Pragma: no-cache |
Proxy-Authorization | 连接到代理的授权证书 | Proxy-Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== |
Range | 只请求实体的一部分,指定范围 | Range: bytes=500-999 |
Referer | 先前网页的地址,当前请求网页紧随其后,即来路 | Referer: http://www.yanggb.com/yanggb1.html |
TE | 客户端愿意接受的传输编码,并通知服务器接受接受尾加头信息 | TE: trailers,deflate;q=0.5 |
Upgrade | 向服务器指定某种传输协议以便服务器进行转换(如果支持) | Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11 |
User-Agent | User-Agent的内容包含发出请求的用户信息 | User-Agent: Mozilla/5.0 (Linux; X11) |
Via | 通知中间网关或代理服务器地址,通信协议 | Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1) |
Warning | 关于消息实体的警告信息 | Warn: 199 Miscellaneous warning |
对于host字段
host字段可以是域名,也可以是ip地址。host字段域名/ip后可以跟端口号,如Host: www.leixing123.com:80
host可以由程序自定义,某些程序为了防止运营商或防火墙拦截会定义虚假host
http头中可以没有host字段吗?
在http 1.1中不能缺失host字段,如果缺失, 服务器返回400 bad request;http1.1中不能缺失host字段,但host字段可以是空值。
在http 1.0中可以缺失host字段。
======
空行
在请求头部的后面是一个空行,它只包含一个回车符和一个换行符,不包含其它任何内容,这个空行用于标记请求头部已结束,下一行的内容不再是请求头;它是必须存在的,即便使用GET这样不包含报文主体的请求方法时也要有这个空行。
报文主体
请求报文中的报文主体就是要提交给服务器的数据,比如当我们使用POST方法提交表单时,表单中的内容就包含在请求报文的报文主体中。在某些情况下请求报文中是没有报文主体的,比如使用GET方法,此时若要向服务器传递参数,那么参数就只能包含在URL的查询字符串中。
报文主体中的数据格式由Content-Type请求头指定。
Content-Type中常见的媒体格式类型
以text开头的媒体格式类型:
text/html: HTML格式。
text/plain:纯文本格式。
text/xml: XML格式。
以image开头的媒体格式类型:
image/gif:gif图片格式。
image/jpeg:jpg图片格式。
image/png:png图片格式。
以application开头的媒体格式类型:
application/xhtml+xml:XHTML格式。
application/xml: XML数据格式。
application/atom+xml:Atom XML聚合格式 。
application/json: JSON数据格式。
application/pdf:pdf格式 。
application/msword: Word文档格式。
application/octet-stream: 二进制流数据(如常见的文件下载)。
application/x-www-form-urlencoded: <form encType=””>中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)。
还有一种常见的媒体格式是用于上传文件时用的
multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式。
响应报文
响应报文由4个部分组成,分别是:状态行、响应头部、空行和报文主体;状态行、响应头部和空行是必需的而报文主体是可选的。
响应报文格式如下:
状态行
状态行包含3个部分:HTTP协议版本、状态码和状态码描述(状态短语);它们之间用空格隔开,状态行的最后是一个回车符和换行符。
HTTP协议版本
说明该响应报文属于哪一版的http协议,比如HTTP/1.1或HTTP/1.0。
转态码描述(转态短语)
状态码是服务器返回的表示响应状态的代码,状态短语是对该响应状态的一个简单描述。
状态码详情可看:http://www.leixing.xyz/article/detail/HavBr2mg
常见状态码对应的状态短语说明:
200 OK: 表示客户端请求成功
400 Bad Request: 表示客户端请求有语法错误,不能被服务器端解析
401 Unauthonzed: 表示请求未经授权,该状态码必须与WWW-Authenticate报文头一起使用
404 Not Found:请求的资源不存在,例如输入了错误的url
500 Internal Server Error: 表示服务器发生了不可预期的错误,导致无法完成客户端的请求
503 Service Unavailable:表示服务器当前不能处理客户端的请求,在一段时间后服务器可能恢复正常
响应头部
响应头部和请求头部类似,都是用于传递一些附加的信息;每个响应头都是一个键值对,键和值之间用英文冒号隔开。每个响应头的后面都是一个回车符和一个换行符,多个响应头,每个响应头单独形成一行。
某些头部字段既可以用于请求报文又可以用于响应报文,而有些则只能用于请求报文或者只能用于响应报文。
响应报文中常见的响应头部:
来自:https://www.cnblogs.com/yanggb/p/11684494.html
Response Headers的候选属性
候选属性 | 说明 | 示例 |
---|---|---|
Accept-Ranges | 表明服务器是否支持指定范围请求及哪种类型的分段请求 | Accept-Ranges: bytes |
Age | 从原始服务器到代理缓存形成的估算时间(以秒计,非负) | Age: 12 |
Allow | 对某网络资源的有效的请求行为,不允许则返回405 | Allow: GET, HEAD |
Cache-Control | 告诉所有的缓存机制是否可以缓存及哪种类型 | Cache-Control: no-cache |
Content-Encoding | web服务器支持的返回内容压缩编码类型 | Content-Encoding: gzip |
Content-Language | 响应体的语言 | Content-Language: en,zh |
Content-Length | 响应体的长度 | Content-Length: 348 |
Content-Location | 请求资源可替代的备用的另一地址 | Content-Location: /index.htm |
Content-MD5 | 返回资源的MD5校验值 | Content-MD5: Q2hlY2sgSW50ZWdyaXR5IQ== |
Content-Range | 在整个返回体中本部分的字节位置 | Content-Range: bytes 21010-47021/47022 |
Content-Type | 返回内容的MIME类型 | Content-Type: text/html; charset=utf-8 |
Date | 原始服务器消息发出的时间 | Date: Tue, 15 Nov 2018 08:22:22 GMT |
ETag | 请求变量的实体标签的当前值 | ETag: "737060cd8c284d8af7ad3082f209582d" |
Expires | 响应过期的日期和时间 | Expires: Thu, 01 Dec 2018 16:00:00 GMT |
Last-Modified | 请求资源的最后修改时间 | Last-Modified: Tue, 15 Nov 2018 12:25:26 GMT |
Location | 用来重定向接收方到非请求URL的位置来完成请求或标识新的资源 | Location: http://www.yanggb.com/yanggb2.html |
Pragma | 包括实现特定的指令,它可应用到响应链上的任何接收方 | Pragma: no-cache |
Proxy-Authenticate | 它指出认证方案和可应用到代理的该URL上的参数 | Proxy-Authenticate: Basic |
refresh | 应用于重定向或一个新的资源被创造,在5秒之后重定向(由网景提出,被大部分浏览器支持) | Refresh: 5; url= http://www.yanggb.com/yanggb9.html |
Retry-After | 如果实体暂时不可取,通知客户端在指定时间之后再次尝试 | Retry-After: 120 |
Server | web服务器软件名称 | Server: Apache/1.3.27 (Unix) (Red-Hat/Linux) |
Set-Cookie | 设置Http Cookie | Set-Cookie: UserID=JohnDoe; Max-Age=3600; Version=1 |
Trailer | 指出头域在分块传输编码的尾部存在 | Trailer: Max-Forwards |
Transfer-Encoding | 文件传输编码 | Transfer-Encoding:chunked |
Vary | 告诉下游代理是使用缓存响应还是从原始服务器请求 | Vary: * |
Via | 告知代理客户端响应是通过哪里发送的 | Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1) |
Warning | 警告实体可能存在的问题 | Warning: 199 Miscellaneous warning |
WWW-Authenticate | 表明客户端请求实体应该使用的授权方案 | WWW-Authenticate: Basic |
======
空行
在请求头部的后面是一个空行,它只包含一个回车符和一个换行符,不包含其它任何内容,这个空行用于标记请求头部已结束,下一行的内容不再是请求头;它是必须存在的,即便使用GET这样不包含报文主体的请求方法时也要有这个空行。
报文主体
响应报文中的报文主体就是服务器返回给客户端的数据,它的类型由响应头"Content-Type"说明。在某些响应报文中是没有报文主体(即响应数据)的,比如状态码为304(Not Modified)的响应报文或者某些请求错误时的响应报文。
HTTP持续与非持续连接
HTTP1.0定义了非持续连接,每次请求/响应都要建立TCP连接。而HTTP1.1默认的连接是持续连接,服务器在发送响应以后会保持连接状态,等待更多的请求。HTTP代理服务器
代理服务器是一台保存最近请求的响应的拷贝的计算机。在代理服务器存在的情况下,当HTTP客户端访问网页时,HTTP客户端会向代理发出请求,代理检查高速缓存,如果缓存中不存在响应报文,代理会向相应的服务器发送请求,这样降低了原服务器的负载,减少了通信量并降低了延迟。但是,使用代理服务器,客户端必须配置为访问代理服务器而不是目标服务器。统一资源定位符URL
URL是对可以从Internet上得到的资源的位置和访问方法的一种简洁表示,也是指明Internet上任何种类信息的标准。它定义四种要素:方法、主机、端口和路径(方法://主机:端口/路径)。
方法:用来读取文档的协议。
主机:存放信息的计算机。万维网页面通常存储在以“www”为起始别名的计算机中。
端口:服务器应用程序的端口号。
路径:信息所存放的路径名。
万维网工作过程
HTTP请求交互
应用层HTTP协议在网络传输层调用TCP进行的服务,先建立TCP连接(三次握手),然后HTTP请求、HTTP响应,最后断开TCP连接(四次挥手)。
细化