文章将包含以下几方面内容:HTTP协议解读与HTTP相关组件与HTTP相关协议HTTP组成HTTP协议优缺点HTTP协议解读HTTP 是一种 超文本传输协议(Hypertext Transfer Protocol),超文本传输协议可以进行文字分割:超文本(Hypertext)、传输(Transfer)、协议(Protocol) ,它们之间的关系如下:分别对这三个名次做一个解释:超文本两台电脑之间只能传输简单文字,后面还想要传输图片、音频、视频,甚至点击文字或图片能够进行超链接的跳转,那么文本的语义就被扩大了,这种语义扩大后的文本就被称为超文本(Hypertext)。传输两台计算机之间会形成互联关系进行通信,我们存储的超文本会被解析成为二进制数据包,由传输载体(例如同轴电缆,电话线,光缆)负责把二进制数据包由计算机终端传输到另一个终端的过程协议网络协议就是网络中(包括互联网)传递、管理信息的一些规范与HTTP相关组件网络设计者以分层(layer)的方式组织协议,每个协议属于层次模型之一。每一层都是向它的上一层提供服务(service),即所谓的服务模型(service model)。每个分层中所有的协议称为 协议栈(protocol stack)。因特网的协议栈由五个部分组成:物理层、链路层、网络层、传输层和应用层。我们采用自上而下的方法研究其原理,也就是应用层 -> 物理层的方式(了解)。应用层应用层是网络应用程序和网络协议存放的分层,因特网的应用层包括许多协议。比如HTTP,电子邮件传送协议 SMTP、端系统文件上传协议 FTP、还有为我们进行域名解析的 DNS 协议传输层输层在应用程序断点之间传送应用程序报文,在这一层主要有两种传输协议 TCP和 UDP。TCP 是面向连接的,它能够控制并确认报文是否到达,并提供了拥塞机制来控制网络传输,因此当网络拥塞时,会抑制其传输速率。UDP 协议向它的应用程序提供了无连接服务。它是不具备可靠性的,没有流量控制,也没有拥塞控制。我们把运输层的分组称为 报文段(segment)网络层网络层负责将称为 数据报(datagram) 的网络分层从一台主机移动到另一台主机。网络层一个非常重要的协议是 IP 协议,所有具有网络层的因特网组件都必须运行 IP 协议。链路层为了将分组从一个节点(主机或路由器)运输到另一个节点,网络层必须依靠链路层提供服务。链路层的例子包括以太网、WiFi 和电缆接入的 DOCSIS 协议,因为数据从源目的地传送通常需要经过几条链路,一个数据包可能被沿途不同的链路层协议处理,我们把链路层的分组称为 帧(frame)。物理层虽然链路层的作用是将帧从一个端系统运输到另一个端系统,而物理层的作用是将帧中的一个个 比特 从一个节点运输到另一个节点,,物理层的协议仍然使用链路层协议,这些协议与实际的物理传输介质有关,例如,以太网有很多物理层协议:关于双绞铜线、关于同轴电缆、关于光纤等等。五层网络协议的示意图如下:与HTTP相关协议HTTP 属于应用层的协议,需要其他层次协议的配合完成信息的交换,在完成一次 HTTP 请求和响应的过程中,需要以下协议的配合:TCP/IPTCP/IP 我们一般称之为协议簇,什么意思呢?就是 TCP/IP 协议簇中不仅仅只有 TCP 协议和 IP 协议,它是一系列网络通信协议的统称。而其中最核心的两个协议就是 TCP / IP 协议,其他的还有 UDP、ICMP、ARP 等等,共同构成了一个复杂但有层次的协议栈。TCP 协议的全称是 Transmission Control Protocol 的缩写,意思是传输控制协议,HTTP 使用 TCP 作为通信协议,这是因为 TCP 是一种可靠的协议,而可靠能保证数据不丢失。IP 协议的全称是 Internet Protocol 的缩写,它主要解决的是通信双方寻址的问题。IP 协议使用 IP 地址 来标识互联网上的每一台计算机。DNSDNS 的全称是域名系统(Domain Name System,缩写:DNS),它作为将域名和 IP 地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。比如:www.google.com -> 193.XXX.XXX.XXXURI / URL可以通过输入 www.google.com 地址来访问谷歌的官网,输入的地址格式必须要满足 URI 的规范。URI的全称是(Uniform Resource Identifier),中文名称是统一资源标识符,使用它就能够唯一地标记互联网上资源。URL的全称是(Uniform Resource Locator),中文名称是统一资源定位符,也就是我们俗称的网址,它实际上是 URI 的一个子集。HTTP报文起始行(start line):描述请求或响应的基本信息;头部字段(header):使用 key-value 形式更详细地说明报文;消息正文(entity):实际传输的数据,它不一定是纯文本,可以是图片、视频等二进制数据。起始行和头部字段并成为 请求头 或者 响应头,统称为 Header;消息正文也叫做实体,称为 body。HTTP 协议规定每次发送的报文必须要有 Header,但是可以没有 body,在 header 和 body 之间必须要有一个空行(CRLF)。举个例子:http://www.someSchool.edu/someDepartment/home.index 请求的请求头:报文的起始行都是由三个字段组成:方法、URL 字段和 HTTP 版本字段。HTTP 请求方法GET 获取资源,GET 方法用来请求访问已被 URI 识别的资源。指定的资源经服务器端解析后返回响应内容。POST 传输实体,使用 POST 传输实体信息,提交表格内容。PUT 传输文件,PUT 方法用来传输文件。就像 FTP 协议的文件上传一样,要求在请求报文的主体中包含文件内容,然后保存到请求 URI 指定的位置。 但是,鉴于 HTTP 的 PUT 方法自身不带验证机制,任何人都可以上传文件 , 存在安全性问题,因此一般的 W eb 网站不使用该方法。若配合 W eb 应用程序的验证机制,或架构设计采用REST(REpresentational State Transfer,表征状态转移)标准的同类 Web 网站,就可能会开放使用 PUT 方法。HEAD 获得响应首部,HEAD 方法和 GET 方法一样,只是不返回报文主体部分。用于确认 URI 的有效性及资源更新的日期时间等。DELETE 删除文件,DELETE 方法用来删除文件,是与 PUT 相反的方法。DELETE 方法按请求 URI 删除指定的资源。OPTIONS 询问支持的方法,OPTIONS 方法用来查询针对请求 URI 指定的资源支持的方法。TRACE 追踪路径,TRACE 方法是让 Web 服务器端将之前的请求通信环回给客户端的方法。CONNECT 要求用隧道协议连接代理,CONNECT 方法要求在与代理服务器通信时建立隧道,实现用隧道协议进行 TCP 通信。主要使用 SSL(Secure Sockets Layer,安全套接层)和 TLS(Transport Layer Security,传输层安全)协议把通信内容加 密后经网络隧道传输。一般最常用的方法也就是 GET 方法和 POST 方法,其他方法暂时了解即可。HTTP 请求 URL完整的域名解析一下 URL:http://www.example.com:80/path/to/myfile.html?key1=value1&key2=value2#SomewhereInTheDocumenthttp://告诉浏览器使用何种协议。www.example.com 是域名、主机,指示了需要向网络上的哪一台主机发起请求。也可以直接向主机的ip发起请求。端口 两个主机之间要发起 TCP 连接需要两个条件,主机 + 端口,表示用于访问 Web 服务器上资源的入口,如果访问的该 Web 服务器使用HTTP协议的标准端口(HTTP为80,HTTPS为443)授予对其资源的访问权限,则通常省略此部分。否则端口就是 URI 必须的部分。路径 /path/to/myfile.html 是 Web 服务器上资源的路径。以端口后面的第一个 / 开始,到 ? 号之前结束,中间的 每一个/ 都代表了层级(上下级)关系。查询参数?key1=value1&key2=value2 是提供给 Web 服务器的额外参数。如果是 GET 请求,一般带有请求 URL 参数,如果是 POST 请求,则不会在路径后面直接加参数。锚点 #SomewhereInTheDocument 是资源本身的某一部分的一个锚点。锚点代表资源内的一种“书签”。请求头部比如http://www.someSchool.edu/someDepartment/home.index,来看一下它的请求头部Host: www.someschool.edu
Connection: close
User-agent: Mozilla/5.0
Accept-language: fr
复制代码Host :表示的是对象所在的主机Connection: close 表示的是浏览器需要告诉服务器使用的是非持久连接。它要求服务器在发送完响应的对象后就关闭连接。User-agent: 这是请求头用来告诉 Web 服务器,浏览器使用的类型是 Mozilla/5.0,即 Firefox 浏览器。Accept-language 告诉 Web 服务器,浏览器想要得到对象的法语版本。HTTP 的请求标头分为四种: 通用标头、请求标头、响应标头 和 实体标头通用标头通用标头主要有三个,分别是 Date、Cache-Control 和 Connection DateDate 出现在请求标头和响应标头中,它的基本表示如下Date: Wed, 21 Oct 2015 07:28:00 GMT
复制代码Cache-ControlCache-Control 可以出现在请求标头和响应标头中,Cache-Control 的种类比较多,虽然说这是一个通用标头,但是又一些特性是请求标头具有的,有一些是响应标头才有的。主要大类有 可缓存性、阈值性、 重新验证并重新加载 和其他特性ConnectionConnection 决定当前事务(一次三次握手和四次挥手)完成后,是否会关闭网络连接。Connection 有两种,一种是持久性连接,即一次事务完成后不关闭网络连接Connection: keep-alive
复制代码
复制代码另一种是非持久性连接,即一次事务完成后关闭网络连接Connection: close
复制代码实体标头实体标头是描述消息正文内容的 HTTP 标头。实体标头用于 HTTP 请求和响应中。头部Content-Length、 Content-Language、 Content-Encoding 是实体头。Content-Length 实体报头指示实体主体的大小,以字节为单位,发送到接收方。Content-Language 实体报头描述了客户端或者服务端能够接受的语言,例如Content-Language: de-DE
Content-Language: en-US
Content-Language: de-DE, en-CA
复制代码
复制代码Content-Encoding 这又是一个比较麻烦的属性,这个实体报头用来压缩媒体类型。Content-Encoding 指示对实体应用了何种编码。 常见的内容编码有这几种: gzip、compress、deflate、identity ,这个属性可以应用在请求报文和响应报文中Accept-Encoding: gzip, deflate //请求头
Content-Encoding: gzip //响应头
复制代码请求标头GET /home.html HTTP/1.1
Host: developer.mozilla.org
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: https://developer.mozilla.org/testpage.html
Connection: keep-alive
Upgrade-Insecure-Requests: 1
If-Modified-Since: Mon, 18 Jul 2016 02:36:04 GMT
If-None-Match: "c561c68d0ba92bbeb8b0fff2a9199f722e3a621a"
Cache-Control: max-age=0
复制代码HostHost 请求头指明了服务器的域名,以及(可选的)服务器监听的TCP端口号RefererHTTP Referer 属性是请求标头的一部分,告诉服务器该网页是从哪个页面链接过来的If-Modified-SinceHTTP 的 If-Modified-Since 使其成为条件请求:返回200,只有在给定日期的最后一次修改资源后,服务器才会以200状态发送回请求的资源。如果请求从开始以来没有被修改过,响应会返回304并且没有任何响应体If-Modified-Since 通常会与 If-None-Match 搭配使用,If-Modified-Since 用于确认代理或客户端拥有的本地资源的有效性。获取资源的更新日期时间,可通过确认首部字段 Last-Modified 来确定。大白话说就是如果在 Last-Modified 之后更新了服务器资源,那么服务器会响应200,如果在 Last-Modified 之后没有更新过资源,则返回 304。If-Modified-Since: Mon, 18 Jul 2016 02:36:04 GMT
复制代码
复制代码If-None-MatchIf-None-Match HTTP请求标头使请求成为条件请求。 对于 GET 和 HEAD 方法,仅当服务器没有与给定资源匹配的 ETag 时,服务器才会以200状态发送回请求的资源。 对于其他方法,仅当最终现有资源的ETag与列出的任何值都不匹配时,才会处理请求。If-None-Match: "c561c68d0ba92bbeb8b0fff2a9199f722e3a621a"
复制代码
复制代码内容协商内容协商机制是指客户端和服务器端就响应的资源内容进行交涉,然后提供给客户端最为适合的资源。内容协商会以响应资源的语言、字符集、编码方式等作为判断的标准。内容协商主要有以下3种类型:服务器驱动协商(Server-driven Negotiation)这种协商方式是由服务器端进行内容协商。服务器端会根据请求首部字段进行自动处理客户端驱动协商(Agent-driven Negotiation)这种协商方式是由客户端来进行内容协商。透明协商(Transparent Negotiation)是服务器驱动和客户端驱动的结合体,是由服务器端和客户端各自进行内容协商的一种方法。内容协商的分类有很多种,主要的几种类型是 Accept、Accept-Charset、Accept-Encoding、Accept-Language、Content-Language。Accept接受请求 HTTP 标头会通告客户端其能够理解的 MIME 类型MIME: MIME (Multipurpose Internet Mail Extensions) 是描述消息内容类型的因特网标准。MIME 消息能包含文本、图像、音频、视频以及其他应用程序专用的数据。
复制代码文本文件: text/html、text/plain、text/css、application/xhtml+xml、application/xml图片文件: image/jpeg、image/gif、image/png视频文件: video/mpeg、video/quicktime应用程序二进制文件: application/octet-stream、application/zip比如,如果浏览器不支持 PNG 图片的显示,那 Accept 就不指定image/png,而指定可处理的 image/gif 和 image/jpeg 等图片类型。一般 MIME 类型也会和 q 这个属性一起使用,q 是什么?q 表示的是权重,来看一个例子Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
复制代码若想要给显示的媒体类型增加优先级,则使用 q= 来额外表示权重值,没有显示权重的时候默认值是1.0。qMIME1.0text/html1.0application/xhtml+xml0.9application/xml0.8* / *Accept-Charsetaccept-charset 属性规定服务器处理表单数据所接受的字符集。accept-charset 属性允许您指定一系列字符集,服务器必须支持这些字符集,从而得以正确解释表单中的数据。Accept-Language首部字段 Accept-Language 用来告知服务器用户代理能够处理的自然语言集(指中文或英文等),以及自然语言集的相对优先级。Accept-Language: en-US,en;q=0.5
复制代码响应标头响应标头是可以在 HTTP 响应中使用的 HTTP 标头。并不是所有出现在响应中的标头都是响应标头。还有一些特殊的我们上面说过,有通用标头和实体标头也会出现在响应标头中,比如 Content-Length 就是一个实体标头,但是,在这种情况下,这些实体请求通常称为响应头。下面以一个例子为例和你探讨一下响应头200 OK
Access-Control-Allow-Origin: *
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8
Date: Mon, 18 Jul 2016 16:06:00 GMT
Etag: "c561c68d0ba92bbeb8b0f612a9199f722e3a621a"
Keep-Alive: timeout=5, max=997
Last-Modified: Mon, 18 Jul 2016 02:36:04 GMT
Server: Apache
Set-Cookie: mykey=myvalue; expires=Mon, 17-Jul-2017 16:06:00 GMT; Max-Age=31449600; Path=/; secure
Transfer-Encoding: chunked
Vary: Cookie, Accept-Encoding
x-frame-options: DENY
复制代码响应状态码以 2xx 为开头的都表示请求成功响应。状态码含义200成功响应204请求处理成功,但是没有资源可以返回206对资源某一部分进行响应,由Content-Range 指定范围的实体内容。以 3xx 为开头的都表示需要进行附加操作以完成请求状态码含义301永久性重定向,该状态码表示请求的资源已经重新分配 URI,以后应该使用资源现有的 URI302临时性重定向。该状态码表示请求的资源已被分配了新的 URI,希望用户(本次)能使用新的 URI 访问。303该状态码表示由于请求对应的资源存在着另一个 URI,应使用 GET 方法定向获取请求的资源。304该状态码表示客户端发送附带条件的请求时,服务器端允许请求访问资源,但未满足条件的情况。307临时重定向。该状态码与 302 Found 有着相同的含义。以 4xx 的响应结果表明客户端是发生错误的原因所在。状态码含义400该状态码表示请求报文中存在语法错误。当错误发生时,需修改请求的内容后再次发送请求。401该状态码表示发送的请求需要有通过 HTTP 认证(BASIC 认证、DIGEST 认证)的认证信息。403该状态码表明对请求资源的访问被服务器拒绝了。404该状态码表明服务器上无法找到请求的资源。以 5xx 为开头的响应标头都表示服务器本身发生错误状态码含义500该状态码表明服务器端在执行请求时发生了错误。503该状态码表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。HTTP协议优缺点HTTP 的优点简单灵活易扩展HTTP 的协议比较简单,它的主要组成就是 header + body,头部信息也是简单的文本格式HTTP 协议又多了灵活 和 易扩展 的优点。HTTP 协议里的请求方法、URI、状态码、原因短语、头字段等每一个核心组成要素都没有被制定死,允许开发者任意定制、扩充或解释,给予了浏览器和服务器最大程度的信任和自由。应用广泛、环境成熟天然具有跨语言、跨平台的优越性,而且,因为本身的简单特性很容易实现,所以几乎所有的编程语言都有 HTTP 调用库和外围的开发测试工具无状态既是优点又是缺点。因为服务器没有记忆能力,所以就不需要额外的资源来记录状态信息,不仅实现上会简单一些,而且还能减轻服务器的负担,能够把更多的 CPU 和内存用来对外提供服务。HTTP 的缺点无状态服务器没有记忆能力,它就无法支持需要连续多个步骤的事务操作。每次都得问一遍身份信息,需要增加了不必要的数据传输量。由此出现了 Cookie 技术。安全性明文传输,协议里的报文(准确地说是 header 部分)不使用二进制数据,而是用简单可阅读的文本形式。对比 TCP、UDP 这样的二进制协议,它的优点显而易见,不需要借助任何外部工具,用浏览器、Wireshark 或者 tcpdump 抓包后,直接用肉眼就可以很容易地查看或者修改,为我们的开发调试工作带来极大的便利。当然缺点也是显而易见的,就是不安全,可以被监听和被窥探。因为无法判断通信双方的身份,不能判断报文是否被更改过。总结起来即:明文,请求报文未加密;未hash,即使报文被修改过也不知道;未验证身份,容易导致中间人攻击;作者:captain_p链接:https://juejin.cn/post/7041744237905346568如果本文对你有帮助,麻烦转发关注支持一下
本文出自快速备案,转载时请注明出处及相应链接。