文章将包含以下几方面内容:
HTTP协议解读与HTTP相关组件与HTTP相关协议HTTP组成HTTP协议优缺点HTTP协议解读HTTP是一种超文本传输协议(HypertextTransferProtocol),超文本传输协议可以进行文字分割:超文本(Hypertext)、传输(Transfer)、协议(Protocol),它们之间的关系如下:
分别对这三个名次做一个解释:
超文本两台电脑之间只能传输简单文字,后面还想要传输图片、音频、视频,甚至点击文字或图片能够进行超链接的跳转,那么文本的语义就被扩大了,这种语义扩大后的文本就被称为超文本(Hypertext)。
传输两台计算机之间会形成互联关系进行通信,我们存储的超文本会被解析成为二进制数据包,由传输载体(例如同轴电缆,***线,光缆)负责把二进制数据包由计算机终端传输到另一个终端的过程
协议网络协议就是网络中(包括互联网)传递、管理信息的一些规范
与HTTP相关组件网络设计者以分层(layer)的方式组织协议,每个协议属于层次模型之一。每一层都是向它的上一层提供服务(service),即所谓的服务模型(servicemodel)。每个分层中所有的协议称为协议栈(protocolstack)。因特网的协议栈由五个部分组成:物理层、链路层、网络层、传输层和应用层。我们采用自上而下的***研究其原理,也就是应用层->物理层的方式(了解)。
应用层应用层是网络应用程序和网络协议存放的分层,因特网的应用层包括许多协议。比如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协议的全称是Tran***issionControlProtocol的缩写,意思是传输控制协议,HTTP使用TCP作为通信协议,这是因为TCP是一种可靠的协议,而可靠能保证数据不丢失。
IP协议的全称是InternetProtocol的缩写,它主要解决的是通信双方寻址的问题。IP协议使用IP地址来标识互联网上的每一台计算机。
DNSDNS的全称是域名系统(DomainNameSystem,缩写:DNS),它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。比如:www.google.com->193.XXX.XXX.XXX
URI/URL可以通过输入www.google.com地址来访问谷歌的官网,输入的地址格式必须要满足URI的规范。
URI的全称是(UniformResourceIdentifier),中文名称是统一资源标识符,使用它就能够唯一地标记互联网上资源。
URL的全称是(UniformResourceLocator),中文名称是统一资源定位符,也就是我们俗称的网址,它实际上是URI的一个子集。
HTTP报文起始行(startline):描述请求或响应的基本信息;头部字段(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***自身不带验证机制,任何人都可以上传文件,存在安全性问题,因此一般的Web网站不使用该***。若配合Web应用程序的验证机制,或架构设计采用REST(REpresentationalStateTransfer,表征状态转移)标准的同类Web网站,就可能会***使用PUT***。HEAD获得响应首部,HEAD***和GET***一样,只是不返回报文主体部分。用于确认URI的有效性及资源更新的日期时间等。DELETE删除文件,DELETE***用来删除文件,是与PUT相反的***。DELETE***按请求URI删除指定的资源。OPTIONS询问支持的***,OPTIONS***用来查询针对请求URI指定的资源支持的***。TRACE追踪路径,TRACE***是让Web服务器端将之前的请求通信环回给客户端的***。CONNECT要求用隧道协议连接代理,CONNECT***要求在与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信。主要使用SSL(SecureSocketsLayer,安全套接层)和TLS(TransportLayerSecurity,传输层安全)协议把通信内容加密后经网络隧道传输。一般最常用的***也就是GET***和POST***,其他***暂时了解即可。
HTTP请求URL完整的域名解析一下URL:http://www.example.com:80/path/to/myfile.html?key1=value1&key2=value2#SomewhereInTheDocument
http://告诉浏览器使用何种协议。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.eduConnection:closeUser-agent:Mozilla/5.0Accept-language:fr复制代码Host:表示的是对象所在的主机Connection:close表示的是浏览器需要告诉服务器使用的是非持久连接。它要求服务器在发送完响应的对象后就关闭连接。User-agent:这是请求头用来告诉Web服务器,浏览器使用的类型是Mozilla/5.0,即Firefox浏览器。Accept-language告诉Web服务器,浏览器想要得到对象的法语版本。HTTP的请求标头分为四种:通用标头、请求标头、响应标头和实体标头
通用标头通用标头主要有三个,分别是Date、Cache-Control和ConnectionDate
Date出现在请求标头和响应标头中,它的基本表示如下
Date:Wed,21Oct201507:28:00GMT复制代码Cache-Control
Cache-Control可以出现在请求标头和响应标头中,Cache-Control的种类比较多,虽然说这是一个通用标头,但是又一些特性是请求标头具有的,有一些是响应标头才有的。主要大类有可缓存性、阈值性、重新验证并重新加载和其他特性
Connection
Connection决定当前事务(一次三次握手和四次挥手)完成后,是否会关闭网络连接。Connection有两种,一种是持久性连接,即一次事务完成后不关闭网络连接
Connection:keep-alive复制代码复制代码另一种是非持久性连接,即一次事务完成后关闭网络连接
Connection:close复制代码实体标头实体标头是描述消息正文内容的HTTP标头。实体标头用于HTTP请求和响应中。头部Content-Length、Content-Language、Content-Encoding是实体头。
Content-Length实体报头指示实体主体的大小,以字节为单位,发送到接收方。Content-Language实体报头描述了客户端或者服务端能够接受的语言,例如Content-Language:de-DEContent-Language:en-USContent-Language:de-DE,en-CA复制代码复制代码Content-Encoding这又是一个比较麻烦的属性,这个实体报头用来压缩媒体类型。Content-Encoding指示对实体应用了何种编码。常见的内容编码有这几种:gzip、compress、deflate、identity,这个属性可以应用在请求报文和响应报文中Accept-Encoding:gzip,deflate//请求头Content-Encoding:gzip//响应头复制代码请求标头GET/home.htmlHTTP/1.1Host:developer.mozilla.orgUser-Agent:Mozilla/5.0(Macintosh;IntelMacOSX10.9;rv:50.0)Gecko/20100101Firefox/50.0Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-Language:en-US,en;q=0.5Accept-Encoding:gzip,deflate,brReferer:https://developer.mozilla.org/testpage.htmlConnection:keep-aliveUpgrade-Insecure-Requests:1If-Modified-Since:Mon,18Jul201602:36:04GMTIf-None-Match:"c561c68d0ba92bbeb8b0fff2a9199f722e3a621a"Cache-Control:max-age=0复制代码Host
Host请求头指明了服务器的域名,以及(可选的)服务器监听的TCP端口号
Referer
HTTPReferer属性是请求标头的一部分,告诉服务器该网页是从哪个页面链接过来的
If-Modified-Since
HTTP的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,18Jul201602:36:04GMT复制代码复制代码If-None-Match
If-None-MatchHTTP请求标头使请求成为条件请求。对于GET和HEAD***,仅当服务器没有与给定资源匹配的ETag时,服务器才会以200状态发送回请求的资源。对于其他***,仅当最终现有资源的ETag与列出的任何值都不匹配时,才会处理请求。
If-None-Match:"c561c68d0ba92bbeb8b0fff2a9199f722e3a621a"复制代码复制代码内容协商内容协商机制是指客户端和服务器端就响应的资源内容进行交涉,然后提供给客户端最为适合的资源。内容协商会以响应资源的语言、字符集、编码方式等作为判断的标准。
内容协商主要有以下3种类型:
服务器驱动协商(Server-drivenNegotiation)这种协商方式是由服务器端进行内容协商。服务器端会根据请求首部字段进行自动处理
客户端驱动协商(Agent-drivenNegotiation)这种协商方式是由客户端来进行内容协商。
透明协商(TransparentNegotiation)是服务器驱动和客户端驱动的结合体,是由服务器端和客户端各自进行内容协商的一种***。
内容协商的分类有很多种,主要的几种类型是Accept、Accept-Charset、Accept-Encoding、Accept-Language、Content-Language。
Accept
接受请求HTTP标头会通告客户端其能够理解的MIME类型
MIME:MIME(MultipurposeInternetMailExtensions)是描述消息内容类型的因特网标准。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。
q
MIME
1.0
text/html
1.0
application/xhtml+xml
0.9
application/xml
0.8
*/*
Accept-Charset
accept-charset属性规定服务器处理表单数据所接受的字符集。
accept-charset属性允许您指定一系列字符集,服务器必须支持这些字符集,从而得以正确解释表单中的数据。
Accept-Language
首部字段Accept-Language用来告知服务器用户代理能够处理的自然语言集(指中文或英文等),以及自然语言集的相对优先级。
Accept-Language:en-US,en;q=0.5复制代码响应标头响应标头是可以在HTTP响应中使用的HTTP标头。并不是所有出现在响应中的标头都是响应标头。还有一些特殊的我们上面说过,有通用标头和实体标头也会出现在响应标头中,比如Content-Length就是一个实体标头,但是,在这种情况下,这些实体请求通常称为响应头。下面以一个例子为例和你探讨一下响应头
200OKAccess-Control-Allow-Origin:*Connection:Keep-AliveContent-Encoding:gzipContent-Type:text/html;charset=utf-8Date:Mon,18Jul201616:06:00GMTEtag:"c561c68d0ba92bbeb8b0f612a9199f722e3a621a"Keep-Alive:timeout=5,max=997Last-Modified:Mon,18Jul201602:36:04GMTServer:ApacheSet-Cookie:mykey=myvalue;expires=Mon,17-Jul-201716:06:00GMT;Max-Age=31449600;Path=/;secureTransfer-Encoding:chunkedVary:Cookie,Accept-Encodingx-frame-options:DENY复制代码响应状态码
以2xx为开头的都表示请求成功响应。
状态码
含义
200
成功响应
204
请求处理成功,但是没有资源可以返回
206
对资源某一部分进行响应,由Content-Range指定范围的实体内容。
以3xx为开头的都表示需要进行附加操作以完成请求
状态码
含义
301
永久性重定向,该状态码表示请求的资源已经重新分配URI,以后应该使用资源现有的URI
302
临时性重定向。该状态码表示请求的资源已被分配了新的URI,希望用户(本次)能使用新的URI访问。
303
该状态码表示由于请求对应的资源存在着另一个URI,应使用GET***定向获取请求的资源。
304
该状态码表示客户端发送附带条件的请求时,服务器端允许请求访问资源,但未满足条件的情况。
307
临时重定向。该状态码与302Found有着相同的含义。
以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
如果本文对你有帮助,麻烦转发关注支持一下