文章目录
前言
第一次写博客,粗略阅读了《图解HTTP》前六张,以下是我的阅读笔记(一些基础的没有记录,如有需要,请参考《图解HTTP》)。
一、名词解释
HTTP(HyperText Transfer Protocol,超文本传输协议)
协议:不同的硬件、操作系统之间的通信,所有的这一切所需要的规则。
TCP/IP:与互联网相关联的协议的集合。也称 TCP/IP协议族
IP:一种协议的名称
IP地址:网络分配的一个地址。
1.IP地址构成:网络位+主机位(网络位相同的IP地址,为同一网段)
网段-------{三种可能:x. / x.x. / x.x.x.}
2.全球ip地址都由二进制(32位)组成
点分十进制------形式:x.x.x.x的范围:0-255
3.局域网通信规则:在同一个局域网中所有IP必须在同一网段才可以互相通信!
4.有IP就要有子网掩码
子网掩码如何确定网络位:与255对应的数字为网络位,与0对应的数字为主机位
255.0.0.0
255.255.0.0
255.255.255.0 三个均为子网掩码
注:1个IP地址,必须配一个子网掩码
如图为winxp下的配置的一个IP地址。一般计算机都是自动获取IP地址
DNS(域名服务器):提供域名到IP地址之间的解析服务。
用户通常是用主机名和域名访问计算机(如www.baidu.com),而计算机擅长处理数字,所以DNS由此而来。DNS协议提供通过域名查找IP地址,或逆向从IP地址反查域名的服务。即实现二者的转换。
URI(Uniform Resource Identifier 统一资源标识符):表示web上每一种可用的资源,如 HTML文档、图像、视频片段、程序等都由一个URI进行标识的。
URL(Uniform Resource Locator 统一资源定位器):URL是URI的一个子集,采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。URL是URI概念的一种实现方式。URL是使用Web浏览器等访问Web页面时需要输入的网页地址,如http://hackr.jp/
HTTP报文:用于HTTP协议交互的信息。分为报文首部和报文主体两块。结构如下图
二、客户端与服务器间的通信
2.1 通过请求与响应达成通信
请求报文的构成
响应报文的构成
2.2 HTTP特性
- 无状态协议
HTTP协议自身不对请求和响应之间的通信状态进行保存 - 持久连接与管线化
持久连接:建立1次TCP连接后进行多次请求和响应的交互
管线化:不用等待响应亦可直接发送下一个请求。 - 使用Cooike的状态管理
如果让服务器管理全部客户端状态则会成为负担,所以使用Cooike来解决这一问题。
- 没有Cooike信息状态下的请求
- 第二次以后(存有Cookie信息状态)的请求
2.3告知服务器意图的HTTP方法
GET:获取资源
POST:传输实体主体
HEAD:获得报文首部
DELETE:删除文件
OPTIONS:询问支持的方法
TRACE:追踪路径
CONNECT:要求用隧道协议连接代理
三、HTTP报文首部
3.1 HTTP报文结构
报文首部:在客户端和服务器处理时起至关重要作用的信息几乎都在这
报文主体:所需要的用户和资源的信息都在这
- 请求报文
- 响应报文
3.2HTTP首部字段
3.2.1各首部字段概述
- 通用首部字段
、请求首部字段
- 响应首部字段
- 实体首部字段
- End-to-end首部和Hop-by-hop首部
HTTP首部字段将定义成缓存代理和非缓存代理的行为,分成2种类型。
除这8个是逐条首部字段,其余都属于端到端首部
●Connection
●Keep-Alive
●Proxy-Authenticate
●Proxy-Authorization
●Trailer
●TE
●Transfer-Encoding
●Upgrade
3.2.2通用首部字段
Cache-Control–控制缓存
- 缓存请求指令
- 缓存响应指令
Connection
两个作用:
●控制不再转发给代理的首部字段( 即Hop-by-hop首部)
Connection:不再转发的首部字段名
●管理持久连接
*当服务器端想明确断开连接时,则指定 Connection首部字段的值为Close。
Connection:close
Date
表明创建HTTP报文的日期和时间
Pragma
客户端会要求所有的中间服务器不返回缓存的资源。
Trailer
首部字段Trailer会事先说明在报文主体后记录了哪些首部字段
如下图:指定首部字段Trailer的值为Expires,在报文主体之后(分块长度0之后)出现了首部字段Expires。
Transfer-Encoding
规定了传输报文主体时采用的编码方式。
Upgrade
用于检测HTTP协议及其他协议是否可使用更高的版本进行通信,其参数值可以用来指定一个完全不同的通信协议。
Via
追踪客户端与服务器之间的请求和响应报文的传输路径。
Warning
告知用户一些与缓存相关的问题的警告。
格式如下:
Warning:[警告码][警告的主机:端口号]“[警告内容]”([日期时间])
警告码具备扩展性,今后有可能追加新的警告码。
3.2.3请求首部字段
Accept
通知服务器,用户代理能够处理的媒体类型及媒体类型的相对优先级。可使用type/subtype这种形式,一次指定多种媒体类型。
几种媒体类型的例子
●文本文件
text/html, text/plain, text/css
application/xhtml+xml,
application/xml …
●图片文件
image/jpeg,image/gif, image/png …
●视频文件
video/mpeg, video/quicktime…
●应用程序使用的二进制文件
application/octet-stream,
application/zip …
Accept-Charset
通知服务器用户代理支持的字符集及字符集的相对优先顺序,也可用权重q值来表示相对优先级。另外,也可使用星号(*)作为通配符,指定任意的编码格式。
●gzip
由文件压缩程序gzip(GNU zip)生成的编码格式(RFC1952),采用Lempel-Ziv算法(LZ77)及32位循环冗余校验(Cyclic Redundancy Check,通称CRC)。
●compress
由UNIX文件压缩程序compress生成的编码格式,采用Lempel-Ziv-Welch算法(LZW)。●deflate
组合使用zlib格式(RFC1950)及由deflate压缩算法(RFC1951)生成的编码格式。
●identity
不执行压缩或不会变化的默认编码格式
Accept-Encoding
告知服务器用户代理支持的内容编码及内容编码的优先级顺序
Accept-Language
告知服务器用户代理能够处理的自然语言集(指中文或英文等),以及自然语言集的相对优先级
Authorization
用来告知服务器,用户代理的认证信息(证书值)
Expect
- 告知服务器,期望出现的某种特定行为。
- 因服务器无法理解客户端的期望作出回应而发生错误时,会返回状态码417Expectation Failed。
From
告知服务器使用用户代理的用户的电子邮件地址
Host
告知服务器,请求的资源所处的互联网主机名和端口号
If-xxx样式–条件要求
服务器接收到附带条件的请求后,只有判断指定条件为真时,才会执行请求。
If-Match
If-Modified-Since
用于确认代理或客户端拥有的本地资源的有效性。获取资源的更新日期时间If-None-Match
If-Range
If-Unmodified-Since
与首部字段If-Modified-Since的作用相反。
如果在指定日期时间后发生了更新,则以状态码412 Precondition Failed作为响应返回。
Max-Forwards
Proxy-Authorization
告知服务器认证所需要的信息
Range
告知服务器资源的指定范围
- 接收到附带Range首部字段请求的服务器,会在处理请求之后返回状态码为206 Partial Content的响应。
- 无法处理该范围请求时,则会返回状态码200 OK的响应及全部资源。
Referer
告知服务器请求的原始资源的URI。
TE
告知服务器客户端能够处理响应的传输编码方式及相对优先级
User-Agent
用于传达浏览器的种类。—将创建请求的浏览器和用户代理名称等信息传达给服务器。
3.2.4响应首部字段
Accept-Ranges
告知客户端服务器是否能处理范围请求,以指定获取服务器端某个部分的资源。
Age
- 告知客户端,源服务器在多久前创建了响应。字段值的单位为秒。
- 若创建该响应的服务器是缓存服务器,Age值是指缓存后的响应再次发起认证到认证完成的时间值。
- 代理创建响应时必须加上首部字段Age。
ETag
- 告知客户端实体标识
- 它是一种可将资源以字符串形式做唯一性标识的方式。服务器会为每份资源分配对应的ETag值。
- 强ETag值:不论实体发生多么细微的变化都会改变其值。
- 弱ETag值:只用于提示资源是否相同。只有资源发生了根本改变,产生差异时才会改变ETag值。这时,会在字段值最开始处附加W/。
例:ETag:W/“usag-1234”
Location
将响应接收方引导至某个与请求URI位置不同的资源
Proxy-Authenticate
- 由代理服务器所要求的认证信息发送给客户端
- 客户端与服务器之间进行认证时,首部字段WWW-Authorization有着相同的作用。
Retry-After
- 告知客户端应该在多久之后再次发送请求
- 主要配合状态码503 ServiceUnavailable响应,或3xx Redirect响应一起使用。
Server
告知客户端当前服务器上安装的HTTP服务器应用程序的信息
Vary
- 当代理服务器接收到带有Vary首部字段指定获取资源的请求时,如果使用的Accept-Language字段的值相同,那么就直接从缓存返回响应。
- 反之,则需要先从源服务器端获取资源后才能作为响应返回
3.2.5实体首部字段
Allow
- 通知客户端能够支持Request-URI指定资源的所有HTTP方法
- 当服务器接收到不支持的HTTP方法时,会以状态码405 MethodNot Allowed作为响应返回
- 与此同时,还会把所有能支持的HTTP方法写入首部字段Allow后返回。
Allow : GET, HEAD
Content-xxx类型
- Content-Encoding
告知客户端服务器对实体的主体部分选用的内容编码方式
Content-Encoding:gzip
- Content-Language
告知客户端,实体主体使用的自然语言
Content-Language:zh-CN
- Content-Length
表明了实体主体部分的大小(单位是字节)
!! 对实体主体进行内容编码传输时,不能再使用Content-Length首部字段
Content-Length:15000
- Content-Location
给出与报文主体部分相对应的URI,表示报文主体返回资源对应的URI。
Content-Location:http://www.hackr.jp/index-ja.html
Content-MD5
Content-MD5是一串由MD5算法生成的值,其目的在于检查报文主体在传输过程中是否保持完整,以及确认传输到达。Content-Range
告知客户端作为响应返回的实体的哪个部分符合范围请求Content-Type
说明了实体主体内对象的媒体类型.和首部字段Accept一样,字段值用type/subtype形式赋值。
Expires
将资源失效的日期告知客户端
Expires:Wed,04 Jul 2012 08:c26:05 GMT
Last-Modified
指明资源最终修改的时间
Last-Modified : Wed, 23 May 2012 09:59:55
GMT
3.3为Cooike服务的首部字段
Set-Cookie
Set-Cooike : status=enable ; expires=Tue, 05 Jul 2011 07:26:31 GMT; => path=/ ; domain=.hacker.jp
当服务器准备开始管理客户端的状态时,会事先告知各种信息。
Cookie
Cooike : status=enable
首部字段Cookie会告知服务器,当客户端想获得HTTP状态管理支持时,就会在请求中包含从服务器接收到的Cookie。接收到多个Cookie时,同样可以以多个Cookie形式发送。
其他首部字段
●X-Frame-Options—防止点击劫持(clickjacking)攻击。
●X-XSS-Protection—针对跨站脚本攻击(XSS)的一种对策,用于控制浏览器XSS防护机制的开关。
0 :将XSS过滤设置成无效状态
1 :将XSS过滤设置成有效状态
●DNT—拒绝个人信息被收集,是表示拒绝被精准广告追踪的一种方法。
0 :同意被追踪
1 :拒绝被追踪
●P3P—(The Platform for Privacy Preferences,在线隐私偏好平台)技术
详细介绍点击这里
四、返回结果的HTTP状态码
大家是不是经常会遇到“404 Not Found”,这就是一直表示客户端错误的状态码。
可见状态码以3位数字和原因短语组成,而数字第一位指定了响应类别,后两位无分类。
类别 | 原因短语 | |
---|---|---|
1XX | Informational(信息性状态码) | 接收的请求正在处理 |
2XX | Success(成功状态码) | 请求正常处理完毕 |
3XX | Redirection(重定向状态码) | 需要进行附加操作以完成请求 |
4XX | Client Error(客户端错误状态码) | 服务器无法处理请求 |
5XX | Server Error(服务器错误状态码) | 服务器处理请求出错 |
下面是具有代表性的14个状态码
① 2XX成功
- 200 OK
表示从客户端发来的请求在服务器端被正常处理了。 - 204 No Content
该状态码代表服务器接收的请求已成功处理,但在返回的响应报文中不含实体的主体部分。另外,也不允许返回任何实体的主体。比如,当从浏览器发出请求处理后,返回204响应,那么浏览器显示的页面不发生更新。
一般在只需要从客户端往服务器发送信息,而对客户端不需要发送新信息内容的情况下使用。
- 206 Partial Content
该状态码表示客户端进行了范围请求,而服务器成功执行了这部分的GET请求。响应报文中包含由Content-Range指定范围的实体内容。
② 3XX重定向
- 301 Moved Permanently----永久性重定向
- 表示请求的资源已被分配了新的URI,以后应使用资源现在所指的URI。
- 通俗地说就是之前的网站因为某种原因需要移除掉,然后要到新的地址访问,是永久性的。
- 302 Found----临时性重定向
- 该状态码表示请求的资源已被分配了新的URI,希望用户(本次)能使用新的URI访问。
- 也就是之前的网站并没有被移除,你只是暂时不访问原来网站,临时移动到新位置。可能访问期限一到,即使你保存了新位置的地址,但还是只能访问原来的网站。(这种情况易发生网络劫持)
- 303 See Other
- 表示由于请求对应的资源存在着另一个URI,应使用GET方法定向获取请求的资源。
- 303状态码和302 Found状态码有着相同的功能,但303状态码明确表示客户端应当采用GET方法获取资源,这点与302状态码有区别。
例如:当使用POST方法访问CGI程序,其执行后的处理结果是希望客户端能以GET方法重定向到另一个URI上去时,此时服务器就会返回303状态码
4.307 Temporary Redirect
- 临时重定向。与302 Found有相同的含义。
- 尽管302标准禁止POST变换成GET,但实际使用时大家并不遵守。
- 而307会遵照浏览器标准,不会从POST变成GET。但是,对于处理响应时的行为,每种浏览器有可能出现不同的情况。
③ 4XX客户端错误
- 400 Bad Request
表示请求报文中存在语法错误 - 401 Unauthorized
- 表示发送的请求需要有通过HTTP认证(BASIC认证、DIGEST认证)的认证信息
- 若之前已进行过1次请求,则表示用户认证失败
- 当浏览器初次接收到401响应,会弹出认证用的对话窗口
- 403 Forbidden
表示对请求资源的访问被服务器拒绝了。且服务器端没有必要给出拒绝的详细理由 - 404 Not Found
表示服务器上无法找到请求的资源。除此之外,也可以在服务器端拒绝请求且不想说明理由时使用。
④ 5XX服务器错误
- 500 Internal Server Error
该状态码表明服务器端在执行请求时发生了错误。也有可能是Web应用存在的bug或某些临时的故障。 - 503 Service Unavailable
该状态码表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求
状态码和状况的不一致不少返回的状态码响应都是错误的,但是用户可能察觉不到这点。比如Web应用程序内部发生错误,状态码依然返回200
OK,这种情况也经常遇到。