GVKun编程网logo

Java架构师第五步——HTTP协议详解,HTTP安全(二)(读书笔记)(http协议 java)

13

对于Java架构师第五步——HTTP协议详解,HTTP安全感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解二,并且为您提供关于Day86/100《图解HTTP》读书笔记(四)——HTTP报文

对于Java架构师第五步——HTTP协议详解,HTTP安全感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解,并且为您提供关于Day 86/100 《图解HTTP》读书笔记(四)——HTTP报文头信息、Day 87/100 《图解HTTP》读书笔记(五)——HTTP 常见状态码、HTTP 协议详解,非常经典的 HTTP 网络请求讲解、HTTP&HTTPS协议详解之HTTP篇的宝贵知识。

本文目录一览:

Java架构师第五步——HTTP协议详解,HTTP安全(二)(读书笔记)(http协议 java)

Java架构师第五步——HTTP协议详解,HTTP安全(二)(读书笔记)(http协议 java)

HTTP安全

HTTP协议是不安全的,如果没有SSL做底层支持,用HTTP Basic Authentication很容易让攻击者监听并获取到用户名和密码的信息。有人说用Base64做encode,这是没用的,攻击者获取到用户名密码后用Base64来decode一下就好了,那么为什么大多数情况我们传输的时候都要用Base64来encode呢?按照wiki上的说法: 编码这一步骤的目的并不是安全与隐私,而是为将用户名和口令中的不兼容的字符转换为均与 HTTP协议 兼容的字符集。

 

HTTP安全头部

由于HTTP是一个可扩展的协议,各浏览器厂商都率先推出了有效的头部,来阻止漏洞利用或提高利用漏洞的难度。了解它们是什么,掌握如何应用,可以提高系统的安全性。

1.Content-Security-Policy

怎么才能尽可能不遭受XSS攻击呢?如果有人在你的服务器上写了如下代码浏览器可能不去解析?<script>alert(1);</script>

下面是内容安全规范中的说明。

添加内容安全规范头部并赋以适当的值,可以限制下面属性的来源:

script-src: JavaScript code (biggest reason to use this header)
connect-src: XMLHttpRequest, WebSockets, and EventSource.
font-src: fonts
frame-src: frame ulrs
img-src: images
media-src: audio & video
object-src: Flash (and other plugins)
style-src: CSS

需要特别指定的:

Content-Security-Policy: script-src &#039;self&#039; https://apis.google.com

 

这就意味着脚本文件只能来自当前文件或apis.google.com(谷歌的JavaScript CDN)

遗憾的是IE还是只支持沙盒模式,并且用的是“X”前缀。安安卓它支持最新的4.4版。当然,它也不是万能的,如果你动态的产生一个JavaScript,黑客还是能把恶意JS植入你的服务器中。包含它不会产生危害,在Chrome、 Firefox 和 iOS都能保护用户。

 

2. X-Frame-Options

它能阻止点击挟持攻击,只需一句:

X-Frame-Options: DENY

这可使浏览器拒绝请求该页的数据。 它的值还有“SAMEORIGIN”,可允许同一源的数据。以及“ALLOW FROM http://url-here.example.com”,它可设置源(IE不支持)。

 

3. X-Content-Type-Options

让用户上传文件具有危险性,提供文件上传服务的危险更大,而且很难做到万无一失。
浏览器进行二次猜测服务的Content-Type并不容易,即使内容是通过MIME嗅探获取的。
X-Content-Type-Options头允许你更有效的告知浏览器你知道你在做什么,当它的值为“nosniff”是才表明Content-Type是正确的。

 

4. Strict-Transport-Security

HTTP的Strict-Transport-Security(HSTS)头部强制浏览器使用HTTPS在指定的时候。比如说,如果你进入 https://hsts.example.com,它会返回这样的头部:

Strict-Transport-Security: max-age=31536000; includeSubDomains

当然如果使用了HTTPS,就可不必使用此头部了,所以说为什么不用HTTPS呢?切记HTTPS不仅能保证你的内容被加密、不被拦截,还能提供真实性。

 

总结

使用以上HTTP头部可帮你快速容易地预防XSS攻击、点击挟持攻击、MIME嗅探和中间人攻击

Day 86/100 《图解HTTP》读书笔记(四)——HTTP报文头信息

Day 86/100 《图解HTTP》读书笔记(四)——HTTP报文头信息

HTTP 通信过程包括从客户端发往服务器端的请求及从服务器端返回 客户端的响应。

1、HTTP 报文

用于 HTTP 协议交互的信息被称为 HTTP 报文。

请求端(客户端)的 HTTP 报文叫做请求报文,响应端(服务器端)的叫做响应报文。

image.png

2、请求报文及响应报文的结构

image.png

image.png

一般有 4 种首部,分别是:通用首部、请求首部、响应首部和实体首 部。

  • 请求行包含用于请求的方法,请求 URI 和 HTTP 版本。
  • 状态行包含表明响应结果的状态码,原因短语和 HTTP 版本。
  • 首部字段 包含表示请求和响应的各种条件和属性的各类首部。

3、 编码提升传输速率

HTTP 在传输数据时可以按照数据原貌直接传输,但也可以在传输过 程中通过编码提升传输速率。通过在传输时编码,能有效地处理大量 的访问请求。

3.1 报文主体和实体主体的差异

报文(message)

是 HTTP 通信中的基本单位,由 8 位组字节流(octet sequence, 其中 octet 为 8 个比特)组成,通过 HTTP 通信传输。

实体(entity) 作为请求或响应的有效载荷数据(补充项)被传输,其内容由实

体首部和实体主体组成。

3.2 压缩传输的内容编码

向待发送邮件内增加附件时,为了使邮件容量变小,我们会先用 ZIP 压缩文件之后再添加附件发送。HTTP 协议中有一种被称为内容编码 的功能也能进行类似的操作。内容编码后的实体由客户端接收并负责解码。

常用的内容编码有以下几种。

  • gzip(GNU zip)
  • compress(UNIX 系统的标准压缩)
  • deflate(zlib)
  • identity(不进行编码)

3.3 分割发送的分块传输编码

在传输大容量数据时,通过把数据分割成 多块,能够让浏览器逐步显示页面。

这种把实体主体分块的功能称为分块传输编码(Chunked Transfer Coding)

分块传输编码会将实体主体分成多个部分(块)。每一块都会用十六 进制来标记块的大小,而实体主体的最后一块会使用“0(CR+LF)”来标 记。

HTTP/1.1 中存在一种称为传输编码(Transfer Coding)的机制,它可 以在通信时按某种编码方式传输,但只定义作用于分块传输编码中。

4、 发送多种数据的多部分对象集合

发送邮件时,我们可以在邮件里写入文字并添加多份附件。这是因为 采用了 MIME(Multipurpose Internet Mail Extensions,多用途因特网邮 件扩展)机制,它允许邮件处理文本、图片、视频等多个不同类型的数据。

HTTP 协议中也采纳了多部分对象集合,发送的一份报文主 体内可含有多类型实体。

  • multipart/form-data
在 Web 表单文件上传时使用。
  • multipart/byte range s
状态码 206(Partial Content,部分内容)响应报文包含了多个范 围的内容时使用。
  • multipart/form-data
Content-Type: multipart/form-data; **boundary=AaB03x** 
 **--AaB03x

** Content-Disposition: form-data; name="field1"
 

Joe Blow

**--AaB03x**

Content-Disposition: form-data; name="pics"; filename="file1.txt" Content-Type: text/plain
 
 ...(file1.txt的数据)...

**--AaB03x--**
  • multipart/byte range s
HTTP/1.1 206 Partial Content
 Date: Fri, 13 Jul 2012 02:45:26 GMT
 Last-Modified: Fri, 31 Aug 2007 02:02:20 GMT
 Content-Type: multipart/byteranges; **boundary=THIS_STRING_SEPARATES**

**--THIS_STRING_SEPARATES**

Content-Type: application/pdf Content-Range: bytes 500-999/8000

54

...(范围指定的数据)... **--THIS_STRING_SEPARATES Content-Type: application/pdf Content-Range: bytes 7000-7999/8000**

**...**(范围指定的数据)**... --THIS_STRING_SEPARATES--**

在 HTTP 报文中使用多部分对象集合时,需要在首部字段里加上 Content-type。

使用 boundary 字符串来划分多部分对象集合指明的各类实体。

5、 获取部分内容的范围请求

如果下载过程中遇到网络中断的情况,那就必须重头开始。为了解决上述问题,需要一种可恢复的机制。所谓恢复是指能从之前下载中断处恢复下载。

要实现该功能需要指定下载的实体范围。像这样,指定范围发送的请 求叫做范围请求(Range Request)。

image.png

5001~10 000 字节

Range: bytes=5001-10000

6、内容协商返回最合适的内容

内容协商机制是指客户端和服务器端就响应的资源内容进行交涉,然后提供给客户端最为适合的资源。内容协商会以响应资源的语言、字符集、编码方式等作为判断的基准。包含在请求报文中的某些首部字段(如下)就是判断的基准。这些首部字段的详细说明请参考下一章。

Accept
Accept-Charset
Accept-Encoding 
Accept-Language 
Content-Language

1、服务器驱动协商(Server-driven Negotiation)

由服务器端进行内容协商。以请求的首部字段为参考,在服务器端自动处理。但对用户来说,以浏览器发送的信息作为判定的依据,并不一定能筛选出最优内容。

2、客户端驱动协商(Agent-driven Negotiation)

由客户端进行内容协商的方式。用户从浏览器显示的可选项列表中手 动选择。还可以利用 JavaScript 脚本在 Web 页面上自动进行上述选 择。比如按 OS 的类型或浏览器类型,自行切换成 PC 版页面或手机 版页面。

3、透明协商(Transparent Negotiation)

是服务器驱动和客户端驱动的结合体,是由服务器端和客户端各自进行内容协商的一种方法。

最后

我建了一个《图解HTTP》共读会,感兴趣的伙伴可以一起来读(ardenzhaogx)

Day 87/100 《图解HTTP》读书笔记(五)——HTTP 常见状态码

Day 87/100 《图解HTTP》读书笔记(五)——HTTP 常见状态码

4.1 状态码告知从服务器端返回的请求结果

类别 原因短语

  • 1XX Informational(信息性状态码) 接收的请求正在处理
  • 2XX Success(成功状态码) 请求正常处理完毕
  • 3XX Redirection(重定向状态码) 需要进行附加操作以完成请求
  • 4XX Client Error(客户端错误状态码) 服务器无法处理请求
  • 5XX Server Error(服务器错误状态码) 服务器处理请求出错

仅记录在 RFC2616 上的 HTTP 状态码就达 40 种,若再加上 WebDAV(Web-based Distributed Authoring and Versioning,基于万维网 的分布式创作和版本控制)(RFC4918、5842) 和附加 HTTP 状态码 (RFC6585)等扩展,数量就达 60 余种。

4.2 2XX 成功

4.2.1 200 OK

表示从客户端发来的请求在服务器端被正常处理了。

在响应报文内,随状态码一起返回的信息会因方法的不同而发生改 变。比如,使用 GET 方法时,对应请求资源的实体会作为响应返 回;而使用 HEAD 方法时,对应请求资源的实体首部不随报文主体 作为响应返回(即在响应中只返回首部,不会返回实体的主体部 分)。

4.2.2 204 No Content

该状态码代表服务器接收的请求已成功处理,但在返回的响应报文中 不含实体的主体部分。另外,也不允许返回任何实体的主体。

4.2.3 206 Partial Content

该状态码表示客户端进行了范围请求,而服务器成功执行了这部分的 GET 请求。响应报文中包含由 Content-Range 指定范围的实体内容。

4.3 3XX 重定向

3XX 响应结果表明浏览器需要执行某些特殊的处理以正确处理请求。

4.3.1 301 Moved Permanently

永久性重定向。该状态码表示请求的资源已被分配了新的 URI,以后 应使用资源现在所指的 URI。也就是说,如果已经把资源对应的 URI 保存为书签了,这时应该按 Location 首部字段提示的 URI 重新保存。

像下方给出的请求 URI,当指定资源路径的最后忘记添加斜杠“/”,就 会产生 301 状态码。

http://example.com/sample

4.3.2 302 Found

临时性重定向。该状态码表示请求的资源已被分配了新的 URI,希望 用户(本次)能使用新的 URI 访问。

和 301 Moved Permanently 状态码相似,但 302 状态码代表的资源不 是被永久移动,只是临时性质的。换句话说,已移动的资源对应的 URI 将来还有可能发生改变。比如,用户把 URI 保存成书签,但不会 像 301 状态码出现时那样去更新书签,而是仍旧保留返回 302 状态码 的页面对应的 URI。

4.3.3 303 See Other

该状态码表示由于请求对应的资源存在着另一个 URI,应使用 GET 方法定向获取请求的资源。

303 状态码和 302 Found 状态码有着相同的功能,但 303 状态码明确 表示客户端应当采用 GET 方法获取资源,这点与 302 状态码有区 别。

当 301、302、303 响应状态码返回时,几乎所有的浏览器都会把 POST 改成 GET,并删除请求报文内的主体,之后请求会自动再次 发送。

301、302 标准是禁止将 POST 方法改变成 GET 方法的,但实际使 用时大家都会这么做。

4.3.4 304 Not Modified

该状态码表示客户端发送附带条件的请求 2 时,服务器端允许请求访 问资源,但未满足条件的情况。304 状态码返回时,不包含任何响应 的主体部分。304 虽然被划分在 3XX 类别中,但是和重定向没有关 系。

2 附带条件的请求是指采用 GET 方法的请求报文中包含 If-Match,If-Modified- Since,If-None-Match,If-Range,If-Unmodified-Since 中任一首部。

image.png

4.4 4XX 客户端错误

4.4.1 400 Bad Request

该状态码表示请求报文中存在语法错误。当错误发生时,需修改请求 的内容后再次发送请求。另外,浏览器会像 200 OK 一样对待该状态 码。

4.4.2 401 Unauthorized

该状态码表示发送的请求需要有通过 HTTP 认证(BASIC 认证、 DIGEST 认证)的认证信息。另外若之前已进行过 1 次请求,则表示 用 户认证失败。

image.png

4.4.3 403 Forbidden

该状态码表明对请求资源的访问被服务器拒绝了。服务器端没有必要给出拒绝的详细理由,但如果想作说明的话,可以在实体的主体部分

对原因进行描述,这样就能让用户看到了。未获得文件系统的访问授权,访问权限出现某些问题(从未授权的发送源 IP 地址试图访问)等列举的情况都可能是发生 403 的原因。

4.4.4 404 Not Found

image.png

该状态码表明服务器上无法找到请求的资源。除此之外,也可以在服务器端拒绝请求且不想说明理由时使用。

4.5 5XX 服务器错误

5XX 的响应结果表明服务器本身发生错误。

4.5.1 500 Internal Server Error

该状态码表明服务器端在执行请求时发生了错误。也有可能是 Web 应用存在的 bug 或某些临时的故障。

4.5.2 503 Service Unavailable

该状态码表明服务器暂时处于超负载或正在进行停机维护,现在无法 处理请求。如果事先得知解除以上状况需要的时间,最好写入 RetryAfter 首部字段再返回给客户端。

状态码和状况的不一致

不少返回的状态码响应都是错误的,但是用户可能察觉不到这点。 比如 Web 应用程序内部发生错误,状态码依然返回 200 OK,这种 情况也经常遇到。

最后

我建了一个《图解HTTP》共读会,感兴趣的伙伴可以一起来读(ardenzhaogx)

HTTP 协议详解,非常经典的 HTTP 网络请求讲解

HTTP 协议详解,非常经典的 HTTP 网络请求讲解


引言                                        

HTTP 是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于 1990 年提出,经过几年的使用与发展,得到不断地完善和扩展。目前在 WWW 中使用的是 HTTP/1.0 的第六版,HTTP/1.1 的规范化工作正在进行之中,而且 HTTP-NG (Next Generation of HTTP) 的建议已经提出。
HTTP 协议的主要特点可概括如下:
1. 支持客户 / 服务器模式。
2. 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有 GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于 HTTP 协议简单,使得 HTTP 服务器的程序规模小,因而通信速度很快。
3. 灵活:HTTP 允许传输任意类型的数据对象。正在传输的类型由 Content-Type 加以标记。
4. 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
5. 无状态:HTTP 协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

 

 

一、HTTP 协议详解之 URL 篇

    http(超文本传输协议)是一个基于请求与响应模式的、无状态的、应用层的协议,常基于 TCP 的连接方式,HTTP1.1 版本中给出一种持续连接的机制,绝大多数的 Web 开发,都是构建在 HTTP 协议之上的 Web 应用。

HTTP URL (URL 是一种特殊类型的 URI,包含了用于查找某个资源的足够的信息) 的格式如下:
http://host[":"port][abs_path]
http 表示要通过 HTTP 协议来定位网络资源;host 表示合法的 Internet 主机域名或者 IP 地址;port 指定一个端口号,为空则使用缺省端口 80;abs_path 指定请求资源的 URI;如果 URL 中没有给出 abs_path,那么当它作为请求 URI 时,必须以 “/” 的形式给出,通常这个工作浏览器自动帮我们完成。
eg:
1、输入:
www.guet.edu.cn
浏览器自动转换成:http://www.guet.edu.cn/
2、http:192.168.0.116:8080/index.jsp 

 

 

 

二、HTTP 协议详解之请求篇

    http 请求由三部分组成,分别是:请求行、消息报头、请求正文

1、请求行以一个方法符号开头,以空格分开,后面跟着请求的 URI 和协议的版本,格式如下:Method Request-URI HTTP-Version CRLF  
其中 Method 表示请求方法;Request-URI 是一个统一资源标识符;HTTP-Version 表示请求的 HTTP 协议版本;CRLF 表示回车和换行(除了作为结尾的 CRLF 外,不允许出现单独的 CR 或 LF 字符)。

请求方法(所有方法全为大写)有多种,各个方法的解释如下:
GET     请求获取 Request-URI 所标识的资源
POST    在 Request-URI 所标识的资源后附加新的数据
HEAD    请求获取由 Request-URI 所标识的资源的响应消息报头
PUT     请求服务器存储一个资源,并用 Request-URI 作为其标识
DELETE  请求服务器删除 Request-URI 所标识的资源
TRACE   请求服务器回送收到的请求信息,主要用于测试或诊断
CONNECT 保留将来使用
OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求
应用举例:
GET 方法:在浏览器的地址栏中输入网址的方式访问网页时,浏览器采用 GET 方法向服务器获取资源,eg:GET /form.html HTTP/1.1 (CRLF)

POST 方法要求被请求服务器接受附在请求后面的数据,常用于提交表单。
eg:POST /reg.jsp HTTP/ (CRLF)
Accept:image/gif,image/x-xbit,... (CRLF)
...
HOST:www.guet.edu.cn (CRLF)
Content-Length:22 (CRLF)
Connection:Keep-Alive (CRLF)
Cache-Control:no-cache (CRLF)
(CRLF)         // 该 CRLF 表示消息报头已经结束,在此之前为消息报头
user=jeffrey&pwd=1234  // 此行以下为提交的数据

HEAD 方法与 GET 方法几乎是一样的,对于 HEAD 请求的回应部分来说,它的 HTTP 头部中包含的信息与通过 GET 请求所得到的信息是相同的。利用这个方法,不必传输整个资源内容,就可以得到 Request-URI 所标识的资源的信息。该方法常用于测试超链接的有效性,是否可以访问,以及最近是否更新。
2、请求报头后述
3、请求正文 (略) 

 

三、HTTP 协议详解之响应篇

    在接收和解释请求消息后,服务器返回一个 HTTP 响应消息。

HTTP 响应也是由三个部分组成,分别是:状态行、消息报头、响应正文
1、状态行格式如下:
HTTP-Version Status-Code Reason-Phrase CRLF
其中,HTTP-Version 表示服务器 HTTP 协议的版本;Status-Code 表示服务器发回的响应状态代码;Reason-Phrase 表示状态代码的文本描述。
状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:
1xx:指示信息 -- 表示请求已接收,继续处理
2xx:成功 -- 表示请求已被成功接收、理解、接受
3xx:重定向 -- 要完成请求必须进行更进一步的操作
4xx:客户端错误 -- 请求有语法错误或请求无法实现
5xx:服务器端错误 -- 服务器未能实现合法的请求
常见状态代码、状态描述、说明:
200 OK      // 客户端请求成功
400 Bad Request  // 客户端请求有语法错误,不能被服务器所理解
401 Unauthorized // 请求未经授权,这个状态代码必须和 WWW-Authenticate 报                 // 头域一起使用 
403 Forbidden  // 服务器收到请求,但是拒绝提供服务
404 Not Found  // 请求资源不存在,eg:输入了错误的 URL
500 Internal Server Error // 服务器发生不可预期的错误
503 Server Unavailable  // 服务器当前不能处理客户端的请求,一段时间后,                         // 可能恢复正常
eg:HTTP/1.1 200 OK (CRLF)

2、响应报头后述

3、响应正文就是服务器返回的资源的内容 

 

四、HTTP 协议详解之消息报头篇

    HTTP 消息由客户端到服务器的请求和服务器到客户端的响应组成。请求消息和响应消息都是由开始行(对于请求消息,开始行就是请求行,对于响应消息,开始行就是状态行),消息报头(可选),空行(只有 CRLF 的行),消息正文(可选)组成。

HTTP 消息报头包括普通报头、请求报头、响应报头、实体报头。
每一个报头域都是由名字 +“:”+ 空格 + 值 组成,消息报头域的名字是大小写无关的。

1、普通报头
在普通报头中,有少数报头域用于所有的请求和响应消息,但并不用于被传输的实体,只用于传输的消息。
eg:
Cache-Control   用于指定缓存指令,缓存指令是单向的(响应中出现的缓存指令在请求中未必会出现),且是独立的(一个消息的缓存指令不会影响另一个消息处理的缓存机制),HTTP1.0 使用的类似的报头域为 Pragma。
请求时的缓存指令包括:no-cache(用于指示请求或响应消息不能缓存)、no-store、max-age、max-stale、min-fresh、only-if-cached;
响应时的缓存指令包括:public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age、s-maxage.
eg:为了指示 IE 浏览器(客户端)不要缓存页面,服务器端的 JSP 程序可以编写如下:response.sehHeader ("Cache-Control","no-cache");
//response.setHeader ("Pragma","no-cache"); 作用相当于上述代码,通常两者 // 合用
这句代码将在发送的响应消息中设置普通报头域:Cache-Control:no-cache


Date 普通报头域表示消息产生的日期和时间

Connection 普通报头域允许发送指定连接的选项。例如指定连接是连续,或者指定 “close” 选项,通知服务器,在响应完成后,关闭连接

2、请求报头
请求报头允许客户端向服务器端传递请求的附加信息以及客户端自身的信息。
常用的请求报头
Accept
Accept 请求报头域用于指定客户端接受哪些类型的信息。eg:Accept:image/gif,表明客户端希望接受 GIF 图象格式的资源;Accept:text/html,表明客户端希望接受 html 文本。
Accept-Charset
Accept-Charset 请求报头域用于指定客户端接受的字符集。eg:Accept-Charset:iso-8859-1,gb2312. 如果在请求消息中没有设置这个域,缺省是任何字符集都可以接受。
Accept-Encoding
Accept-Encoding 请求报头域类似于 Accept,但是它是用于指定可接受的内容编码。eg:Accept-Encoding:gzip.deflate. 如果请求消息中没有设置这个域服务器假定客户端对各种内容编码都可以接受。
Accept-Language
Accept-Language 请求报头域类似于 Accept,但是它是用于指定一种自然语言。eg:Accept-Language:zh-cn. 如果请求消息中没有设置这个报头域,服务器假定客户端对各种语言都可以接受。
Authorization
Authorization 请求报头域主要用于证明客户端有权查看某个资源。当浏览器访问一个页面时,如果收到服务器的响应代码为 401(未授权),可以发送一个包含 Authorization 请求报头域的请求,要求服务器对其进行验证。
Host(发送请求时,该报头域是必需的)
Host 请求报头域主要用于指定被请求资源的 Internet 主机和端口号,它通常从 HTTP URL 中提取出来的,eg:
我们在浏览器中输入:
http://www.guet.edu.cn/index.html
浏览器发送的请求消息中,就会包含 Host 请求报头域,如下:
Host:
www.guet.edu.cn
此处使用缺省端口号 80,若指定了端口号,则变成:Host:www.guet.edu.cn: 指定端口号
User-Agent
我们上网登陆论坛的时候,往往会看到一些欢迎信息,其中列出了你的操作系统的名称和版本,你所使用的浏览器的名称和版本,这往往让很多人感到很神奇,实际上,服务器应用程序就是从 User-Agent 这个请求报头域中获取到这些信息。User-Agent 请求报头域允许客户端将它的操作系统、浏览器和其它属性告诉服务器。不过,这个报头域不是必需的,如果我们自己编写一个浏览器,不使用 User-Agent 请求报头域,那么服务器端就无法得知我们的信息了。
请求报头举例:
GET /form.html HTTP/1.1 (CRLF)
Accept:image/gif,image/x-xbitmap,image/jpeg,application/x-shockwave-flash,application/vnd.ms-excel,application/vnd.ms-powerpoint,application/msword,*/* (CRLF)
Accept-Language:zh-cn (CRLF)
Accept-Encoding:gzip,deflate (CRLF)
If-Modified-Since:Wed,05 Jan 2007 11:21:25 GMT (CRLF)
If-None-Match:W/"80b1a4c018f3c41:8317" (CRLF)
User-Agent:Mozilla/4.0(compatible;MSIE6.0;Windows NT 5.0) (CRLF)
Host:www.guet.edu.cn (CRLF)
Connection:Keep-Alive (CRLF)
(CRLF)

3、响应报头
响应报头允许服务器传递不能放在状态行中的附加响应信息,以及关于服务器的信息和对 Request-URI 所标识的资源进行下一步访问的信息。
常用的响应报头
Location
Location 响应报头域用于重定向接受者到一个新的位置。Location 响应报头域常用在更换域名的时候。
Server
Server 响应报头域包含了服务器用来处理请求的软件信息。与 User-Agent 请求报头域是相对应的。下面是
Server 响应报头域的一个例子:
Server:Apache-Coyote/1.1
WWW-Authenticate
WWW-Authenticate 响应报头域必须被包含在 401(未授权的)响应消息中,客户端收到 401 响应消息时候,并发送 Authorization 报头域请求服务器对其进行验证时,服务端响应报头就包含该报头域。
eg:WWW-Authenticate:Basic realm="Basic Auth Test!"  // 可以看出服务器对请求资源采用的是基本验证机制。


4、实体报头
请求和响应消息都可以传送一个实体。一个实体由实体报头域和实体正文组成,但并不是说实体报头域和实体正文要在一起发送,可以只发送实体报头域。实体报头定义了关于实体正文(eg:有无实体正文)和请求所标识的资源的元信息。
常用的实体报头
Content-Encoding
Content-Encoding 实体报头域被用作媒体类型的修饰符,它的值指示了已经被应用到实体正文的附加内容的编码,因而要获得 Content-Type 报头域中所引用的媒体类型,必须采用相应的解码机制。Content-Encoding 这样用于记录文档的压缩方法,eg:Content-Encoding:gzip
Content-Language
Content-Language 实体报头域描述了资源所用的自然语言。没有设置该域则认为实体内容将提供给所有的语言阅读
者。eg:Content-Language:da
Content-Length
Content-Length 实体报头域用于指明实体正文的长度,以字节方式存储的十进制数字来表示。
Content-Type
Content-Type 实体报头域用语指明发送给接收者的实体正文的媒体类型。eg:
Content-Type:text/html;charset=ISO-8859-1
Content-Type:text/html;charset=GB2312
Last-Modified
Last-Modified 实体报头域用于指示资源的最后修改日期和时间。
Expires
Expires 实体报头域给出响应过期的日期和时间。为了让代理服务器或浏览器在一段时间以后更新缓存中 (再次访问曾访问过的页面时,直接从缓存中加载,缩短响应时间和降低服务器负载) 的页面,我们可以使用 Expires 实体报头域指定页面过期的时间。eg:Expires:Thu,15 Sep 2006 16:23:12 GMT
HTTP1.1 的客户端和缓存必须将其他非法的日期格式(包括 0)看作已经过期。eg:为了让浏览器不要缓存页面,我们也可以利用 Expires 实体报头域,设置为 0,jsp 中程序如下:response.setDateHeader ("Expires","0");

 

 

五、利用 telnet 观察 http 协议的通讯过程

    实验目的及原理:
    利用 MS 的 telnet 工具,通过手动输入 http 请求信息的方式,向服务器发出请求,服务器接收、解释和接受请求后,会返回一个响应,该响应会在 telnet 窗口上显示出来,从而从感性上加深对 http 协议的通讯过程的认识。

    实验步骤:

1、打开 telnet
1.1 打开 telnet
运行 -->cmd-->telnet

1.2 打开 telnet 回显功能
set localecho

2、连接服务器并发送请求
2.1 open 
www.guet.edu.cn 80  // 注意端口号不能省略

    HEAD /index.asp HTTP/1.0
    Host:www.guet.edu.cn
    
   /* 我们可以变换请求方法,请求桂林电子主页内容,输入消息如下 */
    open 
www.guet.edu.cn 80 
   
    GET /index.asp HTTP/1.0  // 请求资源的内容
    Host:www.guet.edu.cn  

2.2 open www.sina.com.cn 80  // 在命令提示符号下直接输入 telnet www.sina.com.cn 80
    HEAD /index.asp HTTP/1.0
    Host:www.sina.com.cn
 

3 实验结果:

3.1 请求信息 2.1 得到的响应是:

HTTP/1.1 200 OK                                              // 请求成功
Server: Microsoft-IIS/5.0                                    //web 服务器
Date: Thu,08 Mar 200707:17:51 GMT
Connection: Keep-Alive                                 
Content-Length: 23330
Content-Type: text/html
Expries: Thu,08 Mar 2007 07:16:51 GMT
Set-Cookie: ASPSESSIONIDQAQBQQQB=BEJCDGKADEDJKLKKAJEOIMMH; path=/
Cache-control: private

// 资源内容省略

3.2 请求信息 2.2 得到的响应是:

HTTP/1.0 404 Not Found       // 请求失败
Date: Thu, 08 Mar 2007 07:50:50 GMT
Server: Apache/2.0.54 <Unix>
Last-Modified: Thu, 30 Nov 2006 11:35:41 GMT
ETag: "6277a-415-e7c76980"
Accept-Ranges: bytes
X-Powered-By: mod_xlayout_jh/0.0.1vhs.markII.remix
Vary: Accept-Encoding
Content-Type: text/html
X-Cache: MISS from zjm152-78.sina.com.cn
Via: 1.0 zjm152-78.sina.com.cn:80<squid/2.6.STABLES-20061207>
X-Cache: MISS from th-143.sina.com.cn
Connection: close


失去了跟主机的连接

按任意键继续...


4 . 注意事项:1、出现输入错误,则请求不会成功。
          2、报头域不分大小写。
          3、更深一步了解 HTTP 协议,可以查看 RFC2616,在
http://www.letf.org/rfc 上找到该文件。
          4、开发后台程序必须掌握 http 协议

 

六、HTTP 协议相关技术补充

    1、基础:
    高层协议有:文件传输协议 FTP、电子邮件传输协议 SMTP、域名系统服务 DNS、网络新闻传输协议 NNTP 和 HTTP 协议等
中介由三种:代理 (Proxy)、网关 (Gateway) 和通道 (Tunnel),一个代理根据 URI 的绝对格式来接受请求,重写全部或部分消息,通过 URI 的标识把已格式化过的请求发送到服务器。网关是一个接收代理,作为一些其它服务器的上层,并且如果必须的话,可以把请求翻译给下层的服务器协议。一 个通道作为不改变消息的两个连接之间的中继点。当通讯需要通过一个中介 (例如:防火墙等) 或者是中介不能识别消息的内容时,通道经常被使用。
     代理 (Proxy):一个中间程序,它可以充当一个服务器,也可以充当一个客户机,为其它客户机建立请求。请求是通过可能的翻译在内部或经过传递到其它的 服务器中。一个代理在发送请求信息之前,必须解释并且如果可能重写它。代理经常作为通过防火墙的客户机端的门户,代理还可以作为一个帮助应用来通过协议处 理没有被用户代理完成的请求。
网关 (Gateway):一个作为其它服务器中间媒介的服务器。与代理不同的是,网关接受请求就好象对被请求的资源来说它就是源服务器;发出请求的客户机并没有意识到它在同网关打交道。
  网关经常作为通过防火墙的服务器端的门户,网关还可以作为一个协议翻译器以便存取那些存储在非 HTTP 系统中的资源。
    通道 (Tunnel):是作为两个连接中继的中介程序。一旦激活,通道便被认为不属于 HTTP 通讯,尽管通道可能是被一个 HTTP 请求初始化的。当被中继 的连接两端关闭时,通道便消失。当一个门户 (Portal) 必须存在或中介 (Intermediary) 不能解释中继的通讯时通道被经常使用。


2、协议分析的优势 —HTTP 分析器检测网络攻击
以模块化的方式对高层协议进行分析处理,将是未来入侵检测的方向。
HTTP 及其代理的常用端口 80、3128 和 8080 在 network 部分用 port 标签进行了规定

3、HTTP 协议 Content Lenth 限制漏洞导致拒绝服务攻击
使用 POST 方法时,可以设置 ContentLenth 来定义需要传送的数据长度,例如 ContentLenth:999999999,在传送完成前,内 存不会释放,攻击者可以利用这个缺陷,连续向 WEB 服务器发送垃圾数据直至 WEB 服务器内存耗尽。这种攻击方法基本不会留下痕迹。
http://www.cnpaf.net/Class/HTTP/0532918532667330.html


4、利用 HTTP 协议的特性进行拒绝服务攻击的一些构思
服务器端忙于处理攻击者伪造的 TCP 连接请求而无暇理睬客户的正常请求(毕竟客户端的正常请求比率非常之小),此时从正常客户的角度看来,服务器失去响应,这种情况我们称作:服务器端受到了 SYNFlood 攻击(SYN 洪水攻击)。
而 Smurf、TearDrop 等是利用 ICMP 报文来 Flood 和 IP 碎片攻击的。本文用 “正常连接” 的方法来产生拒绝服务攻击。
19 端口在早期已经有人用来做 Chargen 攻击了,即 Chargen_Denial_of_Service,但是!他们用的方法是在两台 Chargen 服务器之间产生 UDP 连接,让服务器处理过多信息而 DOWN 掉,那么,干掉一台 WEB 服务器的条件就必须有 2 个:1. 有 Chargen 服务 2. 有 HTTP 服务
方法:攻击者伪造源 IP 给 N 台 Chargen 发送连接请求(Connect),Chargen 接收到连接后就会返回每秒 72 字节的字符流(实际上根据网络实际情况,这个速度更快)给服务器。


5、Http 指纹识别技术
   Http 指纹识别的原理大致上也是相同的:记录不同服务器对 Http 协议执行中的微小差别进行识别.Http 指纹识别比 TCP/IP 堆栈指纹识别复杂许 多,理由是定制 Http 服务器的配置文件、增加插件或组件使得更改 Http 的响应信息变的很容易,这样使得识别变的困难;然而定制 TCP/IP 堆栈的行为 需要对核心层进行修改,所以就容易识别.
      要让服务器返回不同的 Banner 信息的设置是很简单的,象 Apache 这样的开放源代码的 Http 服务器,用户可以在源代码里修改 Banner 信息,然 后重起 Http 服务就生效了;对于没有公开源代码的 Http 服务器比如微软的 IIS 或者是 Netscape, 可以在存放 Banner 信息的 Dll 文件中修 改,相关的文章有讨论的,这里不再赘述,当然这样的修改的效果还是不错的。另外一种模糊 Banner 信息的方法是使用插件。
常用测试请求:
1:HEAD/Http/1.0 发送基本的 Http 请求
2:DELETE/Http/1.0 发送那些不被允许的请求,比如 Delete 请求
3:GET/Http/3.0 发送一个非法版本的 Http 协议请求
4:GET/JUNK/1.0 发送一个不正确规格的 Http 协议请求
Http 指纹识别工具 Httprint, 它通过运用统计学原理,组合模糊的逻辑学技术,能很有效的确定 Http 服务器的类型。它可以被用来收集和分析不同 Http 服务器产生的签名。


6、其他:为了提高用户使用浏览器时的性能,现代浏览器还支持并发的访问方式,浏览一个网页时同时建立多个连接,以迅速获得一个网页上的多个图标,这样能更快速完成整个网页的传输。
HTTP1.1 中提供了这种持续连接的方式,而下一代 HTTP 协议:HTTP-NG 更增加了有关会话控制、丰富的内容协商等方式的支持,来提供
更高效率的连接。

HTTP&HTTPS协议详解之HTTP篇

HTTP&HTTPS协议详解之HTTP篇

一、HTTP简介

01.什么是HTTP

HTTP(HyperText Transfer Protocol ,超文本传输协议),是一个基于请求与响应的,无状态的应用层的协议,常基于TCP/IP协议传输数据,互联网上应用最广泛的一种协议,所有的WWW文件必须遵守这个标准。

HTTP协议的设计初衷是为了提供一种发送和接受HTML页面的方法

02.HTTP发展史

  • HTTP/0.9版本(1991年)

特点

    • 不涉及数据包传输,服务器只能回应HTML格式的字符串,不能回应别的格式
    • 只能以GET方式请求
    • 每次请求都需要重新建立TCP连接,服务器发送完毕就关闭TCP连接
    • 没有成为正式的标准

请求示例

 

GET /index.html

 

响应示例

<html>
  <body>Hello World</body>
</html>

 

  • HTTP/1.0版本(1996年)

特点

    • 传输内容格式没有限制
    • 增加POST、HEAD命令
    • 请求和响应的格式变了,除了数据部分,每次通讯都必须包含头信息(HTTP Header)来描述一些元数据
    • 新增功能还包括状态码(status code)多字符集支持多部分发送(multi-part type)权限(authorization)缓存(cache)内容编码(content encoding)
    • 每次请求都需要重新建立TCP连接,服务器发送完毕就关闭TCP连接
    • 正式作为标准

请求示例

GET / HTTP/1.0
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5)
Accept: */*

响应示例

HTTP/1.0 200 OK 
Content-Type: text/plain
Content-Length: 137582
Expires: Thu, 05 Dec 1997 16:00:00 GMT
Last-Modified: Wed, 5 August 1996 15:55:28 GMT
Server: Apache 0.84

<html>
  <body>Hello World</body>
</html>

 

  • HTTP/1.1版本(1997年)

特点

    • 增加持久连接(persistent connection),即TCP连接默认不关闭,可以被多个请求复用
    • 引入管道机制(pipelining),即在同一个TCP连接里面,客户端可以同时发送多个请求。这样就进一步改进了HTTP协议的效率
    • 引入分块传输编码 (Chunked transfer encoding)机制,允许HTTP由網頁伺服器发送给客户端应用( 通常是网页浏览器)的数据可以分成多个部分
    • 引入了许多动词方法:PUT、PATCH、OPTIONS、DELETE
    • 客户端请求的头信息新增了Host字段,用来指定服务器的域名

缺点:

虽然1.1版允许复用TCP连接,但是同一个TCP连接里面,所有的数据通信是按次序进行的。服务器只有处理完一个回应,才会进行下一个回应。要是前面的回应特别慢,后面就会有许多请求排队等着。这称为"队头堵塞"(Head-of-line blocking)。

 为了避免这个问题,只有两种方法:一是减少请求数,二是同时多开持久连接。这导致了很多的网页优化技巧,比如合并脚本和样式表、将图片嵌入CSS代码、域名分片(domain sharding)等等。如果HTTP协议设计得更好一些,这些额外的工作是可以避免的。

请求示例

GET /?mkt=zh-CN HTTP/1.1
Host: cn.bing.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Cookie: SRCHD=AF=NOFORM; SRCHUID=V=2&GUID=8004E55B8C8B4137BACF748D4213FE40&dmnchg=1; SRCHUSR=DOB=20191024&T=1580718980000; _EDGE_V=1; MUID=19ADA0EFC0FC60B715E2AD10C1D26108; MUIDB=19ADA0EFC0FC60B715E2AD10C1D26108; SRCHHPGUSR=CW=1536&CH=728&DPR=1.25&UTC=480&WTS=63717770478&HV=1582173694; ABDEF=MRB=1580624806993&MRNB=0; SNRHOP=I=&TS=; _EDGE_S=mkt=zh-cn&SID=32482CF6BD916165130F2280BCBF60A9; _SS=SID=32482CF6BD916165130F2280BCBF60A9&bIm=376; ipv6=hit=1582177279658&t=4
Upgrade-Insecure-Requests: 1
Pragma: no-cache
Cache-Control: no-cache

响应示例

HTTP/1.1 200 OK
Cache-Control: private, max-age=0
Content-Length: 112682
Content-Type: text/html; charset=utf-8
Vary: Accept-Encoding
P3P: CP="NON UNI COM NAV STA LOC CURa DEVa PSAa PSDa OUR IND"
Set-Cookie: SNRHOP=I=&TS=; domain=.bing.com; path=/
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
X-MSEdge-Ref: Ref A: A5F96665F8534BC1858A0E1C7D198764 Ref B: BJ1EDGE0106 Ref C: 2020-02-20T04:43:04Z
Set-Cookie: _EDGE_S=mkt=zh-cn&SID=32482CF6BD916165130F2280BCBF60A9; path=/; httponly; domain=bing.com
Date: Thu, 20 Feb 2020 04:43:03 GMT
Connection: close

 

  • HTTP/2版本(2015年)

特点

    • 彻底的二进制协议,头信息和数据体都是二进制,并且统称为""(frame):头信息帧和数据帧。
    • 多工(Multiplexing),复用TCP连接,在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,而且不用按照顺序一一对应,这样就避免了"队头堵塞"。
    • 引入数据流机制
    • 引入了头信息压缩机制(header compression)。
    • 允许服务器未经请求,主动向客户端发送资源,这叫做服务器推送(server push)。

 

04.什么是C/S架构?什么是B/S架构?

  • C/S(Client/Sever)客户机和服务器架构
  • B/S(Bower/Sever)浏览器和服务器架构

 

二、HTTP消息结构

01.统一资源定位符(URL)

URL,全称是UniformResourceLocator, 中文叫统一资源定位符,是互联网上用来标识某一处资源的地址。

 

协议方案名:http、ftp、mailto、file

登录信息:如果需要网页认证时,需要填写该参数,所以是可选项

服务器地址:可以是IP地址形式,也可以是能被DNS服务器解析成IP地址的域名形式

端口号:指定服务器连接的端口号,选填,不填则默认为本协议的端口号(HTTP:80,HTTPS:443)

带层次的文件路径:获取资源在服务器中的具体地址

查询字符串:针对以指定路径的资源,可使用查询字符串来获取想要的参数,此项也是可选项

片段标识符:又名hash,来标记以获取资源中的子资源(在文档中的某个位置)

 

02.统一资源标识符 (URI)

统一资源标识符Uniform Resource Identifier)一个用于标识某一互联网资源名称的字符串。

该种标识允许用户对网络中(一般指万维网)的资源通过特定的协议进行交互操作。URI的最常见的形式是统一资源定位符(URL),经常指定为非正式的网址。更罕见的用法是统一资源名称(URN),其目的是通过提供一种途径。用于在特定的命名空间资源的标识,以补充网址。

 

 

03.HTTP之请求消息Request

 1.HTTP报文格式(HTTP请求)

HTTP请求由请求行(request line)请求头部(header)空行请求数据四个部分组成。

 

2.HTTP请求方法

HTTP/1.1协议中共定义了八种方法(有时也叫“动作”)来表明Request-URI指定的资源的不同操作方式:

OPTIONS - 返回服务器针对特定资源所支持的HTTP请求方法。也可以利用向Web服务器发送''*''的请求来测试服务器的功能性。
HEAD- 向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息。该方法常用于测试超链接的有效性,是否可以访问,以及最近是否更新。
GET - 向特定的资源发出请求。注意:GET方法不应当被用于产生“副作用”的操作中,例如在web app.中。其中一个原因是GET可能会被网络蜘蛛等随意访问。
POST - 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
PUT - 向指定资源位置上传其最新内容。
DELETE - 请求服务器删除Request-URI所标识的资源。
TRACE- 回显服务器收到的请求,主要用于测试或诊断。
CONNECT - HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
PATCH - 用来将局部修改应用于某一资源,添加于规范RFC5789。

 

 3.HTTP常见的请求头部字段名(在HTTP/1.1 协议中,所有的请求头,除Host外,都是可选的)

  • X-Forwarded-For:用来表示HTTP请求端的真实IP,被各大HTTP代理、负载均衡等转发服务广泛使用

  • Cache-Control:指定请求和响应遵循的缓存机制。缓存指令是单向的(响应中出现的缓存指令在请求中未必会出现),且是独立的(在请求消息或响应消息中设置Cache-Control并不会修改另一个消息处理过程中的缓存处理过程)。请求时的缓存指令包括no-cache、no-store、max-age、max-stale、min-fresh、only-if-cached,响应消息中的指令包括public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age、s-maxage。

Cache-Control:Public 可以被任何缓存所缓存
Cache-Control:Private 内容只缓存到私有缓存中
Cache-Control:no-cache 所有内容都不会被缓存
Cache-Control:no-store 用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。
Cache-Control:max-age 指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。
Cache-Control:min-fresh 指示客户机可以接收响应时间小于当前时间加上指定时间的响应。
Cache-Control:max-stale 指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。

  • Accept:浏览器端可以接受的MIME类型。例如:Accept: text/html 代表浏览器可以接受服务器回发的类型为 text/html 也就是我们常说的html文档,如果服务器无法返回text/html类型的数据,服务器应该返回一个406错误(non acceptable)。通配符 * 代表任意类型,例如 Accept: */* 代表浏览器可以处理所有类型,(一般浏览器发给服务器都是发这个)。

  • Accept-Encoding:浏览器申明自己可接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate);Servlet能够向支持gzip的浏览器返回经gzip编码的HTML页面。许多情形下这可以减少5到10倍的下载时间。例如: Accept-Encoding: gzip, deflate。如果请求消息中没有设置这个域,服务器假定客户端对各种内容编码都可以接受。

  • Accept-Language:浏览器申明自己接收的语言。语言跟字符集的区别:中文是语言,中文有多种字符集,比如big5,gb2312,gbk等等;例如:Accept-Language: en-us。如果请求消息中没有设置这个报头域,服务器假定客户端对各种语言都可以接受。

  • Accept-Charset:浏览器可接受的字符集。如果在请求消息中没有设置这个域,缺省表示任何字符集都可以接受。

  • User-Agent:告诉HTTP服务器,客户端使用的操作系统和浏览器的名称和版本。例如: User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; CIBA; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; InfoPath.2; .NET4.0E)。

  • Content-Type:例如:Content-Type: application/x-www-form-urlencoded。

  • Referer:包含一个URL,用户从该URL代表的页面出发访问当前请求的页面。提供了Request的上下文信息的服务器,告诉服务器我是从哪个链接过来的,比如从我主页上链接到一个朋友那里,他的服务器就能够从HTTP Referer中统计出每天有多少用户点击我主页上的链接访问他的网站。例如: Referer:http://translate.google.cn/?hl=zh-cn&tab=wT

  • Connection:例如:Connection: keep-alive 当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。HTTP 1.1默认进行持久连接。利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。要实现这一点,Servlet需要在应答中发送一个Content-Length头,最简单的实现方法是:先把内容写入ByteArrayOutputStream,然后在正式写出内容之前计算它的大小。Connection: close 代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭,当客户端再次发送Request,需要重新建立TCP连接。

  • Host:(发送请求时,该头域是必需的)主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的。HTTP/1.1请求必须包含主机头域,否则系统会以400状态码返回。例如: 我们在浏览器中输入:http://www.guet.edu.cn/index.html,浏览器发送的请求消息中,就会包含Host请求头域:Host:http://www.guet.edu.cn,此处使用缺省端口号80,若指定了端口号,则变成:Host:指定端口号。

  • Cookie:最重要的请求头之一, 将cookie的值发送给HTTP服务器。

  • Content-Length:表示请求消息正文的长度。例如:Content-Length: 38。

  • Authorization:授权信息,通常出现在对服务器发送的WWW-Authenticate头的应答中。主要用于证明客户端有权查看某个资源。当浏览器访问一个页面时,如果收到服务器的响应代码为401(未授权),可以发送一个包含Authorization请求报头域的请求,要求服务器对其进行验证。

  • From:请求发送者的email地址,由一些特殊的Web客户程序使用,浏览器不会用到它。

  • Range:可以请求实体的一个或者多个子范围。例如,

 

 

04.HTTP之响应消息Response

1.HTTP报文格式(HTTP响应)

 

  • 状态行由三部分组成,分别为:协议版本状态码状态码描述,之间由空格间隔
  • 响应头部与请求头部类似,也包含了很多有用信息
  • 空行,这一行非常重要,表示响应头的结束
  • 响应正文,服务器返回的文档,最常见的为HTML网页

 

2.HTTP常见的状态码

状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:

1xx:指示信息--表示请求已接收,继续处理

2xx:成功--表示请求已被成功接收、理解、接受

3xx:重定向--要完成请求必须进行更进一步的操作

4xx:客户端错误--请求有语法错误或请求无法实现

5xx:服务器端错误--服务器未能实现合法的请求

200 OK                        //客户端请求成功
400 Bad Request               //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized              //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用 
403 Forbidden                 //服务器收到请求,但是拒绝提供服务
404 Not Found                 //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error     //服务器发生不可预期的错误
503 Server Unavailable        //服务器当前不能处理客户端的请求,一段时间后可能恢复正常

 

3.HTTP常见响应头部字段名

  • Allow:服务器支持哪些请求方法(如GET、POST等)

  • Date:表示消息发送的时间,时间的描述格式由rfc822定义。

  • Expires:指明应该在什么时候认为文档已经过期,从而不再缓存它,重新从服务器获取,会更新缓存。过期之前使用本地缓存。HTTP1.1的客户端和缓存会将非法的日期格式(包括0)看作已经过期。

  • P3P:用于跨域设置Cookie, 这样可以解决iframe跨域访问cookie的问题 

  • Set-Cookie:非常重要的header, 用于把cookie发送到客户端浏览器,每一个写入cookie都会生成一个Set-Cookie。

  • ETag:和If-None-Match 配合使用。

  • Last-Modified:用于指示资源的最后修改日期和时间。Last-Modified也可用setDateHeader方法来设置。

  • Content-Type:WEB服务器告诉浏览器自己响应的对象的类型和字符集。Servlet默认为text/plain,但通常需要显式地指定为text/html。由于经常要设置Content-Type,因此HttpServletResponse提供了一个专用的方法setContentType。可在web.xml文件中配置扩展名和MIME类型的对应关系。

  • Content-Range:用于指定整个实体中的一部分的插入位置,他也指示了整个实体的长度。在服务器向客户返回一个部分响应,它必须描述响应覆盖的范围和整个实体长度。一般格式:Content-Range:bytes-unitSPfirst-byte-pos-last-byte-pos/entity-length。

  • Content-Length:指明实体正文的长度,以字节方式存储的十进制数字来表示。在数据下行的过程中,Content-Length的方式要预先在服务器中缓存所有数据,然后所有数据再一股脑儿地发给客户端。只有当浏览器使用持久HTTP连接时才需要这个数据。如果你想要利用持久连接的优势,可以把输出文档写入ByteArrayOutputStram,完成后查看其大小,然后把该值放入Content-Length头,最后通过byteArrayStream.writeTo(response.getOutputStream()发送内容。

  • Content-Encoding:WEB服务器表明自己使用了什么压缩方法(gzip,deflate)压缩响应中的对象。只有在解码之后才可以得到Content-Type头指定的内容类型。利用gzip压缩文档能够显著地减少HTML文档的下载时间。Java的GZIPOutputStream可以很方便地进行gzip压缩,但只有Unix上的Netscape和Windows上的IE 4、IE 5才支持它。因此,Servlet应该通过查看Accept-Encoding头(即request.getHeader("Accept-Encoding"))检查浏览器是否支持gzip,为支持gzip的浏览器返回经gzip压缩的HTML页面,为其他浏览器返回普通页面。

  • Content-Language:WEB服务器告诉浏览器自己响应的对象所用的自然语言。没有设置该域则认为实体内容将提供给所有的语言阅读。

  • Server:指明HTTP服务器用来处理请求的软件信息。。

  • X-AspNet-Version:如果网站是用ASP.NET开发的,这个header用来表示ASP.NET的版本。

  • X-Powered-By:表示网站是用什么技术开发的。

  • Connection:例如:Connection: keep-alive 当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。Connection: close 代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭,当客户端再次发送Request,需要重新建立TCP连接。

  • Location:用于重定向一个新的位置,包含新的URL地址。表示客户应当到哪里去提取文档。Location通常不是直接设置的,而是通过HttpServletResponse的sendRedirect方法,该方法同时设置状态代码为302。Location响应报头域常用在更换域名的时候。

  • Refresh:表示浏览器应该在多少时间之后刷新文档,以秒计。除了刷新当前文档之外,你还可以通过setHeader("Refresh", "5; URL=http://host/path")让浏览器读取指定的页面。注意这种功能通常是通过设置HTML页面HEAD区的<META HTTP-EQUIV="Refresh" CONTENT="5;URL=http://host/path">实现,这是因为,自动刷新或重定向对于那些不能使用CGI或Servlet的HTML编写者十分重要。但是,对于Servlet来说,直接设置Refresh头更加方便。注意Refresh的意义是“N秒之后刷新本页面或访问指定页面”,而不是“每隔N秒刷新本页面或访问指定页面”。因此,连续刷新要求每次都发送一个Refresh头,而发送204状态代码则可以阻止浏览器继续刷新,不管是使用Refresh头还是<META HTTP-EQUIV="Refresh" ...>。注意Refresh头不属于HTTP 1.1正式规范的一部分,而是一个扩展,但Netscape和IE都支持它。

三、HTTP工作原理

  • A.客户端通过TCP三次握手与服务器建立连接

  • B.TCP建立连接成功后,向服务器发送HTTP请求

  • C.服务器接收到HTTP请求后,向客户端发送HTTP响应

  • D.客户端通过TCP四次断开,与服务器断开TCP连接

 

 

 

四、引用链接

  • 一篇比较全的HTTP协议详解

  • HTTP 协议入门

  • HTTP, by Wikipedia

  • 《图解HTTP》

未完,待续。。。。。。

更多精彩文章请关注公众号 白帽技术与网络安全

ps:关注公众号还可以领取海量学习视频呦~

原文出处:https://www.cnblogs.com/0pen1/p/12316682.html

今天的关于Java架构师第五步——HTTP协议详解,HTTP安全的分享已经结束,谢谢您的关注,如果想了解更多关于Day 86/100 《图解HTTP》读书笔记(四)——HTTP报文头信息、Day 87/100 《图解HTTP》读书笔记(五)——HTTP 常见状态码、HTTP 协议详解,非常经典的 HTTP 网络请求讲解、HTTP&HTTPS协议详解之HTTP篇的相关知识,请在本站进行查询。

本文标签: