HTTP协议详解

HTTP工作原理

HTTP(Hyper Text Transer Protocol),基于TCP/IP的应用层协议,工作于C/S服务架构,用于服务器和客户端之间传送超文本(超文本就是用超链接的方法,将各种不同时空的文字信息组织在一起的网状文本,)的传送协议。超文本更是一种用户界面范式,用以显示文本及与文本之间相关的内容,超文本有许多种格式,其中最为广泛运用的是HTML。

HTTP工作于客户端-服务端架构上,HTTP默认端口号为80,但是你也可以改为8080或者其他端口,HTTP是明文数据传输。

  1. HTTP是无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
  2. HTTP是媒体独立的:这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。正在传输的类型由Content-Type加以标记。
  3. HTTP是无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
    HTTP协议详解_第1张图片

HTTP报文格式

HTTP请求由三部分组成,分别是:请求行、请求头、请求体。
HTTP协议详解_第2张图片
请求行由请求方法字段Request Method、URL字段和HTTP协议版本字段3个字段组成。

请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息,典型的请求头有:
HTTP协议详解_第3张图片
Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。
Accept:客户端可识别的内容类型列表。
User-Agent:产生请求的浏览器类型。
HTTP协议详解_第4张图片
响应:
HTTP协议详解_第5张图片

Status code

1** 信息,服务器收到请求,需要请求者继续执行操作。
2** 成功,操作被成功接收并处理。
3** 重定向,需要进一步的操作以完成请求。
4** 客户端错误,请求包含语法错误或无法完成请求。
5** 服务器错误,服务器在处理请求的过程中发生了错误。

100 Continue 继续。客户端应继续其请求
101 Switching Protocols 切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议

200 OK 请求成功。一般用于GET与POST请求
201 Created 已创建。成功请求并创建了新的资源
202 Accepted 已接受。已经接受请求,但未处理完成
203 Non-Authoritative Information 非授权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本
204 No Content 无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档
205 Reset Content 重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域
206 Partial Content 部分内容。服务器成功处理了部分GET请求

300 Multiple Choices 多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择
301 Moved Permanently 永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替
302 Found 临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI
303 See Other 查看其它地址。与301类似。使用GET和POST请求查看
304 Not Modified 未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源
305 Use Proxy 使用代理。所请求的资源必须通过代理访问
306 Unused 已经被废弃的HTTP状态码
307 Temporary Redirect 临时重定向。与302类似。使用GET请求重定向

400 Bad Request 客户端请求的语法错误,服务器无法理解
401 Unauthorized 请求要求用户的身份认证
402 Payment Required 保留,将来使用
403 Forbidden 服务器理解请求客户端的请求,但是拒绝执行此请求
404 Not Found 服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面
405 Method Not Allowed 客户端请求中的方法被禁止
406 Not Acceptable 服务器无法根据客户端请求的内容特性完成请求
407 Proxy Authentication Required 请求要求代理的身份认证,与401类似,但请求者应当使用代理进行授权
408 Request Time-out 服务器等待客户端发送的请求时间过长,超时
409 Conflict 服务器完成客户端的 PUT 请求时可能返回此代码,服务器处理请求时发生了冲突
410 Gone 客户端请求的资源已经不存在。410不同于404,如果资源以前有现在被永久删除了可使用410代码,网站设计人员可通过301代码指定资源的新位置
411 Length Required 服务器无法处理客户端发送的不带Content-Length的请求信息
412 Precondition Failed 客户端请求信息的先决条件错误
413 Request Entity Too Large 由于请求的实体过大,服务器无法处理,因此拒绝请求。为防止客户端的连续请求,服务器可能会关闭连接。如果只是服务器暂时无法处理,则会包含一个Retry-After的响应信息
414 Request-URI Too Large 请求的URI过长(URI通常为网址),服务器无法处理
415 Unsupported Media Type 服务器无法处理请求附带的媒体格式
416 Requested range not satisfiable 客户端请求的范围无效
417 Expectation Failed 服务器无法满足Expect的请求头信息

500 Internal Server Error 服务器内部错误,无法完成请求
501 Not Implemented 服务器不支持请求的功能,无法完成请求
502 Bad Gateway 作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应
503 Service Unavailable 由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中
504 Gateway Time-out 充当网关或代理的服务器,未及时从远端服务器获取请求
505 HTTP Version not supported 服务器不支持请求的HTTP协议的版本,无法完成处理

常用:
200-ok 访问成功
301-moved permanently 永久跳转
403-Forbidden 禁止访问,服务端设置了相关权限,客户端没有权限去访问 404-Not Found 没有找到访问的页面,客户端请求的页面不存在
408-Request Time-out 服务器等待客户端发送的请求时间过长,超时
500-Internal servr error 内部服务器错误
502-Bad gateway 坏的网关
503-Service Unavailble 服务不可用,服务超载或停机
504-Gateway Timeout 网关超时,没有在特定时间内处理请求

Request method

  • GET:请求指定的页面信息,并返回实体主体。
  • HEAD 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头
  • POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
  • PUT:从客户端向服务器传送的数据取代指定的文档的内容。
  • DELETE:请求服务器删除指定的页面。
  • CONNECT HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。
  • OPTIONS:允许客户端查看服务器的性能。
  • TRACE:回显服务器收到的请求,主要用于测试或诊断。
  • PATCH:是对 PUT方法的补充,用来对已知资源进行局部更新 。

HTTP1.0 HTTP1.1

HTTP一共有三个版本:HTTP1.0 HTTP1.1 HTTP2.0

http1.0默认是短连接,每次于服务器交互时,都需要开启一个新连接,而TCP的连接和断开的开销是很大的。

http1.1采用持久连接,多次请求都由同一连接完成,http1.1需要新的请求头,如 Connection:keep-alive就表示采用持久连接,同时还增加了host字段,如果没有host就会报出400语法错误。

https1.1还采用了pipeline处理,例如:一个包含有许多图像的网页文件的多个请求和应答可以在一个连接中传输,但每个单独的网页文件的请求和应答仍然需要使用各自的连接。 HTTP 1.1还允许客户端不用等待上一次请求结果返回,就可以发出下一次请求,但服务器端必须按照接收到客户端请求的先后顺序依次回送响应结果,以保证客户端能够区分出每次请求的响应内容。

HTTP2.0

https://http2.akamai.com/demo

HTTP协议详解_第6张图片
HTTP1.x缺点:
当其中一个请求非常耗时,后面的请求就会被堵塞,在pipeline中,client还是需要按照响应的顺序来接收的,不论http1.x是否采用pipeline来处理请求,都会出现线头阻塞(Head of line blokcing)。
HTTP协议详解_第7张图片

二进制分帧

HTTP2.0中所有加强性能的核心是二进制传输,在HTTP1.x中,我们是通过文本的方式传输数据。基于文本的方式传输数据存在很多缺陷,文本的表现形式有多样性,因此要做到健壮性考虑的场景必然有很多,但是二进制则不同,只有0和1的组合,因此选择了二进制传输,实现方便且健壮。在HTTP2.0中引入了新的编码机制,所有传输的数据都会被分割,并采用二进制格式编码。

为了保证HTTP不受影响,那就需要在应用层(HTTP2.0)和传输层(TCP or UDP)之间增加一个二进制分帧层。在二进制分帧层上,HTTP2.0会将所有传输的信息分为更小的消息和帧,并采用二进制格式编码,其中HTTP1.x的首部信息会被封装到Headers帧,而Request Body则封装到Data帧。
HTTP协议详解_第8张图片

多路复用

HTTP2.0下的多个请求都会使用同一连接并行执行:
HTTP2.0中,有两个概念非常重要:帧(frame)和流(stream)。

帧是最小的数据单位,每个帧会标识出该帧属于哪个流,流是多个帧组成的数据流。
所谓多路复用,即在一个TCP连接中存在多个流,即可以同时发送多个请求,对端可以通过帧中的表示知道该帧属于哪个请求。在客户端,这些帧乱序发送,到对端后再根据每个帧首部的流标识符重新组装。通过该技术,可以避免HTTP旧版本的队头阻塞问题,极大提高传输性能。
HTTP协议详解_第9张图片

Head压缩

在HTTP1.0中,我们使用文本的形式传输header,在header中携带cookie的话,每次都需要重复传输几百到几千的字节,这着实是一笔不小的开销。

在HTTP2.0中,我们使用了HPACK(HTTP2头部压缩算法)压缩格式对传输的header进行编码,减少了header的大小。并在两端维护了索引表,用于记录出现过的header,后面在传输过程中就可以传输已经记录过的header的键名,对端收到数据后就可以通过键名找到对应的值。

服务器推送

服务端推送是一种在客户端请求之前发送数据的机制。在HTTP2.0中,服务器可以对一个客户端的请求发送多个响应。如果一个请求是由你的主页发送的,服务器可能会响应主页内容、logo以及样式表,因为他知道客户端会用到这些东西。这样不但减轻了数据传送冗余步骤,也加快了页面响应的速度,提高了用户体验。
HTTP协议详解_第10张图片

HTTPS

HTTPS = HTTP + SSL,使用443端口,通过SSL/TSL将HTTP明文加密。
SSL/TSL
运作在传输层,SSL(Secure Sockets Layer 安全套接字协议),TSL(Transport Layer Security)。
HTTP协议详解_第11张图片
非对称加密算法(公钥加密)
RSA、DSA/DSS、Elgamal、Rabin、D-H、ECC等。在客户端与服务器相互验证的过程中用的就是非对称加密算法RSA密码体制就是公钥密码体制,RSA的一对公钥和私钥都可以用来加密和解密。比如公钥加密后只能由私钥解密;私钥加密后只能由公钥解密。且一方加密的内容只能由对方进行解密。

对称加密算法(私钥加密)
AES、DES、3DES、TDEA、Blowfish、RC4、RC5、IDEA等。加密使用的密钥和解密使用的密钥是同一个密钥。由于加密算法是公开的,若要保证安全性,密钥不能对外公开。通常用来加密消息体。

对称加密和对称加密
对称加密相比非对称加密算法来说,加解密的效率要高得多、加密速度快。但是缺陷在于对于密钥的管理和分发上比较困难,不是非常安全,密钥管理负担很重。
非对称加密安全性更高,公钥是公开的,密钥是自己保存的,不需要将私钥给别人。缺点:加密和解密花费时间长、速度慢,只适合对少量数据进行加密。

HASH算法
有MD5,SHA1,SHA256。用来确认信息没有被篡改。主要用来生成签名,签名是加在信息后面的,可以证明信息没有被修改过。一般对信息先做hash计算得到一个hash值,然后用私钥加密(这个加密一般是非对称加密)作为一个签名和信息一起发送。接收方收到信息后重新计算信息的hash值,且和信息所附带的hash值解密后进行对比。如果一样则认为没有被修改,反之则认为修改过,不做处理。可能有一种情况,黑客修改了信息并把hash值也改了,从而让他们相匹配。所以hash值一般都是加密后(生成签名)再和信息一起发送,确保hash值不会被修改。
HTTP协议详解_第12张图片

CA

CA certificate authority ,证书包含以下信息:申请者公钥、申请者的组织信息和个人信息、签发机构 CA 的信息、有效时间、证书序列号等信息的明文,同时包含一个签名。
HTTP协议详解_第13张图片

HTTPS的优缺点

优点:

  1. http是明文的,数据一旦被劫持,就可以查询到里面的信息,同时http不一定保证通信的双方是合法的。同时当数据被篡改后,接收方也发现不了。而https数据是加密的,通信双方用ca证书证明合法身份,https对数据做了摘要,当被篡改时就会被感知到,确保数据的完整性。

缺点:

  1. 相同网络环境下,HTTPS 协议会使页面的加载时间延长近 50%,增加 10%到 20%的耗电。此外,HTTPS
    协议还会影响缓存,增加数据开销和功耗 。
  2. HTTPS 协议的安全是有范围的,在黑客攻击、拒绝服务攻击和服务器劫持等方面几乎起不到什么作用。
  3. 最关键的是,SSL 证书的信用链体系并不安全。特别是在某些国家可以控制 CA 根证书的情况下,中间人攻击一样可行。
  4. 成本增加。部署 HTTPS 后,因为 HTTPS 协议的工作要增加额外的计算资源消耗,例如 SSL 协议加密算法和 SSL 交互次数将占用一定的计算资源和服务器成本。在大规模用户访问应用的场景下,服务器需要频繁地做加密和解密操作,几乎每一个字节都需要做加解密,这就产生了服务器成本。随着云计算技术的发展,数据中心部署的服务器使用成本在规模增加后逐步下降,相对于用户访问的安全提升,其投入成本已经下降到可接受程度。

面试题

1. 浏览器访问HTTPS经历

首先客户端发起访问,服务器端返回CA证书(包含公钥),客户端收到后就会验证CA,然后使用随机数生成主密钥,使用公钥加密主密钥,用主密钥加密数据,然后发送给服务器,服务器拿到后,使用私钥解密出主密钥,再使用主密钥解密数据。

2. https一定是安全的,有可能存在哪些隐患?

SSL 证书的信用链体系并不安全,只要在发送端获取到主密钥就可以监听了。

3. 请求方法有哪些,什么含义?get 和 post 有什么不一样 ?

get:
GET方法用于使用给定的URI从给定服务器中检索信息,即从指定资源中请求数据。使用GET方法的请求应该只是检索数据,并且不应对数据产生其他影响。
GET请求是可以缓存的,我们可以从浏览器历史记录中查找到GET请求,还可以把它收藏到书签

通过请求行来携带参数,参数会显示在地址栏上,其大小有限制小于2k。

post:

POST方法用于将数据发送到服务器以创建或更新资源,它要求服务器确认请求中包含的内容作为由URI区分的Web资源的另一个下属。
POST请求永远不会被缓存,且对数据长度没有限制;我们无法从浏览器历史记录中查找到POST请求。

通过请求体来携带参数,参数不会显示在地址栏上,没有大小限制。

head:

HEAD方法与GET方法相同,但没有响应体,仅传输状态行和标题部分。这对于恢复相应头部编写的元数据非常有用,而无需传输整个内容。

put:

PUT方法用于将数据发送到服务器以创建或更新资源,它可以用上传的内容替换目标资源中的所有当前内容。
它会将包含的元素放在所提供的URI下,如果URI指示的是当前资源,则会被改变。如果URI未指示当前资源,则服务器可以使用该URI创建资源。

delete:

DELETE方法用来删除指定的资源,它会删除URI给出的目标资源的所有当前内容。

4. HTTP的请求报文结构

三部分组成,分别是:请求行、请求头、请求体。
请求行由请求方法字段Request Method、URL字段和HTTP协议版本字段3个字段组成。请求头是由键值对组成,常见的有user-agent、referrer。

5.http的响应报文结构?

三部分组成,分别是:响应行、响应头、响应体。
响应行:由协议版本、状态码等等组成。

你可能感兴趣的:(http,https,网络,计算机网络)