一、 WEB及网络基础
1. TCP/IP的分层管理
决定了向用户提供应用服务时通信的活动
提供处于网络连接中两台计算机之间的数据传输
处理网络上流动的数据包,数据包是网络传输的最小计数单位,该层规定了通过什么路径到达对方计算机并把数据包传输给对方
用于处理链接网络的硬件部分
分层的好处:
- 当某个地方发生改变时,只需要修改相应的层
- 设计简单,分工明确
2. TCP/IP通信传输流
传输过程:
- 发送端的客户端在应用层发出HTTP请求
- 在传输层对数据进行分割打包
- 网络层增加通信目的地的MAC地址后转发给链路层
- 链路层发送数据
- 接收端服务器在链路层接收信息,按照顺序往上层传输,直到接收端应用层
发送端在层与层之间传输数据的过程中,经过一层就打上一层的标签,在接收端,每经过一层就把对应层的标签去除.(这种操作称为封装)
3. IP、TCP、DNS
IP协议位于网络层,是负责传输的网络协议,IP是一种协议名称,不是IP地址
IP之间的通信依赖MAC地址,在网络传输数据时,通常经过多台计算机和网络中转设备才能连接到对方,在中转时会利用下一中转设备的MAC地址来搜索下一个中转目标,这时会采用ARP协议(地址解析协议),通过ARP协议,使用对方IP地址来查询对应的MAC地址.
TCP位于传输层,提供可靠的字节流服务
- 字节流服务:为了方便传输,将大报文分割成为以报文段为单位的数据包来进行管理
- 可靠数据传输:准确的把数据传递给对方
为了确保能准确的把数据送到目标处,会有三次握手策略,在握手过程中使用了TCP标志:SYN和ACK
- 发送端在将协议包发送出去后,会发送一个SYN数据包
- 接收端接受到数据后,会回传一个SYN/ACK的数据包来传达确认信息
- 发送端最后发送一个ACK标志的数据包,表示握手结束(若是传输过程在某处中断,会重新按照相同的顺序来发送相同的数据包)
DNS服务位于应用层,提供域名到IP地址之间的解析服务
4. 各种协议与HTTP之间的关系
5. URI&URL
URI(Uniform Resource Identifier)
- Uniform:规定统一的格式来处理不同类型的数据
- Resource:可标识的任何东西
- Identifier:表示可标识的对象
二、简单的HTTP协议
在使用HTTP协议时,必须有一端是客户端,一端是服务器端
在实际情况中,客户端与服务器端的角色可能会互换,但是从一条通信线路来说,客户端和服务器端的角色是确定的
协议规定,请求从客户端发出,最后由服务器端响应请求并返回
- 从客户端开始建立通信
- 服务器端在没有接受到请求之前不会发送响应
GET/index.htm HTTP/1.1
- get:访问服务器的类型
- index.htm:请求访问的资源对象
- HTTP/1.1:HTTP版本号,提示客户端使用的HTTP协议功能
请求报文的组成
请求内容的响应结果
- HTTP/1.1:服务器对应HTTP版本
- 200 OK:是请求处理结果的状态码和原因短语
- Date:创建响应的日期时间(是首部字段的一个属性)
HTTP是不保存状态的协议,即无状态协议,HTTP协议自身不对请求和响应之间的通信状态进行保存(即对请求和响应都不做持久化处理)
使用HTTP,每当有新的请求发送时,都会有对应的新的响应产生,协议之前不保存之前一切的请求和响应的信息(为了处理更多的事务,保证协议的可伸缩性)
当客户端请求访问资源而发送请求时,URI需要将作为请求报文中的请求URI包含在内,指定请求URI的方式有很多:
GET:获取资源,.请求访问已被URI识别的资源,指定的资源经过服务器端的解析后返回响应内容.
POST:用来传输实体的主体,虽然GET也可以传输实体的主体,但是通常不使用GET来进行传输,而使用POST方法来进行传输,GET和POST功能类似,但是POST的主要目的不是获取响应的主体内容.
PUT:用于传输文件,类似于FTP.
HEAD:GET类似,但是不返回报文的主题部分,用于确认URI的有效性和资源的更新日期
DELETE:删除文件,按照请求的URI删除指定资源,与PUT类似,不安全
OPTIONS:询问支持的方法,询问针对请求URI指定的资源支持的方法
TRACE:追踪路径
CONNECT:要求使用隧道协议连接代理,要求与代理服务器进行通信时建立隧道,用隧道协议进行TCP通信.主要使用SSL(Secure Sockets Layer 安全套接层)和TLS(Transport Layer Security 传输层安全)协议把通信内容加密后经网络隧道传输.
向URI指定的资源发送请求报文时,采用称为方法的命令,方法的作用在于,可以知情请求的资源按照期望产生某种行为.方法中有GET、PUT等
在HTTP协议的初始版本中每次进行通信都要断开一次TCP连接,在最初传输的文件都是很小的文件,但是随着现在HTTP的普及,文档中包含了大量的图片,当浏览一个包含多个页面的HTML时,在请求页面资源的同时,也会请求HTML中包含的其他资源,因此每次请求都会造成无谓的TCP连接断开,增加通信的开销.
为了解决上述问题,在HTTP/1.1和部分HTTP/1.0版本提出了持久连接的思想,也被称为HTTP keep-alive,持久连接的特点是,只要一端没有提出断开连接,则保持TCP连接状态.持久连接的好处在于减少了TCP重复链接和断开所造成的资源的额外开销,使用持久化连接,可以减少额外的开销,减轻服务器负担.
持久化连接使得管线化的出现,之前发送一个请求,必须得到回应才会发送第二个请求,有了管线化技术,不用等待响应也可以发送下一个请求.
由于HTTP协议是无状态协议,不对之前发生的请求和响应的状态进行管理,但是在进行WEB页面登录认证时,不记录当前的登录状态,每次跳转都需要重新登录,为了解决这个问题,提出了Cookie,Cookie会根据从服务端发送的响应报文中一个叫做Set-Cookie的首部字段信息,通知客户端保存Cookie,当客户端再次向服务端发送请求时,客户端会自动在请求报文中加入Cookie的值,再发送出去.
三、HTTP报文内的HTTP信息
1. HTTP报文
用于HTTP协议交互的信息称为HTTP报文,请求端发送的称为请求报文,响应端发送的叫响应报文.
2. 请求报文跟响应报文的结构
请求报文的首部由以下信息组成:
-
请求行:包含请求的方法、请求URI和HTTP版本 -
首部字段:通用首部/请求首部/响应首部/实体首部
响应报文的首部
- 状态行:包含表明响应结果的状态码,原因短语和HTTP版本
- 首部字段:通用首部/请求首部/响应首部/实体首部
3. 编码提升传输速率
HTTP在传输数据时可以按照数据原貌传输,也可以在传输过程中通过编码来提高传输数据的速率.
- 报文:HTTP通信中的基本单位,由8位组字节流组成,通过HTTP通信传输
- 实体:作为请求或响应的有效荷载数据被传输,其内容由实体首部和实体主体组成
HTTP报文的主体用于传输请求或响应的实体主体,通常,报文主体等于实体主体,只有在传输中进行编码时,实体主体的内容发生变化,导致与报文主体产生差异.
内容编码指明应用在实体内容上的编码格式,并保持实体信息原样压缩,内容编码后的实体由客户端接受并按照编码格式进行解码.
常用的内容编码有以下几种:
- gzip(GNU zip)
- compress(UNIX系统标准压缩)
- deflate(zlib)
- identity(不进行编码)
在HTTP通信时,请求的编码实体资源尚未全部传输完成之前,浏览器无法显示请求页面,传输大容量数据时,通过把数据分成多块,可以让浏览器逐步显示页面.把实体主体分块的功能称为分块传输编码.
分块传输编码会将实体主体分为多个块,每一块用十六进制来标记大小,在实体的最后一块会使用"0"来标记
4. 发送多种数据的多部分对象集合
HTTP协议采纳了多部分对象集合,发送一份报文主体内可以包含多类型实体(类如文本、图片等不同类型的实体)
- multipart/form-data:在web表单文件上传时使用
在HTTP报文中使用多部分对象集合时,需要在首部字段中加上content-type.使用boundary字符串来划分多部分对象集合指明的各类实体
- multipart/byteranges:状态码206,响应报文包含了多个范围的内容时使用
5. 获取部分内容的范围请求
指的是从之前下载中断处恢复下载,来避免过去因为网速慢,容易断网而导致的下载中断的问题.
在执行请求范围时,会用到首部字段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 成功
表示客户端的请求被服务端正常处理了
表示服务器接受的请求以处理成功,但是返回的响应报文中不包含实体的主体部分,也不返回任何实体的主体.例如:在浏览器发送请求后,返回204,那么浏览器页面不需要更新
在客户选往服务器端发送信息,而对客户端不需要发送新信息内容的情况下使用.
该状态码表示客户端进行了范围请求,而服务器成功执行了这部分的GET请求,响应报文中包含由Content-Range指定范围的实体内容
3. 3xx 重定向
3xx表示浏览器需要执行某些特殊的处理以正确的处理请求
永久性重定向,表示请求的资源已经被分配了新的URI,以后使用的资源应该指向新的URI.
临时重定向,表示请求的资源已经被分配了新的URI,希望用户本次能够使用新的URI访问.302与301相似,但是301是永久的改变,302是临时的改变以后还可能继续发生改变.
表示请求的对应资源存在另一个新的URI,应使用GET方法定向获取请求的资源.302与303具有相似的功能,但是303明确表示客户端应采用GET方法获取资源.
当301、302、303响应状态码返回时,几乎所有浏览器都会将POST改为GET,并删除请求报文内的主体,之后请求会再次自动发送.
该状态码表示客户端发送附带条件的请求时,服务端允许访问资源,但因发生请求未满足条件的情况后,直接返回304 Not Modified(服务端的资源未改变,可以直接使用客户端未过期的缓存).304状态码返回时,不包含响应的任何主体部分
临时重定向,该状态码与302意义相同,307会按照浏览器标准不会将POST改为GET
4. 4xx 客户端错误
表示请求的报文中存在语法错误.当错误发生时,需修改请求的内容后再次发送请求
表示发送的请求需要通过HTTP认证(BASIC认证、DIGEST认证)的认证信息,若之前已经发起过一次请求,则表示用户认证失败.
返回含有401的响应必须包含一个适用于被请求资源的WWW-Authenticate首部用以质询用户信息.浏览器初次接收到401响应,会弹出认证用的对话窗口.
请求资源的访问被服务器拒绝了.
服务器上无法找到请求的资源,也可以在服务器拒绝访问但是不想说明理由时使用
5. 5xx 服务器错误
- 500 Intermal Server Error
服务端在执行请求时发生了错误,可能是web服务器存在bug
表示服务端暂时处于超负荷或者停机维护的状态,目前无法处理请求
五、与HTTP协作的Web服务器
1. 代理
代理服务器的作用是接受客户端发送的请求后转发到其他服务器,代理不会改变请求URI,会直接发送给持有资源的目标服务器,持有资源的被称为源服务器,由源服务器返回的响应经过代理服务器后再传递给客户端.
在HTTP通信的过程中,可级联多台代理服务器,请求和转发会经过数台类似锁链一样连接起来的代理服务器,在转发时,需要附加Via首部字段标记出经过的主机信息.
使用代理服务器的理由有:利用缓存技术减少网络带宽的流量,组织针对特定网站的访问控制,以获取日志为主要目的等.
代理的两种方式:
代理转发响应的时候,缓存代理会预先将资源的副本缓存在代理服务器上,当代理再次接收到对应的资源请求时,可以不从源服务器中获取资源,而是将之前缓存的资源作为响应返回.
转发请求或者响应的时候.不对报文做任何加工的代理类型被称为透明代理,反之,对报文内容进行加工的代理被称为非透明代理
2. 网关
注:利用网关可以将由HTTP请求转化为其他协议通信
网关的工作机制与代理十分相似,但是网关能使通信线路上的服务器提供非HTTP协议服务,利用网关能提高通信的安全性,因为可以在客户端和网关之间的通信线路上加密以确保安全.
3. 隧道
隧道可以按照要求建立起一条与其它服务器通信的线路,可以使用SSL等加密手段进行通信,隧道的目的是确保客户端能与服务器进行安全的通信,
4. 保存资源的缓存
缓存服务器的优势在于利用缓存可以避免多次从源服务器转发资源,因此客户端就可以从缓存服务器上获取资源,源服务器不必多次处理相同的请求.
缓存不仅存在于缓存服务器中,还存在在客户端浏览器中,与缓存代理类似,判定缓存过期后,会向源服务器确认资源的有效性,若缓存失效,浏览器会重新请求资源
六、HTTP首部
1. HTTP报文首部
在请求中,HTTP报文由:
- 方法
- URI
- HTTP版本
- HTTP首部字段等部分构成
在响应中,HTTP报文由:
- HTTP版本号
- 状态码
- HTTP首部字段3部分组成
2. HTTP首部字段
使用首部字段是为了给浏览器和服务器提供报文主体大小、所使用的语言、认证信息等内容
首部字段名:字段值1,字段值2…
- 通用首部字段:请求报文和响应报文两方都会使用的首部
- 请求首部字段:从客户端向服务器端发送请求报文时使用的首部.补充了请求的附加内容、客户端信息、响应内容等相关优先级信息
- 响应首部字段:从服务器向客户端返回响应报文时使用的首部.补充了响应的附加内容,也会要求客户端附加额外的内容信息.
- 实体首部字段:针对请求和响应的报文实体部分使用的首部,补充了资源内容更新时间等与实体有关的信息
- 通用首部字段
- 请求首部字段
- 响应首部字段
- 实体首部字段
- Cookie
- Set-Cookie
- Content-Disposition
3. HTTP/1.1通用首部字段
- Catch-Control
通过指定首部字段Catch-Control,就能操作缓存的工作机制,指令参数可选,多个指令之间通过’,'分割
表示是否能缓存的指令:
-
public:明确表明其他用户也可以利用缓存 -
private:响应只以特定用户作为对象,缓存服务器会对特定用户提供资源缓存服务,对于其他用户发送的请求,代理服务器则不会返回缓存 -
no-catch:防止从缓存中返回过期的资源,客户端发送的请求中如果包含no-catch指令,则表示客户端不会接受缓存过的响应,中间的缓存服务器必须把客户端的请求转发给源服务器.如果服务器返回的响应中包含no-catch指令,那么缓存服务器不能对资源进行缓存,源服务器也不会对缓存服务器请求中提出的"资源有效性"进行确认,并且禁止其对响应资源进行缓存操作,在服务器返回的响应中,如果报文首部字段Catch-Control中对no-catch字段名具体指定参数,那么客户端在接收这个被指定的参数值的首部字段对应的响应报文后,就不能使用缓存,对无参数的首部字段可以使用缓存
控制可执行缓存的对象的指令:
- no-store:使用no-store指令时,表示请求和对应的响应中包含机密信息,因此该指令规定不能在本地存储缓存请求和响应的任一部分.
指定缓存期限和认证的指令:
- max-age(单位:秒):当客户端发送的请求中包含max-age指令时,如果判定缓存时间数值比指定的时间数值小,那么服务端就接收缓存的资源,当指定max-age为0时,那么缓存服务器会将请求转发给服务器.当服务器返回的响应中包含max-age指令的时候,缓存服务器不再对资源有效性做确认,而max-age数值代表资源保存为缓存的最长时间.
-
s-maxage:功能与max-age相似,但是s-maxage只适用于供多位用户使用的公共缓存服务器. -
min-fresh:要求缓存服务器返回在接下来min-fresh指定的时间内还未超过有效期限的资源.例如:当min-fresh指定为60秒,在接下来60秒内超过有效期的资源就无法作为响应返回. -
max-stable:表示即使缓存资源过期,也照常接收,如果max-stable没有指定值,那么不管过了多久,客户端都会接受 -
only-if-cached:要求缓存服务器不重新加载响应,也不会确认资源有效性,当发生请求的缓存服务器的本地缓存无响应,则返回504 -
must-revalidate:代理会向源服务器再次验证即将返回的响应缓存目前是否有效,若代理无法连通源服务器获取有效资源的话,会给客户端返回504,使用must-revalidate会忽略max-stale. -
proxy-revalidate:要求所有缓存服务器在返回包含该指令请求之前,必须再次验证缓存的有效性 -
no-transforme:无论是在请求或者响应中,缓存都不能改变实体主体的媒体类型,这样可以防止缓存或代理压缩图片等类似的操作.
Catch-Controller扩展:
- Catch-extension token:通过该指令可以扩展Catch-Control的首部字段内指令,例如在Catch-Control中没有community这个指令,可以借助extension tokens实现指令的添加,如果缓存服务器不能理解community这个命令,那么会直接忽略该指令
- Connection
Connection首部字段具有以下作用:
- 控制代理不再转发的首部字段
- 管理持久化连接
在HTTP/1.1版本默认都是持久化连接,客户端会在持久连接上连续发送请求.当服务器明确向断开连接时,则指定Connection首部字段的值为Close.
在HTTP/1.1之前的版本的默认连接都是非持久连接,在旧版本的HTTP中保持持续连接,需要指定Connection首部字段的值为Keep-Alive.
-
Date:表明创建HTTP报文的日期和时间 -
Pragma
|