图解HTTP-阅读笔记

一、 WEB及网络基础

1. TCP/IP的分层管理
  • 应用层

决定了向用户提供应用服务时通信的活动

  • 传输层

提供处于网络连接中两台计算机之间的数据传输

  • 网络层

处理网络上流动的数据包,数据包是网络传输的最小计数单位,该层规定了通过什么路径到达对方计算机并把数据包传输给对方

  • 数据链路层

用于处理链接网络的硬件部分

分层的好处:

  1. 当某个地方发生改变时,只需要修改相应的层
  2. 设计简单,分工明确
2. TCP/IP通信传输流

图解HTTP-阅读笔记_第1张图片

传输过程:

  1. 发送端的客户端在应用层发出HTTP请求
  2. 在传输层对数据进行分割打包
  3. 网络层增加通信目的地的MAC地址后转发给链路层
  4. 链路层发送数据
  5. 接收端服务器在链路层接收信息,按照顺序往上层传输,直到接收端应用层

图解HTTP-阅读笔记_第2张图片

发送端在层与层之间传输数据的过程中,经过一层就打上一层的标签,在接收端,每经过一层就把对应层的标签去除.(这种操作称为封装)

3. IP、TCP、DNS
  • IP协议

IP协议位于网络层,是负责传输的网络协议,IP是一种协议名称,不是IP地址

  • IP地址:节点被分配到的地址

  • MAC地址:网卡所属的固定地址

  • MAC地址可以和IP地址进行配对,但是IP地址可以更换,但是MAC地址不可以更换

IP之间的通信依赖MAC地址,在网络传输数据时,通常经过多台计算机和网络中转设备才能连接到对方,在中转时会利用下一中转设备的MAC地址来搜索下一个中转目标,这时会采用ARP协议(地址解析协议),通过ARP协议,使用对方IP地址来查询对应的MAC地址.

  • TCP协议

TCP位于传输层,提供可靠的字节流服务

  • 字节流服务:为了方便传输,将大报文分割成为以报文段为单位的数据包来进行管理
  • 可靠数据传输:准确的把数据传递给对方

为了确保能准确的把数据送到目标处,会有三次握手策略,在握手过程中使用了TCP标志:SYN和ACK

  1. 发送端在将协议包发送出去后,会发送一个SYN数据包
  2. 接收端接受到数据后,会回传一个SYN/ACK的数据包来传达确认信息
  3. 发送端最后发送一个ACK标志的数据包,表示握手结束(若是传输过程在某处中断,会重新按照相同的顺序来发送相同的数据包)

图解HTTP-阅读笔记_第3张图片

  • DNS服务

DNS服务位于应用层,提供域名到IP地址之间的解析服务

图解HTTP-阅读笔记_第4张图片

4. 各种协议与HTTP之间的关系

图解HTTP-阅读笔记_第5张图片

5. URI&URL
  • URI:统一资源标识符

URI(Uniform Resource Identifier)

  1. Uniform:规定统一的格式来处理不同类型的数据
  2. Resource:可标识的任何东西
  3. Identifier:表示可标识的对象

图解HTTP-阅读笔记_第6张图片

  • URL

二、简单的HTTP协议

  • HTTP协议用于客户端和服务器端之间的通信

在使用HTTP协议时,必须有一端是客户端,一端是服务器端

  • 发送请求的是客户端
  • 接受请求的是服务器端

在实际情况中,客户端与服务器端的角色可能会互换,但是从一条通信线路来说,客户端和服务器端的角色是确定的

  • 通过请求和响应的交换达成通信

协议规定,请求从客户端发出,最后由服务器端响应请求并返回

  • 从客户端开始建立通信
  • 服务器端在没有接受到请求之前不会发送响应

图解HTTP-阅读笔记_第7张图片

GET/index.htm HTTP/1.1

  • get:访问服务器的类型
  • index.htm:请求访问的资源对象
  • HTTP/1.1:HTTP版本号,提示客户端使用的HTTP协议功能

请求报文的组成

图解HTTP-阅读笔记_第8张图片

请求内容的响应结果

图解HTTP-阅读笔记_第9张图片

  • HTTP/1.1:服务器对应HTTP版本
  • 200 OK:是请求处理结果的状态码和原因短语
  • Date:创建响应的日期时间(是首部字段的一个属性)

图解HTTP-阅读笔记_第10张图片

  • HTTP是不保存状态的协议

HTTP是不保存状态的协议,即无状态协议,HTTP协议自身不对请求和响应之间的通信状态进行保存(即对请求和响应都不做持久化处理)

使用HTTP,每当有新的请求发送时,都会有对应的新的响应产生,协议之前不保存之前一切的请求和响应的信息(为了处理更多的事务,保证协议的可伸缩性)

  • 请求URI定位资源

当客户端请求访问资源而发送请求时,URI需要将作为请求报文中的请求URI包含在内,指定请求URI的方式有很多:

图解HTTP-阅读笔记_第11张图片

  • 告知服务器意图的HTTP方法

GET:获取资源,.请求访问已被URI识别的资源,指定的资源经过服务器端的解析后返回响应内容.

  • 举例:

图解HTTP-阅读笔记_第12张图片

POST:用来传输实体的主体,虽然GET也可以传输实体的主体,但是通常不使用GET来进行传输,而使用POST方法来进行传输,GET和POST功能类似,但是POST的主要目的不是获取响应的主体内容.

  • 举例:

图解HTTP-阅读笔记_第13张图片

PUT:用于传输文件,类似于FTP.

  • 请求的报文主体中包含文件的内容

  • 保存到请求的URI指定位置

  • 由于HTTP1.1的PUT方法自身不带有验证机制,任何人都可以上传文件,安全性存在问题,所以不经常使用

  • 举例:

图解HTTP-阅读笔记_第14张图片

HEAD:GET类似,但是不返回报文的主题部分,用于确认URI的有效性和资源的更新日期

  • 举例:

图解HTTP-阅读笔记_第15张图片

DELETE:删除文件,按照请求的URI删除指定资源,与PUT类似,不安全

  • 举例:

图解HTTP-阅读笔记_第16张图片

OPTIONS:询问支持的方法,询问针对请求URI指定的资源支持的方法

  • 举例:

图解HTTP-阅读笔记_第17张图片

TRACE:追踪路径

CONNECT:要求使用隧道协议连接代理,要求与代理服务器进行通信时建立隧道,用隧道协议进行TCP通信.主要使用SSL(Secure Sockets Layer 安全套接层)和TLS(Transport Layer Security 传输层安全)协议把通信内容加密后经网络隧道传输.

  • 请求格式

image-20220301211707502

  • 举例

image-20220301211728806

  • 使用方法下达命令

向URI指定的资源发送请求报文时,采用称为方法的命令,方法的作用在于,可以知情请求的资源按照期望产生某种行为.方法中有GET、PUT等

  • HTTP1.0和HTTP1.1支持的方法

图解HTTP-阅读笔记_第18张图片

  • 持久连接节省通信量

在HTTP协议的初始版本中每次进行通信都要断开一次TCP连接,在最初传输的文件都是很小的文件,但是随着现在HTTP的普及,文档中包含了大量的图片,当浏览一个包含多个页面的HTML时,在请求页面资源的同时,也会请求HTML中包含的其他资源,因此每次请求都会造成无谓的TCP连接断开,增加通信的开销.

图解HTTP-阅读笔记_第19张图片

图解HTTP-阅读笔记_第20张图片

  • 持久连接

为了解决上述问题,在HTTP/1.1和部分HTTP/1.0版本提出了持久连接的思想,也被称为HTTP keep-alive,持久连接的特点是,只要一端没有提出断开连接,则保持TCP连接状态.持久连接的好处在于减少了TCP重复链接和断开所造成的资源的额外开销,使用持久化连接,可以减少额外的开销,减轻服务器负担.

图解HTTP-阅读笔记_第21张图片

  • 管线化

持久化连接使得管线化的出现,之前发送一个请求,必须得到回应才会发送第二个请求,有了管线化技术,不用等待响应也可以发送下一个请求.

图解HTTP-阅读笔记_第22张图片

  • 使用Cookie的状态管理

由于HTTP协议是无状态协议,不对之前发生的请求和响应的状态进行管理,但是在进行WEB页面登录认证时,不记录当前的登录状态,每次跳转都需要重新登录,为了解决这个问题,提出了Cookie,Cookie会根据从服务端发送的响应报文中一个叫做Set-Cookie的首部字段信息,通知客户端保存Cookie,当客户端再次向服务端发送请求时,客户端会自动在请求报文中加入Cookie的值,再发送出去.

图解HTTP-阅读笔记_第23张图片

图解HTTP-阅读笔记_第24张图片

  • 请求报文(无Cookie)

image-20220302092353466

  • 响应报文(服务端生成的Cookie信息)

图解HTTP-阅读笔记_第25张图片

  • 请求报文(自动发送保存着的Cookie信息)

image-20220302092503617

三、HTTP报文内的HTTP信息

1. HTTP报文

用于HTTP协议交互的信息称为HTTP报文,请求端发送的称为请求报文,响应端发送的叫响应报文.

图解HTTP-阅读笔记_第26张图片

2. 请求报文跟响应报文的结构
  • 请求报文

图解HTTP-阅读笔记_第27张图片

图解HTTP-阅读笔记_第28张图片

请求报文的首部由以下信息组成:

  • 请求行:包含请求的方法、请求URI和HTTP版本

  • 首部字段:通用首部/请求首部/响应首部/实体首部

  • 响应报文

图解HTTP-阅读笔记_第29张图片

图解HTTP-阅读笔记_第30张图片

响应报文的首部

  • 状态行:包含表明响应结果的状态码,原因短语和HTTP版本
  • 首部字段:通用首部/请求首部/响应首部/实体首部
3. 编码提升传输速率

HTTP在传输数据时可以按照数据原貌传输,也可以在传输过程中通过编码来提高传输数据的速率.

  • 报文主体和实体主体的差异
  • 报文:HTTP通信中的基本单位,由8位组字节流组成,通过HTTP通信传输
  • 实体:作为请求或响应的有效荷载数据被传输,其内容由实体首部和实体主体组成

HTTP报文的主体用于传输请求或响应的实体主体,通常,报文主体等于实体主体,只有在传输中进行编码时,实体主体的内容发生变化,导致与报文主体产生差异.

  • 压缩传输的内容编码

内容编码指明应用在实体内容上的编码格式,并保持实体信息原样压缩,内容编码后的实体由客户端接受并按照编码格式进行解码.

图解HTTP-阅读笔记_第31张图片

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

  • gzip(GNU zip)
  • compress(UNIX系统标准压缩)
  • deflate(zlib)
  • identity(不进行编码)
  • 分割发送的分块传输编码

在HTTP通信时,请求的编码实体资源尚未全部传输完成之前,浏览器无法显示请求页面,传输大容量数据时,通过把数据分成多块,可以让浏览器逐步显示页面.把实体主体分块的功能称为分块传输编码.

图解HTTP-阅读笔记_第32张图片

分块传输编码会将实体主体分为多个块,每一块用十六进制来标记大小,在实体的最后一块会使用"0"来标记

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

HTTP协议采纳了多部分对象集合,发送一份报文主体内可以包含多类型实体(类如文本、图片等不同类型的实体)

  • multipart/form-data:在web表单文件上传时使用

图解HTTP-阅读笔记_第33张图片

在HTTP报文中使用多部分对象集合时,需要在首部字段中加上content-type.使用boundary字符串来划分多部分对象集合指明的各类实体

  • multipart/byteranges:状态码206,响应报文包含了多个范围的内容时使用
5. 获取部分内容的范围请求

指的是从之前下载中断处恢复下载,来避免过去因为网速慢,容易断网而导致的下载中断的问题.

图解HTTP-阅读笔记_第34张图片

在执行请求范围时,会用到首部字段Range来指定资源的byte范围:

  • 5001-10000字节:Range:bytes=5001-10000
  • 从5001到结尾:Range:bytes=5001-
  • 从一开始到3000,从5000到7000:Range:bytes=0-3000,5000-7000

如果服务器端无法响应范围请求,回返回状态码200 OK和完整的实体内容

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

当一个页面存在多种内容,例如一个页面有英文版和中文版,当浏览器默认语言是英文时,返回英文版,当默认是中文时,返回中文版,这种机制称为内容协商.

内容协商机制是指客户端和服务器端就响应的资源进行交涉.提供给客户端最合适的资源,内容协商会以响应资源的语言、字符集、编码方式等作为判断的基准.

以下首部字段为判断的基准

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

内容协商技术分为以下三种

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

由服务器端进行内容协商,以请求的首部字段作为参考,服务端自动处理

  • 客户端驱动协商(Agent-driven Nagotiation)

由客户端进行内容协商,用户可以从浏览器显示的可选项目列表中进行手动选择,还可以了用JavaScript脚本的方式在Web页面上自动进行上述选择

  • 透明协商(Transparent Negotiation)

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

四、返回结果的HTTP状态码

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

HTTP状态码负责表示客户端HTTP请求的返回结果,标记服务器端处理是否正常,借助状态码,用户可以知道服务器端是正常处理了请求还是出现了错误.

2. 2xx 成功
  • 200 OK

表示客户端的请求被服务端正常处理了

  • 204 No Content

表示服务器接受的请求以处理成功,但是返回的响应报文中不包含实体的主体部分,也不返回任何实体的主体.例如:在浏览器发送请求后,返回204,那么浏览器页面不需要更新

在客户选往服务器端发送信息,而对客户端不需要发送新信息内容的情况下使用.

  • 206 Partial Content

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

3. 3xx 重定向

3xx表示浏览器需要执行某些特殊的处理以正确的处理请求

  • 301 Moved Permanently

永久性重定向,表示请求的资源已经被分配了新的URI,以后使用的资源应该指向新的URI.

  • 302 Found

临时重定向,表示请求的资源已经被分配了新的URI,希望用户本次能够使用新的URI访问.302与301相似,但是301是永久的改变,302是临时的改变以后还可能继续发生改变.

  • 303 See Other

表示请求的对应资源存在另一个新的URI,应使用GET方法定向获取请求的资源.302与303具有相似的功能,但是303明确表示客户端应采用GET方法获取资源.

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

  • 304

该状态码表示客户端发送附带条件的请求时,服务端允许访问资源,但因发生请求未满足条件的情况后,直接返回304 Not Modified(服务端的资源未改变,可以直接使用客户端未过期的缓存).304状态码返回时,不包含响应的任何主体部分

  • 307 Temporary Redirect

临时重定向,该状态码与302意义相同,307会按照浏览器标准不会将POST改为GET

4. 4xx 客户端错误
  • 400 Bad Request

表示请求的报文中存在语法错误.当错误发生时,需修改请求的内容后再次发送请求

  • 401 Unauthorized(未经授权)

表示发送的请求需要通过HTTP认证(BASIC认证、DIGEST认证)的认证信息,若之前已经发起过一次请求,则表示用户认证失败.

图解HTTP-阅读笔记_第35张图片

返回含有401的响应必须包含一个适用于被请求资源的WWW-Authenticate首部用以质询用户信息.浏览器初次接收到401响应,会弹出认证用的对话窗口.

  • 403 Forbidden

请求资源的访问被服务器拒绝了.

  • 404 Not Found

服务器上无法找到请求的资源,也可以在服务器拒绝访问但是不想说明理由时使用

5. 5xx 服务器错误
  • 500 Intermal Server Error

服务端在执行请求时发生了错误,可能是web服务器存在bug

  • 503 Service Unavaliable

表示服务端暂时处于超负荷或者停机维护的状态,目前无法处理请求

五、与HTTP协作的Web服务器

1. 代理

代理服务器的作用是接受客户端发送的请求后转发到其他服务器,代理不会改变请求URI,会直接发送给持有资源的目标服务器,持有资源的被称为源服务器,由源服务器返回的响应经过代理服务器后再传递给客户端.

图解HTTP-阅读笔记_第36张图片

在HTTP通信的过程中,可级联多台代理服务器,请求和转发会经过数台类似锁链一样连接起来的代理服务器,在转发时,需要附加Via首部字段标记出经过的主机信息.

使用代理服务器的理由有:利用缓存技术减少网络带宽的流量,组织针对特定网站的访问控制,以获取日志为主要目的等.

代理的两种方式:

  • 缓存代理

代理转发响应的时候,缓存代理会预先将资源的副本缓存在代理服务器上,当代理再次接收到对应的资源请求时,可以不从源服务器中获取资源,而是将之前缓存的资源作为响应返回.

  • 透明代理

转发请求或者响应的时候.不对报文做任何加工的代理类型被称为透明代理,反之,对报文内容进行加工的代理被称为非透明代理

2. 网关

图解HTTP-阅读笔记_第37张图片

注:利用网关可以将由HTTP请求转化为其他协议通信

网关的工作机制与代理十分相似,但是网关能使通信线路上的服务器提供非HTTP协议服务,利用网关能提高通信的安全性,因为可以在客户端和网关之间的通信线路上加密以确保安全.

3. 隧道

隧道可以按照要求建立起一条与其它服务器通信的线路,可以使用SSL等加密手段进行通信,隧道的目的是确保客户端能与服务器进行安全的通信,

图解HTTP-阅读笔记_第38张图片

4. 保存资源的缓存

图解HTTP-阅读笔记_第39张图片

缓存服务器的优势在于利用缓存可以避免多次从源服务器转发资源,因此客户端就可以从缓存服务器上获取资源,源服务器不必多次处理相同的请求.

  • 缓存的有效期限

图解HTTP-阅读笔记_第40张图片

  • 客户端的缓存

缓存不仅存在于缓存服务器中,还存在在客户端浏览器中,与缓存代理类似,判定缓存过期后,会向源服务器确认资源的有效性,若缓存失效,浏览器会重新请求资源

六、HTTP首部

1. HTTP报文首部

图解HTTP-阅读笔记_第41张图片

  • HTTP请求报文

在请求中,HTTP报文由:

  1. 方法
  2. URI
  3. HTTP版本
  4. HTTP首部字段等部分构成

图解HTTP-阅读笔记_第42张图片

  • HTTP响应报文

在响应中,HTTP报文由:

  1. HTTP版本号
  2. 状态码
  3. HTTP首部字段3部分组成

图解HTTP-阅读笔记_第43张图片

2. HTTP首部字段
  • HTTP首部字段传递重要信息

使用首部字段是为了给浏览器和服务器提供报文主体大小、所使用的语言、认证信息等内容

  • HTTP首部字段结构

首部字段名:字段值1,字段值2…

  • 4种HTTP首部字段类型
  1. 通用首部字段:请求报文和响应报文两方都会使用的首部
  2. 请求首部字段:从客户端向服务器端发送请求报文时使用的首部.补充了请求的附加内容、客户端信息、响应内容等相关优先级信息
  3. 响应首部字段:从服务器向客户端返回响应报文时使用的首部.补充了响应的附加内容,也会要求客户端附加额外的内容信息.
  4. 实体首部字段:针对请求和响应的报文实体部分使用的首部,补充了资源内容更新时间等与实体有关的信息
  • HTTP/1.1 首部字段一览
  1. 通用首部字段

图解HTTP-阅读笔记_第44张图片

  1. 请求首部字段

图解HTTP-阅读笔记_第45张图片

  1. 响应首部字段

图解HTTP-阅读笔记_第46张图片

  1. 实体首部字段

图解HTTP-阅读笔记_第47张图片

  • 非HTTP/1.1首部字段
  1. Cookie
  2. Set-Cookie
  3. Content-Disposition
3. HTTP/1.1通用首部字段
  1. Catch-Control

通过指定首部字段Catch-Control,就能操作缓存的工作机制,指令参数可选,多个指令之间通过’,'分割

image-20220302164508287

  • 缓存请求指令

图解HTTP-阅读笔记_第48张图片

  • 缓存响应指令

图解HTTP-阅读笔记_第49张图片

表示是否能缓存的指令:

  1. public:明确表明其他用户也可以利用缓存

  2. private:响应只以特定用户作为对象,缓存服务器会对特定用户提供资源缓存服务,对于其他用户发送的请求,代理服务器则不会返回缓存

  3. no-catch:防止从缓存中返回过期的资源,客户端发送的请求中如果包含no-catch指令,则表示客户端不会接受缓存过的响应,中间的缓存服务器必须把客户端的请求转发给源服务器.如果服务器返回的响应中包含no-catch指令,那么缓存服务器不能对资源进行缓存,源服务器也不会对缓存服务器请求中提出的"资源有效性"进行确认,并且禁止其对响应资源进行缓存操作,在服务器返回的响应中,如果报文首部字段Catch-Control中对no-catch字段名具体指定参数,那么客户端在接收这个被指定的参数值的首部字段对应的响应报文后,就不能使用缓存,对无参数的首部字段可以使用缓存

图解HTTP-阅读笔记_第50张图片

控制可执行缓存的对象的指令:

  1. no-store:使用no-store指令时,表示请求和对应的响应中包含机密信息,因此该指令规定不能在本地存储缓存请求和响应的任一部分.

指定缓存期限和认证的指令:

  1. max-age(单位:秒):当客户端发送的请求中包含max-age指令时,如果判定缓存时间数值比指定的时间数值小,那么服务端就接收缓存的资源,当指定max-age为0时,那么缓存服务器会将请求转发给服务器.当服务器返回的响应中包含max-age指令的时候,缓存服务器不再对资源有效性做确认,而max-age数值代表资源保存为缓存的最长时间.

图解HTTP-阅读笔记_第51张图片

  1. s-maxage:功能与max-age相似,但是s-maxage只适用于供多位用户使用的公共缓存服务器.

  2. min-fresh:要求缓存服务器返回在接下来min-fresh指定的时间内还未超过有效期限的资源.例如:当min-fresh指定为60秒,在接下来60秒内超过有效期的资源就无法作为响应返回.

  3. max-stable:表示即使缓存资源过期,也照常接收,如果max-stable没有指定值,那么不管过了多久,客户端都会接受

  4. only-if-cached:要求缓存服务器不重新加载响应,也不会确认资源有效性,当发生请求的缓存服务器的本地缓存无响应,则返回504

  5. must-revalidate:代理会向源服务器再次验证即将返回的响应缓存目前是否有效,若代理无法连通源服务器获取有效资源的话,会给客户端返回504,使用must-revalidate会忽略max-stale.

  6. proxy-revalidate:要求所有缓存服务器在返回包含该指令请求之前,必须再次验证缓存的有效性

  7. no-transforme:无论是在请求或者响应中,缓存都不能改变实体主体的媒体类型,这样可以防止缓存或代理压缩图片等类似的操作.

Catch-Controller扩展:

  1. Catch-extension token:通过该指令可以扩展Catch-Control的首部字段内指令,例如在Catch-Control中没有community这个指令,可以借助extension tokens实现指令的添加,如果缓存服务器不能理解community这个命令,那么会直接忽略该指令
  1. Connection

Connection首部字段具有以下作用:

  1. 控制代理不再转发的首部字段

图解HTTP-阅读笔记_第52张图片

  1. 管理持久化连接

在HTTP/1.1版本默认都是持久化连接,客户端会在持久连接上连续发送请求.当服务器明确向断开连接时,则指定Connection首部字段的值为Close.

图解HTTP-阅读笔记_第53张图片

在HTTP/1.1之前的版本的默认连接都是非持久连接,在旧版本的HTTP中保持持续连接,需要指定Connection首部字段的值为Keep-Alive.

图解HTTP-阅读笔记_第54张图片

  1. Date:表明创建HTTP报文的日期和时间

  2. Pragma

是HTTP/1.1之前版本的历史遗留字段,作为与HTTP/1.0的向后兼容而定义.

Pragma:no-cache

与Catch-Control:no-catch作用相似,要求中间服务器不返回缓存的资源,由于个中间服务器之间使用的HTTP协议版本可能不是一致的,因此会在发送的请求中同时添加:

Pragma:no-catch

Catch-Control:no-catch

  1. Trailer

首部字段Trailer会事先说明在报文主体后记录了哪些首部字段.该首部字段可以应用在HTTP/1.1版本分块传输编码时.

图解HTTP-阅读笔记_第55张图片

指定首部字段Trailer的值为Expires后,在报文主题之后出现首部字段Expires.

  1. Transfer-Encoding

规定传输报文主体时采用的编码方式.HTTP/1.1的传输编码方式仅对分块传输编码有效.

  1. Upgrade

用于检测HTTP协议及其他协议是否可使用更高的版本进行通信,其参数值可以用来指定一个完全不相同的协议.

图解HTTP-阅读笔记_第56张图片

在上图中Upgrade指定的值为TLS/1.0,Connection值被指定为Upgrade.Upgrade首部字段产生作用的Upgrade对象仅限于客户端和临界服务器之间,因此,使用首部字段Upgrade时,还需要额外指定Connection:Upgrade3

  1. Via

为了追踪客户端与服务器之间的请求和响应报文的传输路径,当报文经过代理或者网关时,会在Via中添加该服务器的信息,然后在进行转发

图解HTTP-阅读笔记_第57张图片

在上图经过服务器A时,在Via中添加了"1.0 gw.hackr.jp(Squid/3.1)",其中1.0表示了代理服务器上使用的HTTP版本.

Via首部是为了追踪传输路径,经常和TRACE方法一起使用,例如代理服务器接收由TRACE方法发送过来的请求(Max-Forwards为0时),代理服务器就不再转发此请求,会将自身信息附加到via首部后,返回该请求的响应.

  1. Warning

Warning首部是从HTTP/1.0的响应首部(Retry-After)演变过来的,会用来告知用户一些与缓存相关问题的警告.

Warning首部格式:

Warning:[警告码][警告的主机端口号]"[警告内容]"([日期时间])

在HTTP/1.1中有七种警告:

图解HTTP-阅读笔记_第58张图片

4. 请求首部字段

请求首部字段是客户端往服务端发送请求报文所使用的字段,用于补充请求的附加信息、客户端信息、对响应内容的优先级等内容.

  • Accept

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

文本文件:

  1. text/html,text/plain,text/css
  2. application/xhtml+xml,application/xml

图片文件:

  1. image/jpeg,image/gif,image/png

视频文件:

  1. video/mpeg,video/quicktime

应用程序的二进制文件:

  1. application/octet-stream,application/zip

增加优先级:使用"q=“来额外的表示权重值,用”;"进行分隔,权重值q的范围是0~1,1为最大值,不指定权重值q时,默认权重值q=1.0.

  • Accept-Charset

图解HTTP-阅读笔记_第59张图片

Accept-Charset:iso-8859-5,unicode-1-1;q=0.8

通知服务器,用户代理支持的字符集以及想对应的优先顺序,一次性可以指定多个字符集,权值指定与Accept相同,该首部字段应用于内容协商机制的服务器驱动协商.

  • Accept-Encoding

图解HTTP-阅读笔记_第60张图片

Accept-Encoding:gzip,deflate

告诉服务器,用户代理支持的内容编码以及内容编码的优先级.

identity:表示不执行压缩或不会改变的默认编码格式

  • Accept-Language

图解HTTP-阅读笔记_第61张图片

Accept-Language:zh-cn,zh;q=0.7,en-us,en;q=0.3

告诉服务器用户能处理的自然语言集,以及对应的优先级

  • Authorization

图解HTTP-阅读笔记_第62张图片

用来告知服务器,用户代理的认证信息.通常,想要通过服务器认证的用户代理会在接收到返回的401状态码响应后,把首部字段Authorization加入到请求中,共用缓存在接收到含有Authorization首部字段的请求时的操作处理会略有差异.

  • Expect

Except:100-continue

客户端使用首部字段Except来告知服务器,期望出现的某种特定的行为,因服务器无法理解客户端的期望,做出回应而发生错误时,回返回状态码417Expectation Failed.客户端可以利用该首部字段写明所期望的扩展,尽管HTTP/1.1只定义了100-continue.

  • From

image-20220303091251407

使用From告知服务器使用用户代理的用户电子邮箱地址,使用代理时,尽可能包含From首部字段,但是可能会因为代理不同,将电子邮件地址记录在User-Agent中

  • Host

图解HTTP-阅读笔记_第63张图片

当一台服务器中有多个虚拟主机,使用首部字段Host加以区分.首部字段Host会告知服务器,请求的资源所处的互联网主机名和端口号.当请求被发送至服务器时,请求中的主机名会用IP地址直接替换解决,如果相同的IP下面运行着多个域名,那么服务器无法理解究竟是哪个域名对应的请求,因此就需要使用首部字段Host来明确指出请求的主机名,若服务器没有设置主机名,那么直接发送一个空值即可.

  • if-Match

if-xxx这种形式的请求首部字段,都可以称为条件请求,服务器接收附带的条件请求后,判断为真,才会执行请求.

图解HTTP-阅读笔记_第64张图片

当if-Match的字段值跟ETag值匹配一致时,服务器才会接受请求.也可以使用星号指定if-Match的字段值,针对这种情况,只要资源存在就处理请求.

  • if-Modified-Since

图解HTTP-阅读笔记_第65张图片

在if-Modified-Since字段指定的日期之后,资源发生了更新,服务器会接受请求.

if-Modified-Since用于确认代理或者客户端拥有的本地资源的有效性.获取资源的更新日期时间可通过首部字段Last-Modified

  • if-None-Match

图解HTTP-阅读笔记_第66张图片

只有在if-None-Match的字段值与ETag的值不一样时,可以处理该请求,与if-Match相反.

  • if-Range

图解HTTP-阅读笔记_第67张图片

首部if-Range属于附带条件之一,他告知服务器若指定的if-Range字段值(ETag值或者时间)和请求资源的ETag值或时间相一致时,则作为范围请求处理,反之,返回全体资源.

图解HTTP-阅读笔记_第68张图片

  • if-Unmodified-Since

与首部字段if-Modified-Since的作用相反,用来告诉服务器指定的请求资源只有在字段值指定的日期之后,未发生更新的情况下,才能处理请求,如果在指定日期时间后发生了更新,则以状态码412作为响应返回.

  • Max-Forwards

通过TRACE或者OPTIONS方法,发送含有首部字段Max-Forwards的请求,该字段以十进制整数指定可经过的服务器最大数目,在下一个服务器转发之前,Max-Forwards将会减1,当服务器收到的Max-Forwards的时候,则不再进行转发,而是直接返回响应

  • Proxy-Authorization

接收到从代理服务器发送来的认证质询的时候,客户端会发送包含首部字段Proxy-Authorization的请求,告诉服务器认证所需要的信息.

该行为与客户端和服务器之间的HTTP访问认证类似,不同之处在于,认证行为发生在客户端与代理服务器之间.客户端与服务器之间的认证,使用首部字段Authorization可以起到相同的作用.

  • Range:bytes=5001-10000

对于获取部分资源的请求,在首部字段Range中告知服务器资源的指定范围,服务器在处理附带Range字段的请求时,处理成功会返回206 ,处理失败会返回200 并将请求的资源整体返回

  • Referer

图解HTTP-阅读笔记_第69张图片

首部字段Referer会告知服务器请求的原始资源的URI.告诉服务器该网页是从哪个页面链接过来的,服务器因此可以获得一些信息用于处理。

  • TE

告诉服务器客户端能够处理响应的传输编码方式及相对优先级,和首部字段Accept-Encoding相似,但是有区别:

  1. TE:传输过程中的编码.
  2. Accept-Encoding:报文压缩使用的编码.
  3. Transfer-Encoding:仅仅对分块传输的编码有效.
  • User-Agent

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36Query String Parametersview sourceview URL-encoded

该字段会将创建请求的浏览器和用户代理名称等信息传递给服务器,

5. 响应首部字段

服务端向客户端返回报文所使用的字段,用于补充响应的附加信息、服务器信息,以及对客户端的附加请求等.

  • Accept-Range

用来告知客户端,服务器是否能处理范围请求以指定获取服务器端某个部分的资源.

字段值:

  1. bytes:表示可以处理范围请求
  2. none:不可以处理范围请求
  • Age

图解HTTP-阅读笔记_第70张图片

能够告诉客户端,源服务器在多久之前创建了响应,字段的单位值为秒.

如果创建该响应的是缓存服务器,Age是缓存后的响应再次发起认证到认证完成的时间值,代理创建响应时必须加上首部字段Age.

  • ETag

图解HTTP-阅读笔记_第71张图片

首部字段ETag能告知客户端实体标识.它是一种可以将资源以字符串形式做唯一标识的方式,服务器会为每一份资源分配对应的ETag值.当资源更新时,ETag值也需要更新.

  1. 强ETag值:不论实体发生多么细微的变化都会改变其值.

image-20220303111000964

  1. 弱ETag值:只是用于提示资源是否相同,只有资源发生了根本的幻化,产生差异时才会改变TEag值,这时会在字段最开始处附加W/.

image-20220303111028718

  • Location

图解HTTP-阅读笔记_第72张图片

可以将响应接收方引导至某个请求与URI位置不同的资源,基本上,该字段会配合3xx : Redirection 的响应,提供重定向的URI.

几乎所有浏览器接收到首部字段Location的响应后,都会强制性地尝试对重定向资源的访问.

  • Proxy-Authenticate

首部字段Proxy-Authenticate会把代理服务器所要求的认证信息发送给客户端.这种认证发生在客户端与代理之间

  • Retry-After

告诉客户端应该在多久之后再次发送请求,主要配合503或者3xx使用,返回格式可以为具体的日期,也可以是创建响应后的秒数.

  • Server

告知客户端当前服务器上安装的HTTP服务器应用程序信息,不仅有软件应用名称,还可能有版本号和安装时启用时间等信息.

  • Vary

当代理服务器接收到带有Vary首部字段指定获取资源的请求时,如果Accept-Language一致,直接从缓存响应,反之需要先从源服务器获取资源之后才能作为响应返回

  • WWW-Authenticate

该字段用于HTTP访问认证,告知客户端适用于请求访问资源的认证方案,和带参提示的质询.状态码401Unauthorized响应中,肯定带有该首部字段.

6. 实体首部字段

实体首部字段是包含在请求报文和响应报文中的实体部分所使用的首部字段,用于补充内容的更新时间等与实体相关信息.

  • Allow

图解HTTP-阅读笔记_第73张图片

Allow用于通知客户端能够支Request-URI指定资源的所有HTTP方法.当服务器收到不支持的HTTP方法,回返回405 Method Not Allowed作为响应,同时会将能够使用的方法放在Allow首部字段中返回.

  • Content-Encoding

使用该字段告知客户端,服务器对实体的主题部分使用的内容编码方式.

内容编码是指在不丢失实体信息的前提下进行的压缩.

4中内容编码方式:

  1. gzip
  2. compress
  3. deflate
  4. identity
  • Content-Language

告知客户端,实体主体使用的自然语言

  • Content-Length

表明实体主体部分的大小(使用的单位是字节),对实体内容进行编码传输时,不再使用Content-Length字段

  • Content-Location

首部字段Content-Location与给出与报文主体部分对应的URI,和首部字段不同,Content-Location表示的是报文主体返回资源对应的URI.

  • Content-MD5

图解HTTP-阅读笔记_第74张图片

客户端会对接收的报文主体执行相同的MD5算法,然后与首部字段的Content-MD5做比较,目的在于检验报文主体在传输过程中是否保持完整,以及确认传达的目的.

流程:

  1. 服务器对报文主体执行MD5算法获得128位二进制数
  2. 通过Base64将结果写入Content-MD5字段值(因为HTTP首部无法记录二进制值,所以要通过Base64处理)
  3. 客户端接收后,会对报文执行相同的MD5算法,保证报文的准确性

但是在对报文进行篡改的同时也可以对计算的MD5值进行篡改,所以,用处不大

  • Content-Range

图解HTTP-阅读笔记_第75张图片

针对请求返回,返回响应时使用Content-Range字段,告知客户端作为响应返回的实体哪个部分符合范围要求,字段值以字节为单位,表示当前发送部分以及整个实体的大小.

  • Content-Type

说明实体主体内对象的媒体类型,和首部字段Accept一样,字段值用type/subtype形式赋值.

  • Expires

将资源失效日期告诉客户端,缓存服务器在接收到含有Expires的响应后,会以缓存来应答请求,在Expires字段指定的时间之前,响应的副本会一直被保存,当超过指定时间后,缓存服务器在请求发送过来时,会转向源服务器请求资源.当源服务器不希望缓存服务器对资源进行缓存时,在Expires字段内写入与首部字段Data相同的时间值.

对于首部字段Catch-Control的max-age指令与Expires相遇时,会优先处理max-age

  • Last-Modified

指明资源最终的修改时间

7. 为Cookie服务的首部字段

Cookie的工作机制是用户识别及状态管理.

图解HTTP-阅读笔记_第76张图片

  • Set-Cookie

Set-Cookie字段的属性

图解HTTP-阅读笔记_第77张图片

  • expires

指定Cookie的有效期,当省略该属性时,其有效期仅限于维持浏览器会话时间段内,仓Cookie发送至客户端,服务器端就不可以存在显式的删除Cookie的方法,但是可以通过覆盖已过期的Cookie,实现对客户端Cookie的实质性删除操作.

  • Cookie

image-20220304154643337

首部字段Cookie会告诉服务器,当客户端想要获取多个HTTP状态管理支持时,就会在请求中包含从服务器接收到的Cookie,接收到多个Cookie时,同样可以以多个Cookie形式发送.

七、 确保Web安全的HTTPS

1. HTTP的缺点:
  • 通信使用明文(不加密),内容可能会被窃听

加密处理防止被窃听:

  1. 通信加密:使用SSL或TLS的组合使用,加密HTTP的通信内容,与SSL组合使用的称为HTTPS或HTTP over SSL.
  2. 内容的加密:将通信内容本身加密的方式
  • 不验证通信方身份,可能遭遇伪装

HTTP的请求和响应不会对通信双方进行确认,存在"服务器是否是请求的URI中指定的服务器"和"返回的响应是否真的返回到请求的客户端"等问题.

  • 无法证明报文完整性,报文有可能已经被篡改
  1. 接收的内容可能有错误
2. HTTP+加密+认证+完整性保护=HTTPS
  1. HTTP+加密处理和认证以及完整性保护后=HTTPS

图解HTTP-阅读笔记_第78张图片

  1. HTTPS是身披SSL外壳的HTTP

图解HTTP-阅读笔记_第79张图片

  1. 相互交换密钥的公开密钥加密技术
  • 共享密钥加密的困境

加密和解密使用一个密钥,使用该方法时必须将密钥也发送给对方,但是如果在发送密钥时,密钥落入攻击者手中,那么失去了加密的意义.

图解HTTP-阅读笔记_第80张图片

图解HTTP-阅读笔记_第81张图片

  • 使用两把公开密钥加密

发送密文的一方使用接收密文一方的公开密钥加密,接收方收到文件后使用自己的私钥解密.

图解HTTP-阅读笔记_第82张图片

  • HTTPS采用混合加密机制

在密钥交换环节使用公开密钥加密,在建立通信,交换报文阶段使用共享密钥加密.

图解HTTP-阅读笔记_第83张图片

  • 证明公开密钥正确性的证书

公开密钥的加密方式存在问题,因为无法保证接收到的公开密钥就是原本预想的那台服务器发行的公开密钥.为解决这个问题,可以使用数字证书认证机构(CA)和其相关机关颁发的公开密钥证书

图解HTTP-阅读笔记_第84张图片

  • 证明组织真实性的EV SSL证书
  • 用以确认客户端的客户端证书
  • HTTPS的安全通信机制

图解HTTP-阅读笔记_第85张图片

(一)客户端发送Client Hello 报文开始SSL通信,报文中包含客户端支持的SSL的指定版本,加密组件(CipherSuite)列表(所使用的加密算法及密匙长度等),服务器进行SSL通信时,会以Server Hello报文作为应答,和客户端一样(包含SSL版本等),服务器的加密组件内容是从接受到的客户端加密组件内筛选来的。之后服务器发送Certficate报文(包含公开密匙证书),最后服务器发送Server Hello Done报文通知客户端,最初的SSL握手协商部分结束。
(二)第一次握手结束之后,客户端以Client Key Exchange 报文作为回应。报文中包含通信加密中使用的(Pre-master-secret)的随机密码串,继续发送Change Cipher Sper报文,该报文提示服务器,通信采用Pre-master-secret密匙加密。客户端发送Finished报文(含连接至今全部报文的整体校验值),服务器能够正确解密该报文,说明握手协商成功。
(三)服务器发送Change Cipher Spec 报文,服务器发送Finished报文,服务器和客户端的Finished报文交换完毕后,SSL连接建立完成。通信受到SSL保护,开始进行应用层协议的通信,即发送HTTP请求。最后又客户端断开连接,断开连接时,发送close_notify报文,在发送TCP FIN报文来关闭与TCP的通信。
在上述流程中,应用层会发送数据时会附加一种叫做MAC的报文摘要,MAC能够查知报文是否遭篡改,从而保护报文的完整性。

图解HTTP-阅读笔记_第86张图片

八、确认访问用户身份的认证

1. 认证

帮助服务器确认客户端是谁,会核对以下信息:

  1. 密码
  2. 动态令牌:本人持有设备的一次性密码
  3. 数字证书:本人终端持有的信息
  4. 生物认证:指纹、虹膜等信息
  5. IC卡:仅限本人持有的信息

HTTP使用的认证方式:

  1. BASIC认证(基本认证)
  2. DIGEST认证(摘要认证)
  3. SSL客户端认证
  4. FormBase认证(基于表单的认证)
2. BASIC认证

步骤:

图解HTTP-阅读笔记_第87张图片

3. DIGEST认证

图解HTTP-阅读笔记_第88张图片

图解HTTP-阅读笔记_第89张图片

4. SSL客户端认证

认证步骤:

  1. 接收到认证资源的请求,服务器会发送Certificate Request报文,要求客户端提供客户端证书.
  2. 用户选择发送的客户端证书后,客户端会把客户端证书信息以Client Certificate报文方式发送给服务器.
  3. 服务器认证客户端证书,验证通过后,方可领取证书内客户端的公开密钥,然后开始HTTPS加密通信.

SSL客户端认证采用双因素认证:正常情况下,SSL客户端认证不仅使用证书认证,还会使用基于表单的认证,双因素认证指的是,认证过程总不仅仅使用密码,还需要认证者提供其他持有信息,作为另一个因素.第一个认证因素的SSL客户端证书用来认证客户端计算机,另一个认证因素的密码则用来确认是用户本人的行为.

九、 基于HTTP的功能追加的协议

1. 消除HTTP瓶颈的SPDY

由Google在2010年发布

HTTP存在的瓶颈:在微博等网站上,几乎能够实时观察到海量用户发布的内容,为了实时更新用户发布的内容,服务器一更新,就需要把内容更新到用户界面,HTTP无法处理好这项任务,因为:

  1. 一个连接只可发送一个请求
  2. 请求只能从客户端开始,客户端不能接收除响应以外的指令
  3. 请求/响应的首部未经压缩就发送,首部信息越多,延迟就越大
  4. 发送冗余的首部,每次发送相同的首部造成的资源浪费很多
  5. 可任意选择数据压缩格式,非强制压缩发送

图解HTTP-阅读笔记_第90张图片

  • Ajax解决方法

Ajax:Asynchronous JavaScript and XML,异步JavaScript与XML技术

是一种利用JavaScript和DOM(Document Object Model,文档对象模型)的操作,达到局部web页面加载替换的异步通信手段.因为更新部分页面,所有传输的数据量减少.

Ajax的核心技术是名为XMLHttpRequest的API,但是使用Ajax实时从服务器获取数据,可能会导致大量请求的发生,Ajax仍未解决HTTP协议本身存在的问题.

图解HTTP-阅读笔记_第91张图片

  • Comet解决方法

步骤:

  1. 客户端向服务器端发送更新请求
  2. 服务端将更新请求挂起,等服务端有内容更新时,再返回给用户.

虽然可以实时更新,但是为了保留响应,会耗费更多的资源

图解HTTP-阅读笔记_第92张图片

  • SPDY

目标:解决HTTP的瓶颈

设计与功能:没有改写协议,只是在TCP/IP的应用与传输层之间增加会话层,在通信中使用SSL

图解HTTP-阅读笔记_第93张图片

加入SPDY后增加的功能:

  1. 多路复用流:单一TCP连接,可以无限处理多个HTTP请求
  2. 赋予请求优先级
  3. 压缩HTTP首部
  4. 推送功能:支持服务器主动向客户端推送数据
  5. 服务器提示功能:服务器可以主动提示客户端请求所需的资源

缺点:SPDY基本只是将单个域名的通信多路复用,当一个web网站使用多个域名下的资源,改善效果会受到限制.

2. 使用浏览器进行全双工通信的WebSocket

注:因为后面文字太多,不想打字了,所有没有记笔记,只是做了简单的浏览.

时间:2022年3月4日 18:12:48

你可能感兴趣的:(读书笔记,http,网络,网络协议)