面试官问你的HTTP知识点竟然是这些。。。

推荐一本书《图解HTTP》,我看了有好几遍,尤其是书中的图片很形象。无论是前端、移动端抑或是大后端都离不开Http协议,所以弄清楚Http相关知识和原理着实重要,本文就挑重点式总结一下Http知识。

计算机网络系列:

TCP/IP协议族

为了理解HTTP,我们有必要事先了解一下TCP/IP协议族。

什么是协议?
计算机与网络设备进行通信,双方就必须基于相同的方法。比如,如何找到通信目标,采用哪种语言通信,如何结束通信等。这些都需要规则约束,我们把这种规则称之为协议(protocol)。

通常使用的网络(包括互联网)是在TCP/IP协议族的基础上运作的,而HTTP、TCP、IP等协议都属于它内部的子集。切莫把TCP/IP解读为仅仅是TCP和IP协议。

TCPIP是互联网相关的各类协议族的总称

TCP/IP分层

TCP/IP采用四层分层模型,自上而下分别为应用层、传输层、网络层、数据链路层。

应用层

应用层决定了向用户提供应用服务时通信的活动。应用层相关的协议有:

  • HTTP(Hyper Text Transfer Protocol,超文本传输协议)
  • FTP(File TransferProtocol,文件传输协议)
  • DNS(Domain Name System,域名解析系统)

传输层

传输层对上层应用层,提供处于网络连接中的两台计算机之间的数据传输。传输层相关的协议有:

  • TCP(Transmission Control Protocol,传输控制协议)
  • UDP(User Data Protocol,用户数据报协议)

网络层

处理在网络上流动的数据包,为数据包选择路由。网络层相关的协议有:

  • IP(Internet Protocol,IP协议)

数据链路层

用来处理连接网络的硬件部分,硬件上的范畴均在链路层的作用范围之内。

HTTP协议

HTTP(Hyper Text Transfer Protocol,超文本传输协议),位于TCP/IP四层模型当中的应用层。 作用:在浏览器与服务器间传送文档,也是从Web服务器传输超文本到客户端的传输协议,无状态的传输协议;不仅能够保证正确、快速、高效的传输超文本文档,而且可以确定资源加载顺序等。 在Web开发中,页面缓存控制、数据传递、文档语言参数设定等等,都离不开HTTP协议。

HTTP协议的几个重要概念:

  1. 连接(Connection):一个传输层的实际环流,它是建立在两个相互通讯的应用程序之间。
  2. 消息(Message):HTTP通讯的基本单位,包括一个结构化的八元组序列并通过连接传输。
  3. 请求(Request):一个从客户端到服务器的请求信息包括应用于资源的方法、资源的标识符和协议的版本号
  4. 响应(Response):一个从服务器返回的信息包括HTTP协议的版本号、请求的状态(例如“成功”或“没找到”)和文档的MIME类型。
  5. 资源(Resource):由URI标识的网络数据对象或服务。
  6. 实体(Entity):数据资源或来自服务资源的回映的一种特殊表示方法,它可能被包围在一个请求或响应信息中。一个实体包括实体头信息和实体的本身内容。
  7. 客户机(Client):一个为发送请求目的而建立连接的应用程序。
  8. 用户代理(Useragent):初始化一个请求的客户机。它们是浏览器、编辑器或其它用户工具。
  9. 服务器(Server):一个接受连接并对请求返回信息的应用程序。
  10. 源服务器(Originserver):是一个给定资源可以在其上驻留或被创建的服务器。
  11. 代理(Proxy):一个中间程序,它可以充当一个服务器,也可以充当一个客户机,为其它客户机建立请求。请求是通过可能的翻译在内部或经过传递到其它的服务器中。一个代理在发送请求信息之前,必须解释并且如果可能重写它。
    代理经常作为通过防火墙的客户机端的门户,代理还可以作为一个帮助应用来通过协议处理没有被用户代理完成的请求。
  12. 网关(Gateway):一个作为其它服务器中间媒介的服务器。与代理不同的是,网关接受请求就好象对被请求的资源来说它就是源服务器;发出请求的客户机并没有意识到它在同网关打交道。
    网关经常作为通过防火墙的服务器端的门户,网关还可以作为一个协议翻译器以便存取那些存储在非HTTP系统中的资源。
  13. 通道(Tunnel):是作为两个连接中继的中介程序。一旦激活,通道便被认为不属于HTTP通讯,尽管通道可能是被一个HTTP请求初始化的。当被中继的连接两端关闭时,通道便消失。当一个门户(Portal)必须存在或中介(Intermediary)不能解释中继的通讯时通道被经常使用。
  14. 缓存(Cache):反应信息的局域存储。

DNS协议

DNS(Domain Name System,域名解析服务)的缩写,主要负责将域名解析为对应的IP地址。它与HTTP协议一样位于应用层。

对于用户来说使用一串有意义的字符去访问某台计算机是更容易接受的。例如,用www.baidu.com访问百度。将用户容易理解的域名解析为网络传输需要的IP,这就是DNS存在的意义。

DNS域名解析示意图

TCP协议

TCP(Transmission Control Protocol,传输控制协议),TCP位于传输层,提供可靠的字节流服务。

TCP协议为了更容易传送大数据需要将大块数据分割成以报文段(segment)为单位的数据包。而且TCP协议能够确认数据最终是否送达到对方和安全断开连接,采用的方式是三次握手和四次挥手形式

三次握手示意图

IP协议

IP(Internet Protocol)网际协议位于网络层,IP协议的作用是把各种数据包传送给对方。而要保证确实传送到对方那里,则需要满足各类条件。其中两个重要的条件是IP地址和MAC地址(Media AccessControl Address)。

IP地址指明了节点被分配到的地址,MAC地址是指网卡所属的固定地址。IP地址可以和MAC地址进行配对。IP地址可变换,但MAC地址基本上不会更改。

IP定位原理示意图

网络通信传输流

下图是根据TCP/IP分层原理,端到端数据流的走向。

网络通信传输流

发送端在层与层之间传输数据时,每经过一层时必定会被打上一个该层所属的首部信息。反之,接收端在层与层传输数据时,每经过一层时会把对应的首部消去。

单说发送端这部分,数据流中各个协议扮演的角色如下:

  1. 应用层的HTTP协议将请求地址和数据按照一定的格式包装成请求体,然后向下传输。
  2. 传输层的TCP协议负责连接、发送数据、断开连接。TCP协议保证了HTTP数据包到达接受端的可靠性。为了传输方便,在传输层(TCP协议)把从应用层处收到的数据(HTTP请求报文)进行分割,并在各个报文上打上标记序号及端口号后转发给网络层。
  3. 网络层IP协议,将传输层传过来的数据作为自己的数据,并在自己数据前端加上IP首部然后转发给数据链路层。值得一提的是,在IP首部指定了接受端的MAC地址。
  4. 数据链路层负责数据信号通过硬件向接收端进行传输。

各种协议与HTTP协议的关系

通过一张图我们回顾一下整个HTTP过程:

各种协议与HTTP协议的关系

HTTP报文

用于HTTP协议交互的信息被称为HTTP报文,HTTP报文本身是由多行(用CR+LF作换行符)数据构成的字符串文本。

HTTP报文的结构

HTTP报文有两种:请求报文响应报文。请求报文指从客户端向服务端发送的报文,响应报文指从服务端响应客户端的报文。

这两种报文都是由 首行报文首部报文主体三部分组成的。

请求报文:

POST /i HTTP/1.1
Host: count.typora.io
Accept: */*
Content-Type: application/x-www-form-urlencoded
Connection: keep-alive
Cookie: __cfduid=d345ac732c82bada5e1f1b3ec7f42498e1550563241
Accept-Language: zh-cn
Content-Length: 206
Accept-Encoding: br, gzip, deflate
User-Agent: Typora/1355 CFNetwork/975.0.3 Darwin/18.2.0 (x86_64)

app_key=3162bc659f38963b8f15099e19551

响应报文:

HTTP/1.1 200 OK
Server: nginx
Date: Mon, 11 Mar 2019 03:28:05 GMT
Content-Type: application/json; charset=utf-8
Vary: Accept-Encoding
Access-Control-Allow-Origin: *
X-Frame-Options: deny
X-XSS-Protection: 1; mode=block
Content-Encoding: gzip
Transfer-Encoding: chunked
Connection: Keep-alive

{"result":"Success"}

请求报文首行

POST /i HTTP/1.1是请求报文的首行。其中 POST 代表请求方法。 /i 表示请求的资源URI。HTTP/1.1 表示HTTP版本号。

请求方法

告知服务器请求意图,期望服务器产生某种行为。

目前常见的方法有:

http请求方法

通常我们只会用到GET、POST方法。GET用来请求访问已被URI识别的资源,指定的资源经服务器解析后返回响应结果。POST用来传输实体的主体。虽然GET也可以用来传输实体的主体,但是一般我们不用,而是用POST。

PUT用来传输文件,但是由于HTTP/1.1的PUT方法不带验证机制,存在安全隐患,因此很少用到。

DETETE和PUT存在一样的问题,因此也很少用到。但是如果服务器采用了REST风格的设计,PUT和DELETE将会被应用到。

HEAD和GET方法一样,只是不返回响应报文的主体部分。用来确认URI的有效性和资源更新的日期时间等。例如,客户端需要一个很大的文件(几百兆),如果每次都从网络上加载文件会造成很大的开销。为了解决这个问题,客户端可以在首次GET文件后进行缓存,以后只需要HEAD请求验证文件是否更新,只有当文件更新后才需要重新GET。

响应报文首行

HTTP/1.1 200 OK 是响应报文的首行。其中HTTP/1.1已经介绍过了,与请求报文首行中的HTTP版本号相同。200表示返回结果的状态码。OK表示原因短语。

状态码

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

响应的状态码可描述请求的处理结果

状态码如200 OK,以3位数字和原因短语组成。数字中的第一位指定了响应类别,后两位无分类。响应类别有以下5种:

状态码的类别

报文首部

Host: count.typora.io
Accept: */*
Content-Type: application/x-www-form-urlencoded
Connection: keep-alive
Cookie: __cfduid=d345ac732c82bada5e1f1b3ec7f42498e1550563241
Accept-Language: zh-cn
Content-Length: 206
Accept-Encoding: br, gzip, deflate
User-Agent: Typora/1355 CFNetwork/975.0.3 Darwin/18.2.0 (x86_64)

报文的首部字段表示请求的各种条件和属性,它能起到传递额外重要信息的作用。根据其用途的不同可以分为以下四种:通用首部字段请求首部字段响应首部字段实体首部字段

HTTP/1.1规范定义了如下47种首部字段。

通用首部字段

请求报文和响应报文都会用到的首部。

通用首部字段

请求首部字段

请求报文用到的首部。补充了请求的附加内容、客户端信息、响应内容相关优先级等信息。

请求首部字段

响应首部字段

响应报文用到的首部。补充了响应的附加内容,也会要求客户端附加额外的内容信息。

响应首部字段

实体首部字段

针对请求报文和响应报文的实体部分使用的首部。补充了资源内容更新时间等与实体有关的信息。

实体首部字段

常用的报文首部

HTTP/1.1定义了47种首部字段,另外还有一些扩展的。比较常用的几种:

常用的首部字段

HTTP工作原理

HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。

以下是 HTTP 请求/响应的步骤:

1、客户端连接到Web服务器
一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。

2、发送HTTP请求
通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。

3、服务器接受请求并返回HTTP响应
Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。

4、释放连接TCP连接
若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;

5、客户端浏览器解析HTML内容
客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。

例如:在浏览器地址栏键入URL,按下回车之后会经历以下流程:

  1. 浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;
  2. 解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立TCP连接;
  3. 浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;
  4. 服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器;
  5. 释放 TCP连接;
  6. 浏览器将该 html 文本并显示内容;

HTTP特性

1. 无状态

HTTP 是一种无状态协议,即HTTP不会管理之前客户端与服务器的通信状态。由于不用保存通信状态,那么服务器的CPU以及内存的压力会大大降价。这是HTTP无状态的优点,但它也会给我们带来一些的问题。

例如,我们去某购物网站购物,提交订单之前要对我们的身份进行验证(需要我们登录账号)。但是由于HTTP的无状态特性(没有记录登录状态),每次下单都会要求我们重新登录。为了即不破坏HTTP的无状态特性又可以解决类似的问题,HTTP引入了Cookie技术。Cookie技术通过在请求报文和响应报文中加入cookie信息来实现状态的保持。在响应报文中,服务器可以通过set-cookie首部告诉客户端Cookie信息。客户端再次请求时会通过Cookie首部携带上Cookie信息。

cookie使用

cookie工作原理

2. 持久连接

HTTP依赖于TCP进行数据传输,TCP是一种稳定的长连接,即如果没有一方明确的提出过断开连接,那么连接将一直持续。

在早些年的HTTP协议中,每进行一次HTTP通信,都会有一次TCP的连接与断开。这与TCP的长连接特性相违背。因此,在HTTP/1.1和部分HTTP/1.0中增加了持久连接(HTTP persistent connection,也称作HTTP keep-alive或HTTP connection reuse),使用同一个TCP连接来发送和接受多个HTTP通信,而不是为每一次通信都打开新的连接。HTTP就是通过Connection首部来管理持久连接的。

Connection首部使用

3. 缓存机制

HTTP允许客户端在一次URL请求完成后将响应结果存储到本地。下次向该URL请求资源时,客户端会直接从本地存储中获取到该URL的资源。引入了缓存机制后,HTTP请求会变的稍微复杂一点:

  1. 当我们初次访问一个URL时,服务器返回请求资源并同时告诉客户端对资源进行缓存、以及缓存过期时间。

  2. 再次访问该URL时,客户端会根据URI找到对应的缓存,并检查缓存是否有效(当前时间小于缓存的过期时间)。

  3. 若缓存有效,客户端不会去访问服务器,而是直接从缓存中获取资源,这个过程我们称为缓存命中

  4. 若缓存无效(当前时间大于缓存的过期时间),客户端会去向服务器验证缓存是否有效。

    • 有效,服务器仅返回代表缓存有效的首部信息,客户端更新缓存过期时间,同时从缓存中取得资源。
    • 无效,服务器返回新的资源,客户端更新资源。

缓存机制使用的首部字段

HTTP引入缓存机制后的请求

扩展知识

GET和POST的区别

其实这个问题这么多年来争论一直喋喋不休。GET和POST这两种方式从"明面"上说可能有以下区别:

  • GET能被缓存,POST不能缓存 。
  • GET请求只能进行url编码,而POST支持多种编码方式。
  • GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
  • GET请求在URL中传送的参数是有长度限制的,而POST没有。
  • GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
  • GET只允许 ASCII 字符。POST没有限制。也允许二进制数据。

然而上边的这些区别仅仅是"明面"上的。实际上GET和POST本质上就是TCP链接,并无差别。但是由于HTTP的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。这里有一个很形象的说明:

在我大万维网世界中,TCP就像汽车,我们用TCP来运输数据,它很可靠,从来不会发生丢件少件的现象。但是如果路上跑的全是看起来一模一样的汽车,那这个世界看起来是一团混乱,送急件的汽车可能被前面满载货物的汽车拦堵在路上,整个交通系统一定会瘫痪。为了避免这种情况发生,交通规则HTTP诞生了。HTTP给汽车运输设定了好几个服务类别,有GET, POST, PUT, DELETE等等,HTTP规定,当执行GET请求的时候,要给汽车贴上GET的标签(设置method为GET),而且要求把传送的数据放在车顶上(url中)以方便记录。如果是POST请求,就要在车上贴上POST的标签,并把货物放在车厢里。当然,你也可以在GET的时候往车厢内偷偷藏点货物,但是这是很不光彩;也可以在POST的时候在车顶上也放一些数据,让人觉得傻乎乎的。HTTP只是个行为准则,而TCP才是GET和POST怎么实现的基本。

针对“安全性”,我们常听到GET不如POST安全,因为POST用body传输数据,而GET用url传输,更加容易看到。但是从攻击的角度,无论是GET还是POST都不够安全,因为HTTP本身是明文协议。每个HTTP请求和返回的每个byte都会在网络上明文传播,不管是url,header还是body。

针对"长度限制",这里也有一个形象的说明:

在我大万维网世界中,还有另一个重要的角色:运输公司。不同的浏览器(发起http请求)和服务器(接受http请求)就是不同的运输公司。 虽然理论上,你可以在车顶上无限的堆货物(url中无限加参数)。但是运输公司可不傻,装货和卸货也是有很大成本的,他们会限制单次运输量来控制风险,数据量太大对浏览器和服务器都是很大负担。业界不成文的规定是,(大多数)浏览器通常都会限制url长度在2K个字节,而(大多数)服务器最多处理64K大小的url。超过的部分,恕不处理。如果你用GET服务,在request body偷偷藏了数据,不同服务器的处理方式也是不同的,有些服务器会帮你卸货,读出数据,有些服务器直接忽略,所以,虽然GET可以带request body,也不能保证一定能被接收到哦。

TCP和UDP的区别

什么是UDP?

UDP协议全称是用户数据报协议,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。在OSI模型中,在第四层——传输层,处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。

它有以下几个特点:

1.面向无连接

首先 UDP 是不需要和 TCP一样在发送数据前进行三次握手建立连接的,想发数据就可以开始发送了。并且也只是数据报文的搬运工,不会对数据报文进行任何拆分和拼接操作。具体来说就是:

  • 在发送端,应用层将数据传递给传输层的 UDP 协议,UDP 只会给数据增加一个 UDP 头标识下是 UDP 协议,然后就传递给网络层了
  • 在接收端,网络层将数据传递给传输层,UDP 只去除 IP 报文头就传递给应用层,不会任何拼接操作

2.有单播,多播,广播的功能

UDP 不止支持一对一的传输方式,同样支持一对多,多对多,多对一的方式,也就是说 UDP 提供了单播,多播,广播的功能。

3.UDP是面向报文的

发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付IP层。UDP对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。因此,应用程序必须选择合适大小的报文

4.不可靠性

首先不可靠性体现在无连接上,通信都不需要建立连接,想发就发,这样的情况肯定不可靠。

并且收到什么数据就传递什么数据,并且也不会备份数据,发送数据也不会关心对方是否已经正确接收到数据了。

再者网络环境时好时坏,但是 UDP 因为没有拥塞控制,一直会以恒定的速度发送数据。即使网络条件不好,也不会对发送速率进行调整。这样实现的弊端就是在网络条件不好的情况下可能会导致丢包,但是优点也很明显,在某些实时性要求高的场景(比如电话会议)就需要使用 UDP 而不是 TCP。

TCP和UDP的比较:

TCP和UDP的比较

OSI七层模型

OSI(open system interconnection,开放式系统互联参考模型)是一种概念模型,由国际标准化组织提出,一个试图使各种计算机在世界范围内互连为网络的标准框架。

该模型将通信系统中的数据流划分为七个层,从跨通信介质传输位的物理实现到分布式应用程序数据的最高层表示。每个中间层为其上一层提供功能,其自身功能则由其下一层提供。

自上而下七层分别是:

第7层 应用层

应用层(Application Layer)提供为应用软件而设计的接口,以设置与另一应用软件之间的通信。例如:HTTP、HTTPS、FTP、Telnet、SSH、SMTP、POP3等。

第6层 表示层

表示层(Presentation Layer)把数据转换为能与接收者的系统格式兼容并适合传输的格式。

第5层 会话层

会话层(Session Layer)负责在数据传输中设置和维护计算机网络中两台计算机之间的通信连接。

第4层 传输层

传输层(Transport Layer)把传输表头(TH)加至数据以形成数据包。传输表头包含了所使用的协议等发送信息。例如:传输控制协议(TCP)等。

第3层 网络层

网络层(Network Layer)决定数据的路径选择和转寄,将网络表头(NH)加至数据包,以形成分组。网络表头包含了网络资料。例如:互联网协议(IP)等。

第2层 数据链路层

数据链路层(Data Link Layer)负责网络寻址、错误侦测和改错。当表头和表尾被加至数据包时,会形成信息框(Data Frame)。数据链表头(DLH)是包含了物理地址和错误侦测及改错的方法。数据链表尾(DLT)是一串指示数据包末端的字符串。例如以太网、无线局域网(Wi-Fi)和通用分组无线服务(GPRS)等。

分为两个子层:逻辑链路控制(logical link control,LLC)子层和介质访问控制(Media access control,MAC)子层。

第1层 物理层

物理层(Physical Layer)在局部局域网上发送数据帧(Data Frame),它负责管理电脑通信设备和网络媒体之间的互通。包括了针脚、电压、线缆规范、集线器、中继器、网卡、主机接口卡等。

OSI和TCP/IP对应关系:

OSI和TCP/IP对应关系

王炸

一张图理清全域TCP/IP:

全域TCP/IP

参考

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值