《图解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)来划分。通常,并不一定有报文主体。

请求报文及响应报文的结构
请求报文(上)和响应报文(下)

其中响应报文还包括了响应报文主体,简称响应体,当然,响应报文首部也可以简称响应头。

请求报文

  • 请求行:包含用于请求的方法请求URIHTTP版本
  • 请求首部字段:包含表示请求的各种条件和属性的各类首部。
    • 请求首部、通用首部、实体首部
  • 请求报文主体

响应报文

  • 状态行:包含表明响应结果的状态码原因短语HTTP版本
  • 响应首部字段:包含表示响应的各种条件和属性的各类首部。
    • 响应首部、通用首部、实体首部
  • 响应报文主体
Chrome DevTools Network面板

编码提升传输速率

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,这种情况也会遇到。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,311评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,339评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,671评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,252评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,253评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,031评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,340评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,973评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,466评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,937评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,039评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,701评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,254评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,259评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,497评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,786评论 2 345