HTTP协议
超文本传输协议。基于TCP/IP协议传输数据。
特点:
- 无状态
- 无连接
- 基于请求和响应
- 通讯使用明文、不进行身份确认
请求报文格式
(图片来源: blog.csdn.net/xiaoming100…
请求方式
方法 | 描述 |
---|---|
GET | 请求指定的页面信息,并返回实体主体。 |
HEAD | 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头 |
POST | 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。 |
PUT | 从客户端向服务器传送的数据取代指定的文档的内容。 |
DELETE | 请求服务器删除指定的页面。 |
CONNECT | HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。 |
OPTIONS | 允许客户端查看服务器的性能。 |
TRACE | 回显服务器收到的请求,主要用于测试或诊断。 |
GET & POST
Get | Post | ||
---|---|---|---|
后退按钮/刷新 | 无害 | 数据会被重新提交(浏览器应该告知用户数据会被重新提交) | |
收藏书签 | 可以 | 不可以 | |
浏览器主动缓存 | 浏览器主动缓存 | 不会主动缓存,除非手动设置 | |
编码类型 | application/x-www-form-urlencoded | application/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码。 | |
历史 | 参数保留在浏览器历史中 | 参数不会保留在浏览器历史中 | |
数据长度限制 | url长度受限制(url最大长度是2048个字符) | 无限制 | 这个长度通常是浏览器限制,(大多数)浏览器通常都会限制url长度在2K个字节,而(大多数)服务器最多处理64K大小的url |
数据类型限制 | 只允许ASCII字符 | 没有限制,也允许二进制数据 | |
安全性 | 发送的数据是url的一部分,与post相比安全性较差 | 参数不会保留在浏览器历史中或web服务器日志中 | |
可见性 | 数据在url中对所有人都是可见的 | 数据不会显示在url中 | |
数据传输方式 | url传递 | Request Body中 | get服务也可以在Request Body中放数据,但是不同浏览器的处理方式不同,可能造成数据收不到 |
误区:GET产生一个TCP数据包;POST产生两个TCP数据包。
对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据); 而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。 1、据研究,在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点。 2、并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。
状态码
状态码 | 描述 | |
---|---|---|
1xx | 100 Continue | 服务器仅接收到部分请求,但是一旦服务器并没有拒绝该请求,客户端应该继续发送其余的请求。 |
101 Switching Protocols | 服务器转换协议:服务器将遵从客户的请求转换到另外一种协议。 | |
2xx 请求已被服务器接收、理解 | 200 OK | 请求成功(其后是对GET和POST请求的应答文档) |
201 Created | 请求被创建完成,同时新的资源被创建。 | |
202 Accepted | 供处理的请求已被接受,但是处理未完成。 | |
203 Non-authoritative Information | 文档已经正常地返回,但一些应答头可能不正确,因为使用的是文档的拷贝。 | |
204 No Content | 没有新文档。浏览器应该继续显示原来的文档。如果用户定期地刷新页面,而Servlet可以确定用户文档足够新,这个状态代码是很有用的。 | |
205 Reset Content | 没有新文档。但浏览器应该重置它所显示的内容。用来强制浏览器清除表单输入内容。 | |
206 Partial Content | 客户发送了一个带有Range头的GET请求,服务器完成了它。 | |
3xx 重定向 | 300 Multiple Choices | 多重选择。链接列表。用户可以选择某链接到达目的地。最多允许五个地址。 |
301 Moved Permanently | 所请求的页面已经转移至新的url。 | |
302 Found | 所请求的页面已经临时转移至新的url。 | |
303 See Other | 所请求的页面可在别的url下被找到。 | |
304 Not Modified | 未按预期修改文档。客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用。 | |
305 Use Proxy | 客户请求的文档应该通过Location头所指明的代理服务器提取。 | |
306 Unused | 此代码被用于前一版本。目前已不再使用,但是代码依然被保留。 | |
307 Temporary Redirect | 被请求的页面已经临时移至新的url。 | |
4xx 客户端请求错误 | 400 Bad Request | 服务器未能理解请求。 |
401 Unauthorized | 被请求的页面需要用户名和密码。 | |
401.1 | 登录失败。 | |
401.2 | 服务器配置导致登录失败。 | |
401.3 | 由于 ACL 对资源的限制而未获得授权。 | |
401.4 | 筛选器授权失败。 | |
401.5 | ISAPI/CGI 应用程序授权失败。 | |
401.7 | 访问被 Web 服务器上的 URL 授权策略拒绝。这个错误代码为 IIS 6.0 所专用。 | |
402 Payment Required | 此代码尚无法使用。 | |
403 Forbidden | 对被请求页面的访问被禁止。 | |
403.1 | 执行访问被禁止。 | |
403.2 | 读访问被禁止。 | |
403.3 | 写访问被禁止。 | |
403.4 | 要求 SSL。 | |
403.5 | 要求 SSL 128。 | |
403.6 | IP 地址被拒绝。 | |
403.7 | 要求客户端证书。 | |
403.8 | 站点访问被拒绝。 | |
403.9 | 用户数过多。 | |
403.10 | 配置无效。 | |
403.11 | 密码更改。 | |
403.12 | 拒绝访问映射表。 | |
403.13 | 客户端证书被吊销。 | |
403.14 | 拒绝目录列表。 | |
403.15 | 超出客户端访问许可。 | |
403.16 | 客户端证书不受信任或无效。 | |
403.17 | 客户端证书已过期或尚未生效。 | |
403.18 | 在当前的应用程序池中不能执行所请求的 URL。这个错误代码为 IIS 6.0 所专用。 | |
403.19 | 不能为这个应用程序池中的客户端执行 CGI。这个错误代码为 IIS 6.0 所专用。 | |
403.20 | Passport 登录失败。这个错误代码为 IIS 6.0 所专用。 | |
404 Not Found | 服务器无法找到被请求的页面。 | |
404.0 | (无)–没有找到文件或目录。 | |
404.1 | 无法在所请求的端口上访问 Web 站点。 | |
404.2 | Web 服务扩展锁定策略阻止本请求。 | |
404.3 | MIME 映射策略阻止本请求。 | |
405 Method Not Allowed | 请求中指定的方法不被允许。 | |
406 Not Acceptable | 服务器生成的响应无法被客户端所接受。 | |
407 Proxy Authentication Required | 用户必须首先使用代理服务器进行验证,这样请求才会被处理。 | |
408 Request Timeout | 请求超出了服务器的等待时间。 | |
409 Conflict | 由于冲突,请求无法被完成。 | |
410 Gone | 被请求的页面不可用。 | |
411 Length Required | “Content-Length” 未被定义。如果无此内容,服务器不会接受请求。 | |
412 Precondition Failed | 请求中的前提条件被服务器评估为失败。 | |
413 Request Entity Too Large | 由于所请求的实体的太大,服务器不会接受请求。 | |
414 Request-url Too Long | 由于url太长,服务器不会接受请求。当post请求被转换为带有很长的查询信息的get请求时,就会发生这种情况。 | |
415 Unsupported Media Type | 由于媒介类型不被支持,服务器不会接受请求。 | |
416 Requested Range Not Satisfiable | 服务器不能满足客户在请求中指定的Range头。 | |
417 Expectation Failed | 执行失败。 | |
423 | 锁定的错误 | |
5xx 服务器错误 | 500 Internal Server Error | 请求未完成。服务器遇到不可预知的情况。 |
500.12 | 应用程序正忙于在 Web 服务器上重新启动。 | |
500.13 | Web 服务器太忙。 | |
500.15 | 不允许直接请求 Global.asa。 | |
500.16 | UNC 授权凭据不正确。这个错误代码为 IIS 6.0 所专用。 | |
500.18 | URL 授权存储不能打开。这个错误代码为 IIS 6.0 所专用。 | |
500.100 | 内部 ASP 错误。 | |
501 Not Implemented | 请求未完成。服务器不支持所请求的功能。 | |
502 Bad Gateway | 请求未完成。服务器从上游服务器收到一个无效的响应。 | |
502.1 | CGI 应用程序超时。 · | |
502.2 | CGI 应用程序出错。 | |
503 Service Unavailable | 请求未完成。服务器临时过载或当机。 | |
504 Gateway Timeout | 网关超时。 | |
505 HTTP Version Not Supported | 服务器不支持请求中指明的HTTP协议版本。 |
https
身披SSL外壳的HTTP。经由HTTP进行通信,利用SSL/TLS简历安全信道,加密数据包。
特点:
- 内容加密:采用混合加密技术,中间者无法直接查看明文内容;
- 验证身份:通过证书认证客户端访问的是自己的服务器; 保护数据完整性:防止输入的内容被中间人冒充或者篡改。
无状态的解决
- Cookie/Session
- Cookie通过在客户端记录用户信息确定用户身份
- 客户端请求服务器,如果服务器需要记录用户状态,使用response向客户端浏览器颁发一个cookie,客户端浏览器会把cookie保存起来,当下次再访问时,浏览器把请求的网址和Cookie一同提交给服务器。
- Java中把Cookie封装成了javax.servlet.http.Cookie类
- Cookie不可跨域
- Session通过在服务器端记录信息确定用户身份
- Session对应的类为javax.servlet.http.HttpSession类
- 服务器一般将session存在内存中,每访问一次都会更新最后活跃时间,过期删除
- 服务器向客户端浏览器发送一 个名为JSESSIONID的Cookie,它的值为该Session的id(也就是HttpSession.getId()的返回值)。Session 依据该Cookie来识别是否为同一用户。
- URL地址重写是对客户端不支持Cookie的解决方案。URL地址重写的原理是将该用户Session的id信息重写 到URL地址中。服务器能够解析重写后的URL获取Session的id。这样即使客户端不支持Cookie,也可以使用Session来记录用户状态。
- Cookie通过在客户端记录用户信息确定用户身份
- HTTP/1.1 长链接(keep-alive)
http1.0 & http1.1 & http 2.0
- http1.0 & http1.1
- 缓存处理,在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。
- 带宽优化及网络连接的使用,HTTP1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。
- 错误通知的管理,在HTTP1.1中新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。
- Host头处理,在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。
- 长连接,HTTP 1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,在HTTP1.1中默认开启Connection: keep-alive,一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点
- HTTP2.0和HTTP1.X相比的新特性
- 新的二进制格式(Binary Format),HTTP1.x的解析是基于文本。基于文本协议的格式解析存在天然缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多,二进制则不同,只认0和1的组合。基于这种考虑HTTP2.0的协议解析决定采用二进制格式,实现方便且健壮。
- 多路复用(MultiPlexing),即连接共享,即每一个request都是是用作连接共享机制的。一个request对应一个id,这样一个连接上可以有多个request,每个连接的request可以随机的混杂在一起,接收方可以根据request的 id将request再归属到各自不同的服务端请求里面。
- header压缩,如上文中所言,对前面提到过HTTP1.x的header带有大量信息,而且每次都要重复发送,HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表,既避免了重复header的传输,又减小了需要传输的大小。
- 服务端推送(server push),同SPDY一样,HTTP2.0也具有server push功能。