美文网首页
《图解HTTP》笔记概要1

《图解HTTP》笔记概要1

作者: DHFE | 来源:发表于2017-12-10 19:10 被阅读15次

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

    相关文章

      网友评论

          本文标题:《图解HTTP》笔记概要1

          本文链接:https://www.haomeiwen.com/subject/gnjvixtx.html