《图解HTTP》笔记概要1
OSI模型
开放式系统互联通信参考模型(Open System Interconnection Reference Model,缩写为 OSI),简称为OSI模型(OSI model),一种概念模型,由国际标准化组织提出,一个试图使各种计算机在世界范围内互连为网络的标准框架。定义于ISO/IEC 7498-1。
该模型是一种制定网络标准都会参考的概念性架构。并非一套标准规范,也不是用来提供实现的方法,而是透过观念描述,协调各种网络功能发展时的标准指定。
依据网络运作方式,OSI模型切分为7个不同的层级,每级按照网络传输的模式,定义所需的规范及标准。由具体到抽象的网络传输方式层次来看。共分为物理层、数据链路层、网络层、传输层、会话层、表达层、应用层。
-
物理层(Physical Layer)
物理层是OSI的最底层,用来定义网络设备之间的比特数据传输,也就是在电路或者其他物理线材上,传导0与1电子讯号,形成网络。物理层规范的内容包含了线路的规格、传输速度、以及治疗传输的电压值,用来确保讯号可以在多种物理媒介上传输。网线、网卡与集线器(Hub),都是平常容易接触到的物理层设备。网线包括办公室与机房内常见的RJ-45 UTP双绞线、有线电视使用的同轴电缆,以及光纤等。不过,对无线网络而言,只要可以传输电磁波的介质,都属于它的传输媒介。
集线器指的是单纯串联线路,再以广播方式传输资料的设备。市面上所见的复合式集线器设备,例如Switching Hub(交换式集线器),是厂商依照市场需求所开发的产品,通常包含些许数据链路层的功能,就OSI的规范来说,它并不完全是一个集线器。
-
数据链路层(Data Link Later)
数据链路层介于物理层和网络层之间, 主要是在网络之间建立逻辑联结,并且在传输过程中处理流量控制及错误侦测,让数据传送与接收更稳定。数据链路层将物理层的数位信号封装成一组符合逻辑的传输信号,这组信号称为数据帧(Data Frame)。帧内包含媒体访问控制地址(Media Access Control MAC地址)。而数据在传输时,这项地址信息可让对方主机辨明数据来源。MAC地址是一组序列号,每个网络设备的MAC地址都是独一无二的,可以让网络设备在局域网沟通时彼此识别,例如网卡。不少网络协议是在数据链路层上运作,我们常听到的是异步传输模式(Asynchronous Transfer Mode , ATM),以及点对点协议(Point-to-Point Protocal , PPP)。前者是早期网络发展的通讯协议,由于单次传输量很小,适合用作语音传输;后者则是在我们使用ADSL时,会透过这项协定连接ISP,从而连上互联网。
网络交换机(Switch)是这个层级常见的设备,主要在局域网络上运行,能依据MAC地址,将网络数据传送到目的主机上。交换器一般分为可设定式与免设定式两种,前者可以设定流量控制或子路由分割,后者仅传输数据,不具其他进阶功能。
-
网络层(Network Later)
网络层定义网络路由及寻址功能,让数据能够在网络间传送。这一层中最主要的通讯协议是网际协议(Internet Protocal , IP),数据在传输时,数据包里面的IP地址会告诉网络设备这一数据包的来源和目的地。由于网络层日常工作主要和IP相关,故又称为IP层。除了IP,在网络层上运行的协议还包含IPX及X.25。路由器及Layer3交换机即属于第三层的网络设备,主要以IP作为数据传输依据,大多在在企业机房内运行,不过我们也常看到有些设备也同时包含网络层功能,如IP路由器,以及俗称小乌龟的ADSL用户终端设备。
-
传输层(Transport Layer)
传输层主要负责电脑整体的数据传输及控制,是OSI模型中的关键角色,它可以将一个较大的数据分割成多个较小的数据包传输。替模型顶端的应用层、会话层、表达层提供流量、错误控制。传输控制协议(Transmission Control Protocal , TCP)是我们常接触具有传输层功能的协定,它在传输数据内加入验证码,当对方收到后,就会依据这个验证码,回传对应的确认信息(ACK),若对方未及时传回确认信息,数据就会重新传输一次,以确保数据的完整性(三次握手)。
-
会话层(Session Layer)
这个层负责建立网络连接,等到数据传输结束时,再将连接中断,运行过程中有点像召集多人开会(建立连接),然后彼此意见交换(数据传输),完成后,宣布散会(中断连接)。 -
表示(达)层(Presentation Layer)
应用层收到资料后,透过表示层可转换表示方式,例如将ASCⅡ编码转成应用层可以使用的数据,或是处理图片及其他多媒体等,如JPGE图片或MIDI音效。
除了转换,有时候将数据通过网络层传输时,需要将内容予以加密或解密,而这个工作就是在表示层进行的。 -
应用层(Application Layer)
应用层主要功能是处理应用程序,进而提供使用者网络应用服务。这一层的协定也很多。使用者常见的协议有DHCP(Dynamic Host Configuration Protocal 动态主机配置协议)、FTP(File Transfer Protocal 文件传输协议)、HTTP以及POP3(Post Office Protocal-Version 3 邮局通讯协议第三版)等。依据不同的网络服务方式,这些协议能定义各自的功能及使用规范等细部规则。属于第7层的应用软件,有浏览器、电子邮件、线上游戏、即时通讯(MSN ICQ)等。上述软件均通过单一或多种通讯协议,提供各类网络应用服务。
来源于:什麼是 OSI 的 7 層架構?和常聽到的 Layer 7 有關
from 《图解HTTP》
了解Web及网络基础
我们在网页浏览器(Web browser)的地址栏中输入URL时,可以看到Web页面,但是,具体的,页面是如何呈现的?
问题:
- 地址栏输入URL,这个信息送往何处?
- 从哪里获得回复,从而使得内容显示在Web页面上
Web页面当然不能凭空显示页面,根据指定的URL,浏览器从Web服务器端获取文件资源(resource)等信息,从而显示出Web页面。
通过发送请求来获取服务器资源的Web浏览器等,都可成为客户端(client)。
Web使用一种名为HTTP(HyperText Transfer Protocal,超文本传输协议)
的协议的作为规范,完成客户端与服务器端的一系列运作流程。而协议就是规则的约定。可以说,Web就是建立在HTTP协议上通信的。
HTTP诞生
1989年3月,互联网还只属于少数人。在这一互联网的黎明使其,HTTP诞生了。
1990年11月,CERN成功研发世界上第一台Web服务器和Web浏览器。
1990年,大家对HTML1.0草案进行了讨论,因HTML1.0中存在多出模糊不清的部分,草案被废弃了。
1993年1月,NCSA研发的Mosaic问世。
1994年12月,网景公司研发了Netscape Navigator1.0,第二年,MS发布Internal Explorer 1.0和2.0。
微软公司和网景通信公司之间爆发的浏览器大战愈演愈烈,两家公司都对HTML做了扩展,于是导致在写HTML页面时,必须考虑兼容各自的浏览器,时至今日,这个问题仍令前端页面的工程师感到棘手。
2000年前后,这场浏览器大战随着网景通信公司的衰落而暂告一段落。但就在04年,Mozilla基金会发布了Firefox浏览器,第二次浏览器大战随即爆发。
此后,Chrome,Opera,Safari等浏览器也纷纷抢占市场份额。
HTTP/0.9
HTTP于90年问世,那时的HTTP并没有作为正式的标准被简历。
HTTP其实含有HTTP/1.0之间版本的意思,因此被成为HTTP/0.9。
HTTP正式作为标准公布是在96年5月,版本被命名为HTTP/1.0,并记载与RFC1945。虽说是初期标准,但是该协议至今仍被广泛使用在服务器端。
HTTP/1.1
97年公布的HTTP/1.1是目前主流的HTTP协议版本。
网络基础TCP/IP
TCP( Transmission Control Protocal 传输控制协议)
/ IP(Internel Protocal 互联网协议)
理解HTTP,就要了解TCP/IP协议族
通常使用的网络(包括互联网)是在TCP/IP协议族的基础上运作的。而HTTP属于它内部的一个子集。
(提出问题)
计算机与网络要相互通信,双方就必须基于相同的方法。比如:
- 如何侦探到通信目标?
- 由哪一边发起通信?
- 使用哪种语言进行通信?
- 怎么样结束通信?
所有的一切都需要一种规则
,而我们就把这种规则称为协议
TCP/IP是互联网相关的各类协议族的总称,包括但不限于:
- IEEE802.3
- ICMP
- IP
- DNS
- PPPoE
- UDP
- HTTP
- SNMP
- FDDI
- FTP
......
协议中各式各样的内容。从电缆的规则到IP地址的选定方法、寻找异地用户的方法、双方建立通信的顺序,以及Web页面显示需要处理的步骤,等等。
像这样把与互联网相关联的协议集合起来总称为TCP/IP。也有说法认为TCP/IP是指TCP和IP两种协议。还有说法认为,TCP/IP是在IP协议的通信过程中,使用到的协议族的统称。
TCP/IP协议族里重要的一点就是分层。TCP/IP协议族按层次分别分为以下4层:应用层、传输层、网络层、数据链路层。
分层的好处是,如果互联网只由一个协议统筹,某个地方需要改变设计时,就必须把所有部分整体替换掉。而分层之后只需把变动的层替换掉即可。
把各层之间的接口部分替换掉之后,每个层次内部的设计就能够自由改动了。
各层的作用如下(TCP/IP洋葱的由内到外)
-
应用层
应用层决定了 向用户提供应用服务时 通信的活动
TCP/IP
协议族内预存了各类通用的应用服务。比如FTP(File Transfer Protocal 文件传输协议)
和
DNS(Domain Name System 域名系统)
服务就是其中两类。HTTP
协议也处于该层。
-
传输层
传输层对上层应用层,提供 处于网络链接中的两台计算机之间 的数据传输。
在传输层有两个性质不同的协议:
TCP(Transmisstion Control Protocal 传输控制协议)
和UDP(User Data Protocal 用户数据报协议)
抓包的数据包,指的就是这一层。
-
网络层(网络互连层)
网络层用来处理网络上流动的数据包。
数据包是网络传输的最小数据单位
,也有人叫做帧
,也说明数据是“一段段,一块块”的发送的。该层规定了通过怎样的路径(所谓的传输路线)到达对方计算机,并把数据包传送给对方。
与对方计算机之间通过多台计算机或网络设备进行传输时,网络层所起的作用就是在众多选项内选择一条传输线。MAC/IP
地址绑定就是在这一层实现,通过ARP(Address Resolution Protocal 地址解析协议)
-
链路层(网络接口层)
用来处理链接网络的物理硬件部分。
包括操作系统、硬件的设备驱动、NIC(Network Interface Card,网络适配器,即网卡),及光纤等物理可见部分(还包括连接器等一切传输媒介),硬件上的范畴均在链路层作用范围之内。
简单记为:
-
应用层
DNS、HTTP、FTP等应用服务(由TCP/IP族预存),完整的(HTTP Data Massage)组成的报文。 -
传输层
提供网络链接中的数据传输TCP(传输控制协议) / UDP(用户数据报协议),在该层分割报文。分割后为报文打上序列号和端口号转发给网络层(IP协议)。
PS:数据包是TCP/IP通信协议中的最小数据单位,通过网络传输的数据基本单元,分组包含一个报头,一个数据本身,报头描述数据目的地与其他数据的关系。 -
网络层
处理流动的数据包,MAC寻址。关键词:ARP协议。 -
链路层
处理链接网络中的硬件设备(NIC、OS等),为了保证用户数据可靠传输,将数据封装(encapsulation)为帧
客户端包好洋葱,交给服务端拆洋葱:)
利用TCP/IP协议族进行网络通信时,会通过分层顺序与对方进行通信,发生端往下走
,接收端则往上走
。
我们用HTTP举例说明:
- 首先作为发送端的客户端在应用层(
HTTP协议
)发出一个想看某个Web页面的HTTP请求(Http Requset
) - 接着,为了传输方便,在传输层(
TCP协议
)把从应用层收到的数据(HTTP请求报文
)进行分割,并在各个报文上打上标记序号及端口号(方便接收端重组)转发给网络层。 - 网络层(IP协议),增加了作为通信目的地的MAC地址后转发给链路层。这样一来,发往网络的通信请求准备齐全了。
- 接收端的服务器在链路层接受到数据,按序往上层发送,一直到应用层,才能真正算接受到由客户端发送过来的HTTP请求。
发送端在层与层之间传递时,每经过一层时必定会被打上一个该层所属的首部信息。反之,接受端在层与层传输数据时,每经过一层时会把对应的首部消去。
这种把数据信息包装起来的做法成为封装(encapsulate)
抽象为,洋葱的生长和剥洋葱理解较好。
1.4 与HTTP关系密切的协议:IP、TCP和DNS
针对TCP/IP协议族中与HTTP密不可分的3个协议(IP、TCP和DNS)进行说明。
负责传输的IP协议
按层次分,IP(Internet Protocal)
网际协议位于网络层。Internet Protocal这个名称听起来也有点夸张,但事实正式如此,因为几乎所有使用网络的系统都会用到IP协议。TCP/IP协议族中的IP指的就是网际协议,协议名称都会用到IP协议。TCP/IP协议族中的IP指的就是网际协议,协议名称中占据了一般位置,其重要性可见一斑。
IP地址和IP不是一个概念,IP是协议名称。
IP协议作用是将各种数据包传送给对方。而要保证确实传送到对方那里,则需要满足各类条件。其中两个重要的条件 是IP地址和MAC地址(Media Address Control Address)。【MAC地址唯一指定一台设备,全球唯一】
IP地址指明了节点被分配到的地址,MAC地址是指网卡所属的固定地址。IP地址可以和MAC地址进行配对。IP地址可变换,但MAC地址基本上不会更改。
使用ARP协议凭借MAC地址进行通信
IP间的通信依赖MAC地址。在网络上,通信的双方在同一局域网(Location Area Network)内的情况是很少的,通常是经过多台计算机和网络设备中转才能连接到对方。而在进行中转时,会利用下一站设备中的MAC地址来搜索下一个中转目标,这时,会采用ARP协议(Address Resolution Protocal)。ARP是一种可以用来解析地址的协议,根据通信房的IP地址就可以反查出对应的MAC地址。
TCP协议
TCP位于传输层,提供可靠的字节流服务。
所谓的字节流服务(Byte Stream Service)
是指,为了方便传输,将大块数据分割成报文段(segment)为单位的数据包进行管理。而可靠的传输服务是指,能够把数据准确可靠的传给对方。一言以蔽之,TCP协议为了更容易传送大数据才把数据分割,TCP协议能够确认数据最终是否送达对方。
确保数据到达目标(Three-way Handshaking)
三次握手策略(three-way handshaking)
。用TCP协议把数据包送出去之后,TCP不会对传送后的情况置之不理,它会向对方确认是否成功送达。握手过程中使用了TCP的标志:
-
SYN(synchronize)
-
ACK(acknowledgement)
发送端首先发送一个带有SYN
标志的数据包给对方。接收端收到后,回传一个带有SYN / ACK
的标志的数据包以示确认。最后,发送端再回传一个带ACK
标志的数据包,代表”握手“结束。
若在握手过程中某个过程中断,TCP协议会再次重新以相同的顺序发送相同的数据包。
DNS服务
DNS(Domain Name System)服务是和HTTP协议一样位于应用层的协议,提供域名到IP地址之间的解析服务。
计算机既可以被赋予IP地址,也可以赋予主机名和域名。比如www.hackr.jp。
用户使用域名或主机名,符合人类的记忆习惯。但是计算机理解名称,相对而言就变得困难了。因为计算机更擅长处理一串数字。
DNS服务应运而生。DNS协议提供通过域名查找地址,或逆向IP地址查找域名服务。
各种协议与HTTP协议的关系
URI和URL
与URI(统一资源标识符)相比,我们更熟悉URL(Uniform Resource Locator,统一资源定位符)。URL正是使用Web浏览器等访问Web页面时需要输入的网页地址。
统一资源标识符
URI(Uniform Resource Identifier)的缩写,RFC2396分别这三个单词做了如下定义。
-
Uniform
规定统一的格式可方便处理多种不同类型的资源,而不用根据上下文环境来识别资源指定的访问方式。另外,加入新增的协议方案(如http:或ftp:)也更容易。 -
Resource
资源的定义是“可标识的任何东西”。不仅是文档文件,图像或服务(例如当天的天气预报)等能够区别于其他类型的,全都可作为资源。另外,资源不仅可以是单一的,也可以是多数的集合体。 -
Identifier
表示可标识的对象。也称为标识符。
综上所述,URI就是由某个协议方案表示的资源的定位标识符。协议方案是指访问资源所使用的协议类型名称。
采用HTTP协议时,协议方案就是http。除此之外,还有ftp、mailto、telnet、file等。标准的URI协议方案有30多种,由隶属于国际互联网资源管理的非营利社员ICANN的IANA管理颁布。
URI用字符串标识某一互联网资源,而URL表示资源的地点(互联网上所处位置)。可见URL是URI的子集。
RFC3986:统一资源标识符(URI)通用语法中列举了几种URI例子:
ftp://ftp.is.co.za/rfc/rfc1808.txt
http://www.ietf.org/rfc/rfc2396.txt
ldap://[2001:db8::7]/c=GB?objectClass?one
news:comp.infosystems.www.servers.unix
tel:+1-816-555-1212
telnet://192.0.2.16:80/
urn:oasis:names:specification:docbook:dtd:xml:4.1.2
URI格式
表示指定的URI,要使用涵盖全部必要信息的绝对URI、绝对URL以及相对URL。相对URL,是指从浏览器中基本URI处指定的URL,形如/image/logo.gif/
。
了解一下绝对URI的格式。
http://user:pass@www.example.jp:80/dir/index.html?uid=1#ch1
------ --------- -------------- -- -------------- ----- ---
1 2 3 4 5 6 7
1:协议方案名
2:登陆信息(认证)
3:服务器地址(域名)
4:服务器端口号
5:带层次的文件路径
6:查询字符串
7:片段标识符
-
登陆信息(认证)
指定用户名和密码作为从服务器端获取资源时必要的登陆信息(身份认证)。 -
服务器地址
使用绝对URI必须指定待访问的服务器地址。地址可以是类似hackr.jp
这种DNS可解析的名称,或是192.168.1.1
这类IPv4地址名,还可以是[0:0:0:0:0:0:0:1]
这样用方括号括起来的IPv6地址名。 -
服务器端口号
指定服务器连接的网络端口号。可选项,若用户省略则自动使用默认端口号。 -
带层次的文件路径
指定服务器上的文件路径来定位特指的资源。这与UNIX系统的文件目录结构类似。 -
查询字符串
针对已指定的文件路径内的资源,可以使用查询字符串传入任意参数。 -
片段标识符
使用片段标识符通常可标记出已获取资源中的子资源(文档内某个位置)。但在RFC中并没有明确规定其使用方法。
简单的HTTP协议
HTTP协议用于客户端和服务器端之间的通信
请求访问文本或图像资源的一端成为客户端,而提供资源响应的一端称服务器端。
在两台计算机之间使用HTTP协议通信时,在一条通信线路上必定有一端时客户端,另一端则是服务器端。
有时候,按实际情况,两台计算机之间作为客户端和服务器端角色有可能会互换。但就仅从一条通信线路来说,服务器端和客户端的角色是可确定的,而用HTTP协议能够明确区分哪端时client,哪端是server。
通过请求和响应的交换达成通信。
HTTP协议规定,请求从客户端发出,最后服务器端响应该请求并返回。换句话说,肯定是先从客户端开始建立通信的,服务器端在没有接收到请求前不会发送响应。
下面则是从客户端发送给某个HTTP服务器端的请求报文中的内容。
GET /index.htm HTTP/1.1
Host: hackr.jp
起始行开头的GET表示请求访问服务器的类型,称为方法(method)。随后的字符串/index.htm
指明了请求访问的资源对象,也叫做请求URI(request-URI)。最后的HTTP/1.1,即HTTP的版本号,用来提示客户端使用的HTTP的协议功能。
综合来看,这段请求内容:请求访问某台服务器上的/index.htm页面资源
请求报文是由请求方法、请求URI、协议版本、可选的请求首部字段和内容实体构成。
请求报文的构成请求首部字段及内容实体稍后会作详细说明。现在,接收到请求的服务器,会将请求内容的处理结果以响应的形式返回。
- HTTP/1.1 :表示服务器对应的HTTP版本
- 200 OK:表示请求的处理结果的状态码(status code)和原因短语(reason-phrase)。下一行显示了创建响应的日期时间,是首部字段(header field)内的一个属性。
接着一空行分隔,之后的内容成为资源实体的主体(enitity body)。
响应报文基本上由协议版本、状态码、用以解释状态码的原因短语、可选的响应首部字段以及实体主体构成。
HTTP是不保存状态的协议
HTTP是一种不保存状态,即无状态(stateless)协议。HTTP协议自身不对请求和响应之间的通信状态进行保存,协议对于发送过的请求或者响应都不做持久化处理。
使用HTTP协议,每当有新的请求发送,就会有对应的新响应产生。协议本身并不保留之前一切的请求或响应报文的信息。这是为了更快的处理大量事务,确保协议的可伸缩性,而特意如此设计。
当然,随着Web的不断发展,无状态导致业务处理变得棘手情况也多了,比如登陆购物网站,跳转其他页面后,也需要能保持登陆状态,针对这个例子,网站为了能够掌握是谁发出的请求,需要保存用户的状态。
HTTP/1.1虽然是无状态协议,但为了实现期望的保持状态功能,引入了cookie。
请求URI定位资源
HTTP协议使用URI定位资源,在互联网上任意位置的资源都能访问到。
client请求访问资源 发送请求时,URI需要将作为请求报文中的请求URI包含在内。指定请求URI方式有很多:
也可以用OPTIONS * HTTP/1.1
查询HTTP服务器端支持的HTTP方法和种类。
HTTP方法
GET:获取资源
GET方法请求访问已被URI识别的资源。指定资源服务器端解析后返回响应内容。如果请求资源是文本,那就保持原样返回;如果是像CGI(Common Gateway Interface,通用网关接口)那样的程序,则返回进行执行后的输出结果。
请注意,查询字符串(名称/值对)是在 GET 请求的 URL 中发送的:
/test/demo_form.asp?name1=value1&name2=value2
有关 GET 请求的其他一些注释:
- GET 请求可被缓存
- GET 请求保留在浏览器历史记录中
- GET 请求可被收藏为书签
- GET 请求不应在处理敏感数据时使用
- GET 请求有长度限制
- GET 请求只应当用于取回数据
POST:传输实体主体
虽然GET方法也可以传输实体的主体,但是一般不用GET方法进行传输,虽说POST功能和GET很相似,但POST主要目的不是获取响应的主体内容。
请注意,查询字符串(名称/值对)是在 POST 请求的 HTTP 消息主体中发送的:
POST /test/demo_form.asp HTTP/1.1
Host: w3schools.com
name1=value1&name2=value2
有关 POST 请求的其他一些注释:
- POST 请求不会被缓存
- POST 请求不会保留在浏览器历史记录中
- POST 不能被收藏为书签
- POST 请求对数据长度没有要求
PUT:传输文件
PUT传输文件,就像FTP协议上的文件上传一样,要求在请求报文的主体中包含文件内容,然后保存到请求URI指定的位置。
但是鉴于HTTP/1.1的PUT方法自身不带验证机制,任何人都可以上传文件,存在安全性问题,因此一般网站不使用该方法。若配合Web应用程序的验证机制,或架构设计采用REST标准的的同类web网站,就可能会开放PUT方法。
HEAD:获取报文首部
HEAD和GET一样,只是不返回报文主体部分,用于确认URI的有效性及资源更新的日期时间等。
DELETE:删除文件
DELETE方法用于删除文件,与PUT相反的方法。DELETE方法按请求URI删除指定的资源。
但是与PUT方法一样不带验证机制,一般的网站不会使用DELETE方法。
OPTIONS:询问支持的方法
TRACE:追踪路径
CONNECT:隧道协议连接代理
下标列出了HTTP/1.0和HTTP/1.1支持的方法。另外,方法名区分大小写,注意要用大写字母。
面试时关于GET和POST初级提问一般会问两者之间的区别,附图。
持久连接节省通信量
HTTP协议初始版本中,每进行一次HTTP通信就要断开一次TCP连接。
当年通信量低而少,都是很小的文本传输,随着HTTP普及,文档中包含大量图片的情况多了起来。
比如浏览器浏览器一个包含多张图片的HTML页面,在发送请求访问HTML页面资源同时,也会请求HTML页面包含的资源,因此,每次请求都会造成无谓的TCP连接建立和断开,增加通信开销。
为了解决问题,HTTP/1.1有了持久连接(HTTP Persistent Connections,也称为HTTP keep-alive),特点是,只要任意一端没有明确提出断开连接,则保持TCP连接状态。
持久连接的好处在于减少了TCP连接的重复建立和断开所造成的额外开销,减轻了服务器端负载。另外,减少开销的时间,使HTTP请求和响应更早结束,web页面显示速度也提高了。
管线化
持久连接使多数请求以管线化(pipelining)方式发送成为可能。
从前发送请求后需要等待并收到响应,才能发送下一个请求。管线化技术不用等待响应就可直接发送下一个请求。
这样就能做到并发加载了。
管线化技术则比持久连接还要快,请求数越多,时间差越明显。
使用cookie的状态管理
HTTP是无状态协议,无法根据之前的状态进行本次请求处理。
假设要求登陆认证的web页面本身无法进行状态管理(不记录已登陆的状态),那么每次跳转新页面就要再次登陆,或者要在每次请求报文中附加参数来管理状态。
当然,如果管理全部客户端状态也会造成负担。
cookie技术通过在请求和响应报文中写入cookie信息来控制客户端状态。
cookie会根据从服务器端发送的响应报文内的一个叫做Set-Cookie
的首部字段信息,通知客户端保存Cookie。当下次客户端再往该服务器发送请求时,客户端自动在请求报文中加入cookie值后发送出去。
服务器端发现客户端的发送过来的cookie后,会去检查哪一个客户端发送的连接请求,对比服务器纪录,最后得到状态信息。
HTTP报文结构
用于HTTP协议交互的信息被成为HTTP报文。请求端(client)的HTTP报文叫做请求报文,响应端(server)的叫做响应报文。HTTP报文本身是由多行(用CR+LF作换行符 Carriage-Return Line-Feed,即回车换行)数据构成的字符串文本。
HTTP报文大致可分为报文首部和报文主体两块。两者由最初出现的空行(CR+LF)来划分。通常,并不一定有报文主体。
请求报文及响应报文的结构
请求报文(上)和响应报文(下)其中响应报文还包括了响应报文主体,简称响应体,当然,响应报文首部也可以简称响应头。
请求报文
- 请求行:包含用于请求的方法,请求URI和HTTP版本。
-
请求首部字段:包含表示请求的各种条件和属性的各类首部。
- 请求首部、通用首部、实体首部
- 请求报文主体。
响应报文
- 状态行:包含表明响应结果的状态码,原因短语和HTTP版本。
-
响应首部字段:包含表示响应的各种条件和属性的各类首部。
- 响应首部、通用首部、实体首部
- 响应报文主体。
编码提升传输速率
HTTP在传输数据时可以按照数据原貌直接传输,也可以传输过程中通过编码提升传输速率。通过在传输时编码,能有效的处理大量的访问请求。当然,编码也需要解码,需要消耗更多计算资源。
报文主体和实体主体差异
-
报文:是HTTP通信中的基本单位,由8bit组字节流组成,通过HTTP通信传输。
-
实体:作为请求或响应的有效载荷数据被传输,其内容由实体首部和实体主体组成。
HTTP报文的主体用于传输请求或响应的的实体主体。
压缩传输的内容编码
HTTP协议中有一种被称为内容编码的功能进行类似的操作。
内容编码指明应用在实体内容上的编码格式,并保持实体信息与原样内容。内容编码后的实体由客户端接收并解码。
常用的内容编码:
- gzip(GNU zip)
- compress(UNIX系统的标准压缩)
- deflate(zlib)
- identity (不进行编码)
不可进行多次编码,如使用gzip压缩后在使用compress压缩,通常只使用一种编码方式,多次编码极大降低压缩率,且损耗CPU资源(哪怕对某资源使用两次gzip编码,第二次的压缩率也不可观)。
HTTP状态码
状态码职责是当客户端向服务器发送请求时,描述返回的请求结果。借助状态码,用户可以知道服务端是正常处理了请求,还是出现了错误。
遵守状态码类别的定义,即使改变RFC2616中定义的状态吗,或服务端自行创建状态码都没问题。
纪录在RFC2616上的HTTP状态码就达40种,但是常用的大概只有14种。
2XX 成功状态码
200 OK
表示从客户端发来的请求在服务端被正常处理。
在响应报文内,随状态码一起返回的信息会因方法的不同发生改变,比如:
- 使用GET方法,请求资源的实体会作为响应返回。
- 使用HEAD方法,只会返回首部,不会返回实体主体。
204 No Content
表示服务端接收的请求已成功处理,但在返回的响应报文中不含实体的主体部分。
一般在只需要从客户端往服务器发送信息,而对客户端不需要发送新信息内容的情况下使用。
206 Partial Content
表示客户端进行了范围请求,而服务器成功执行了这部分的GET请求。响应报文中包含由Content-Range指定范围的实体内容。
3XX 重定向状态码
301 Moved Permanently
永久重定向。表示请求的资源已经分配的新的URI,以后应该使用新的URI。
比如,把资源对应的URI保存为书签,这时应该按Location首部字段提示的URI重新保存。
302 Found
临时性重定向。该状态码表示请求的资源已被分配了新的URI,希望用户(本次)能使用新的URI访问。
302状态码代表的资源不是被永久移动,只是临时性的。
303 See Other
该状态码表示由于请求对应的资源存在另一个URI,应该使用GET方法定向获取请求的资源。
303状态码明确表示客户端应当采用GET方法获取资源,与302状态码有区别。
当301、302、303响应状态码返回时,几乎所有的浏览器都会把POST改为GET,并删除请求报文内的主体,之后请求会自动再次发送。
301、302标准是禁止将POST方法改变成GET方法的,但实际使用时大家都会这么做。
304 Not Modified
说明无需再次传输请求的内容,也就是说可以使用缓存的内容。——MDN
表示客户端发送附带条件的请求时,服务器端允许请求访问资源,但因发生请求未满足条件的情况后,直接返回304 Not Modified(服务器端资源未改变,可直接使用客户端未过期的缓存)。304返回时,不包含任何响应的主体部分。
304虽然被划分在3XX的类别中,但是和重定向没有关系。
307 Temporary Redirect
临时重定向。该状态码与302 Found有着相同的含义。尽管302标准禁止POST变换成GET,但实际使用时大家并不遵守。
307会遵守浏览器标准,不会从POST变成GET。但是,对于处理响应时的行为,每种浏览器会有不同情况。
4XX 客户端错误状态码
400 Bad Request
表示请求报文中存在语法错误,并且浏览器会像200 OK一样对待该状态码。
401 Unauthorized
表示发送的请求需要有通过HTTP认证(BASIC认证 DIGEST认证)的认证信息。若之前已经进行过一次请求,表示用户认证失败。
403 Forbidden
表示对请求资源的访问被服务器拒绝了。服务端没有必要给出拒绝的详细理由,但如果想说明的话,可以在实体的主体部分对原因进行描述,这样就能让用户看到了。
未获得文件系统的访问授权,访问权限出现某些问题(从未授权的IP地址试图访问)等情况都可能出现403。
404 Not Found
表明服务器上无法找到请求的资源。除此之外,也可以在服务器端拒绝请求且不想说明理由时使用。@GFW
5XX 服务端错误状态码
500 Internal Server Error
表示服务器端在执行请求时发生了错误。也有可能是Web应用存在的bug或某些临时的故障。
503 Service Unavailable
表明服务器暂时处于超负荷或正在进行停机维护,现在无法处理请求。
如果事先得知解除以上状况需要的时间,最好写入Retry-After首部字段在返回给客户端。
状态码和状况的不一致
不少返回的状态码响应都是错误的,但是用户可能察觉不到这点。比如Web应用程序内部发生错误,状态码依然返回200 OK,这种情况也会遇到。