网络之HTTP协议

一 什么是HTTP协议

HTTP是Hyper Transfer Protocol的缩写,中文翻译为超文本传输协议,是一种用于分布式、协作式和超媒体信息系统的应用层协议,HTTP是万维网的数据通信基础。
其实HTTP协议主要就是用来进行客户端和服务器端之间进行通信的标准协议
HTTP主要规定了客户端如何与服务器端建立链接、客户端如何从服务器端请求数据、服务器如何响应请求,以及最后如何连接如何关闭。

我下面举个例子:
当我们在浏览器中输入一个url,比如http://www.taobao.com,然后回车,一直到页面显示淘宝网的首页的过程就是一次HTTP的网络通信,这次通信过程中,我们查看淘宝使用的电脑就是客户端,而搭建淘宝网的那些计算机就是服务器
其实就像老板通过电话给员工下达命令,当我们在浏览器中输入网址并按下回车后,发生了四件事情:

  • 建立连接:老板拨通手下员工的电话
  • 进行请求:老板提出自己的要求
  • 响应:员工应答老板的请求
  • 关闭连接:挂断电话
1.建立连接

老板找出自己公司的总计电话并拨通,员工接听电话的过程就是建立连接

根据用户输入的URL地址,通过DNS、负载均衡等技术找到一台服务器,客户端与服务器端的80端口建立一个TCP连接

2.进行请求

电话被接通之后,老板可能要求某个具体员工进行接听,并且会对该员工下达一些命令,比如帮他取快递,预定酒店,收购公司等。这个过程就是进行请求。

客户端向服务器发送消息,请求URL中指定的页面,要求执行指定的操作。

老板对员工下达的命令中,可以分为很多种,比如有些命令只是简单的事情询问,有些命令要求员工执行某些决定,如收购。

同样,HTTP的请求方式也有很多种,主要的是GET、POST、HEAD等。

3.响应

员工在接收到老板下单的命令后,需要对该命令做出回应。比如直接告知老板他接下来的行程,帮老板预订好酒店后告诉他已经预订成功等。这个过程就是响应(response)

服务器向客户端发送响应。响应以状态码开头。常见的状态码有:200、302、404、500等。

HTTP状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型,后两个数字没有分类的作用。HTTP状态码共分为5种类型:

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

老板在下达完命令,并且员工给予响应之后,双方会挂断电话。这个过程就是关闭连接。

客户端或服务端都可以关闭连接。每个请求都是用一个单独的网络连接。

特别的是:服务器不回记忆前面一次连接或者其结果,这种不记忆过去请求的协议被称为无状态(stateless)协议。

在这里插入图片描述
可以试着访问淘宝网,看它的HTTP请求的过程。其中会显示request(请求)和response(响应)的所有信息。

二 HTTP工作原理

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

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

  • 1.客户端连接到Web服务器

一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。例如http://www.baidu.com。

  • 2.发送HTTP请求

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

  • 3.服务器接受请求并返回HTTP响应

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

  • 4.释放连接TCP连接

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

  • 5.客户端浏览器解析HTML内容

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

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

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

客户端发送一个HTTP请求到服务器的请求消息包括以下格式:
请求行(request line)、请求头部(header)、空行和请求数据四个部分组成。

GET请求
GET /books/?sex=man&name=Professional HTTP/1.1
Host: www.wrox.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Connection: Keep-Alive

第一部分:请求行,用来说明请求类型,要访问的资源以及所使用的HTTP版本.
第二部分:请求头部,紧接着请求行之后的部分,用来说明服务器要使用的附加信息
第三部分:空行,请求头部后面的空行是必须的
第四部分:请求数据也叫主体,可以添加任意的其他数据。

这个例子的请求数据为空。例子来源于网络

POST请求
POST / HTTP1.1
Host:www.wrox.com
User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)
Content-Type:application/x-www-form-urlencoded
Content-Length:40

Connection: Keep-Alive
name=Professional%20Ajax&publisher=Wiley

第一部分:请求行,第一行明了是post请求,以及http1.1版本。
第二部分:请求头部,第二行至第六行。
第三部分:空行,第七行的空行。
第四部分:请求数据,第八行。

2)HTTP之响应消息Response

一般情况下,服务器接收并处理客户端发过来的请求后会返回一个HTTP的响应消息。
HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。

HTTP/1.1 200 OK
Date: Fri, 22 May 2009 06:07:21 GMT
Content-Type: text/html; charset=UTF-8
 
<html>
      <head></head>
      <body>
           
      </body>
</html>

第一部分:状态行,由HTTP协议版本号,状态码,状态消息 三部分组成。
第一行为状态行,(HTTP/1.1)表明HTTP版本为1.1版本,状态码为200,状态消息为(ok)
第二部分:消息报头,用来说明客户端要使用的一些附加信息
第二行和第三行为消息报头,Date:生成响应的日期和时间;Content-Type:指定了MIME类型的HTML(text/html),编码类型是UTF-8
第三部分:空行,消息报头后面的空行是必须的
第四部分:响应正文,服务器返回给客户端的文本信息。

三 拓展—HTTP协议的迭代

HTTP协议主要的版本有3个,分别是HTTP/1.0、HTTP/1.1和HTTP/2。前面我们把HTTP通信比喻成打电话,严格一点来说,HTTP/2更像是现在的打电话。

HTTP/1.0

1996年HTTP/1.0 版本发布,为了提高系统的效率,HTTP/1.0规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器完成请求处理后立即断开TCP连接,服务器不跟踪每个客户也不记录过去的请求。这种方式就好像我们打电话的时候,只能说一件事儿一样,说完之后就要挂断,想要说另外一件事儿的时候就要重新拨打电话。

HTTP/1.0中浏览器与服务器只保持短暂的连接,连接无法复用。也就是说每个TCP连接只能发送一个请求。发送数据完毕,连接就关闭,如果还要请求其他资源,就必须再新建一个连接。
我们知道TCP连接的建立需要三次握手,是很耗费时间的一个过程。所以,HTTP/1.0版本的性能比较差。

HTTP/1.1

为了解决HTTP/1.0存在的缺陷,HTTP/1.1于1999年诞生。相比较于HTTP/1.0来说,最主要的改进就是引入了持久连接。所谓的持久连接即TCP连接默认不关闭,可以被多个请求复用。
由于之前打一次电话只能说一件事儿,效率很低。后来人们提出一种想法,就是电话打完之后,先不直接挂断,而是持续一小段时间,这一小段时间内,如果还有事情沟通可以再次进行沟通。

客户端和服务器发现对方一段时间没有活动,就可以主动关闭连接。或者客户端在最后一个请求时,主动告诉服务端要关闭连接
HTTP/1.1版还引入了管道机制(pipelining),即在同一个TCP连接里面,客户端可以同时发送多个请求。这样就进一步改进了HTTP协议的效率。也就是说,现在打电话,一个电话里面可以吩咐多件事儿了。但是对于执行者来说,还是需要按照顺序,先执行完一件事儿以后再执行另外一件事儿。
有了持久连接和管道,大大的提升了HTTP的效率。但是服务端还是顺序执行的,效率还有提升的空间。

HTTP/2

HTTP/2 为了解决HTTP/1.1中仍然存在的效率问题,HTTP/2 采用了多路复用。即在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,而且不用按照顺序一一对应。能这样做有一个前提,就是HTTP/2进行了二进制分帧即 HTTP/2 会将所有传输的信息分割为更小的消息和帧(frame),并对它们采用二进制格式的编码。

也就是说,老板可以同时下达多个命令,员工也可以收到了A请求和B请求,于是先回应A请求,结果发现处理过程非常耗时,于是就发送A请求已经处理好的部分, 接着回应B请求,完成后,再发送A请求剩下的部分。A请求的两部分响应在组合到一起发给老板。
而这个负责拆分、组装请求和二进制帧的一层就叫做二进制分帧层。

除此之外,还有一些其他的优化,比如做Header压缩、服务端推送等。
Header压缩就是压缩老板和员工之间的对话。
服务端推送就是员工事先把一些老板可能询问的事情提前发送到老板的手机(缓存)上。这样老板想要知道的时候就可以直接读取短信(缓存)了。

总结

主流的HTTP协议还是HTTP/1.1 和 HTTP/2。并且各大网站的HTTP/2的使用率也在逐年增加。但是HTTP/3还在发展中,目前没有成熟的版本

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值