《图解HTTP》笔记概要1

2017-12-10  本文已影响15人  DHFE

OSI模型

开放式系统互联通信参考模型(Open System Interconnection Reference Model,缩写为 OSI),简称为OSI模型(OSI model),一种概念模型,由国际标准化组织提出,一个试图使各种计算机在世界范围内互连为网络的标准框架。定义于ISO/IEC 7498-1。

该模型是一种制定网络标准都会参考的概念性架构。并非一套标准规范,也不是用来提供实现的方法,而是透过观念描述,协调各种网络功能发展时的标准指定。

依据网络运作方式,OSI模型切分为7个不同的层级,每级按照网络传输的模式,定义所需的规范及标准。由具体到抽象的网络传输方式层次来看。共分为物理层、数据链路层、网络层、传输层、会话层、表达层、应用层。

来源于:什麼是 OSI 的 7 層架構?和常聽到的 Layer 7 有關


from 《图解HTTP》

了解Web及网络基础

我们在网页浏览器(Web browser)的地址栏中输入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是互联网相关的各类协议族的总称,包括但不限于:

协议中各式各样的内容。从电缆的规则到IP地址的选定方法、寻找异地用户的方法、双方建立通信的顺序,以及Web页面显示需要处理的步骤,等等。
像这样把与互联网相关联的协议集合起来总称为TCP/IP。也有说法认为TCP/IP是指TCP和IP两种协议。还有说法认为,TCP/IP是在IP协议的通信过程中,使用到的协议族的统称。

TCP/IP协议族里重要的一点就是分层。TCP/IP协议族按层次分别分为以下4层:应用层、传输层、网络层、数据链路层。

分层的好处是,如果互联网只由一个协议统筹,某个地方需要改变设计时,就必须把所有部分整体替换掉。而分层之后只需把变动的层替换掉即可。
把各层之间的接口部分替换掉之后,每个层次内部的设计就能够自由改动了。

各层的作用如下(TCP/IP洋葱的由内到外)





简单记为:

客户端包好洋葱,交给服务端拆洋葱:)


利用TCP/IP协议族进行网络通信时,会通过分层顺序与对方进行通信,发生端往下走接收端则往上走

我们用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标志的数据包给对方。接收端收到后,回传一个带有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分别这三个单词做了如下定义。

采用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:片段标识符

简单的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是不保存状态的协议

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 请求的其他一些注释:


POST:传输实体主体

虽然GET方法也可以传输实体的主体,但是一般不用GET方法进行传输,虽说POST功能和GET很相似,但POST主要目的不是获取响应的主体内容。

请注意,查询字符串(名称/值对)是在 POST 请求的 HTTP 消息主体中发送的:

POST /test/demo_form.asp HTTP/1.1
Host: w3schools.com
name1=value1&name2=value2

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

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

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

请求报文

响应报文

Chrome DevTools Network面板
编码提升传输速率

HTTP在传输数据时可以按照数据原貌直接传输,也可以传输过程中通过编码提升传输速率。通过在传输时编码,能有效的处理大量的访问请求。当然,编码也需要解码,需要消耗更多计算资源。

报文主体和实体主体差异

HTTP报文的主体用于传输请求或响应的的实体主体。

压缩传输的内容编码
HTTP协议中有一种被称为内容编码的功能进行类似的操作。
内容编码指明应用在实体内容上的编码格式,并保持实体信息与原样内容。内容编码后的实体由客户端接收并解码。

常用的内容编码:

不可进行多次编码,如使用gzip压缩后在使用compress压缩,通常只使用一种编码方式,多次编码极大降低压缩率,且损耗CPU资源(哪怕对某资源使用两次gzip编码,第二次的压缩率也不可观)。


HTTP状态码

状态码职责是当客户端向服务器发送请求时,描述返回的请求结果。借助状态码,用户可以知道服务端是正常处理了请求,还是出现了错误。

遵守状态码类别的定义,即使改变RFC2616中定义的状态吗,或服务端自行创建状态码都没问题。

纪录在RFC2616上的HTTP状态码就达40种,但是常用的大概只有14种。

2XX 成功状态码

200 OK

表示从客户端发来的请求在服务端被正常处理。
在响应报文内,随状态码一起返回的信息会因方法的不同发生改变,比如:

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

上一篇下一篇

猜你喜欢

热点阅读