HTTP协议详解

2020-01-26

本博客所有文章采用的授权方式为 自由转载-非商用-非衍生-保持署名 ,转载请务必注明出处,谢谢。

声明:
本博客欢迎转发,但请保留原作者信息!
博客地址:任志帆的博客;
内容系本人学习、研究和总结,如有雷同,实属荣幸!

HTTP协议详解


HTTP简介

  1. HTTP协议,即超文本传输协议(Hypertext transfer protocol)。是一种详细规定了浏览器和万维网(WWW = World Wide Web)服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议。

  2. HTTP协议作为TCP/IP模型中应用层的协议也不例外。HTTP协议通常承载于TCP协议之上,有时也承载于TLS或SSL协议层之上,这个时候,就成了我们常说的HTTPS。如下图:

    http-1.png

  3. HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。HTTP是一个无状态的协议。

  4. HTTP默认的端口号为80,HTTPS的端口号为443。

  5. 浏览网页是HTTP的主要应用,但是这并不代表HTTP就只能应用于网页的浏览。HTTP是一种协议,只要通信的双方都遵守这个协议,HTTP就能有用武之地。比如咱们常用的QQ,迅雷这些软件,都会使用HTTP协议(还包括其他的协议)。

HTTP特点

  1. 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快

  2. 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记

  3. HTTP 0.9和1.0使用非持续连接:限制每次连接只处理一个请求,服务器处理完客户的请求,并收到客户的应答后,即断开连接。HTTP 1.1使用持续连接:不必为每个web对象创建一个新的连接,一个连接可以传送多个对象,采用这种方式可以节省传输时间

  4. 无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快

  5. 支持B/S及C/S模式

HTTP工作流程

每个万维网的网点都有一个服务器进程,它不断的监听TCP端口80,以便发现是否有浏览器向它发出连接请求,一旦坚挺到连接建立请求,就通过三次握手建立TCP连接,然后浏览器会向服务器发出浏览某个页面的请求,服务器接着返回所请求的页面作为响应,然后TCP连接就被释放了

这些响应和请求报文都遵循一定的格式,这就是HTTP协议所规定的 http-1.png

点击一个URL会发生的一系列事件

(1) 浏览器分析超链指向页面的 URL。

  (2) 浏览器向 DNS 请求解析 www.tsinghua.edu.cn 的 IP 地址。

  (3) 域名系统 DNS 解析出清华大学服务器的 IP 地址。

  (4) 浏览器与服务器建立 TCP 连接

  (5) 浏览器发出取文件命令:如 GET /chn/yxsz/index.htm。

  (6) 服务器给出响应,把文件 index.htm 发给浏览器。

  (7) TCP 连接释放。

  (8) 浏览器显示“清华大学院系设置”文件 index.htm 中的所有文本

http-1.png

代理服务器

代理服务器(proxy server)又称为万维网高速缓存(Web cache),它代表浏览器发出HTTP请求。代理服务器把最近的一些请求和响应暂存在本地磁盘中。当与暂时存放的请求相同的新请求到达时,万维网高速缓存就把暂存的响应发送出去,而不需要按URL的地址再去因特网访问该资源

在不使用代理服务器时,所有的主机都需要与因特网上的服务器建立连接,会使得链路负载比较大;使用代理服务器可以降低链路的压力。

http-1.png

  • 使用高速缓存的情况:

  (1)浏览器访问因特网的服务器时,要先与校园网的高速缓存建立TCP连接,并向高速缓存发出HTTP请求报文

  (2)若高速缓存已经存放了所请求的对象,则将此对象放入HTTP响应报文中返回给浏览器。

  (3)否则,高速缓存就代表发出请求的用户浏览器,与因特网上的源点服务器建立TCP连接,并发送HTTP请求报文。

  (4)源点服务器将所请求的对象放在HTTP响应报文中返回给校园网的高速缓存。

  (5)高速缓存收到此对象后,先复制在其本地存储器中(为今后使用),然后再将该对象放在HTTP响应报文中,通过已建立的TCP连接,返回给请求该对象的浏览器。

http-1.png

总结起来,代理服务器有时作为服务器接受来自浏览器的HTTP请求,有时又会作为客户去向因特网上的原点服务器发送HTTP请求,具有双重身份。同时,由于使用了高速缓存,相当大的一部分通信量都限制在了校园网的内部,减小了网络链路的负载

HTTP之请求消息Request

客户端发送一个HTTP请求到服务器的请求消息包括以下格式:

请求行请求头部空行请求数据四个部分组成。

Get请求例子

http-1.png

第一部分:请求行,用来说明请求类型,要访问的资源以及所使用的HTTP版本,. GET说明请求类型为GET,[/562f25980001b1b106000338.jpg]为要访问的资源,该行的最后一部分说明使用的是HTTP1.1版本。

第二部分:,请求头部,紧接着请求行(即第一行)之后的部分,用来说明服务器要使用的附加信息, 从第二行起为请求头部,HOST将指出请求的目的地.User-Agent,服务器端和客户端脚本都能访问它,它是浏览器类型检测逻辑的重要基础.该信息由你的浏览器来定义,并且在每个请求中自动发送等等

第三部分:,空行,请求头部后面的空行是必须的, 即使第四部分的请求数据为空,也必须有空行。

第四部分:,请求数据也叫主体,可以添加任意的其他数据,。 这个例子的请求数据为空。

POST请求例子

http-1.png

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

HTTP之响应消息Response

一般情况下,服务器接收并处理客户端发过来的请求后会返回一个HTTP的响应消息。

HTTP响应也由四个部分组成,分别是:状态行消息报头空行响应正文

http-1.png

第一部分:状态行,由HTTP协议版本号, 状态码, 状态消息 三部分组成。 第一行为状态行,(HTTP/1.1)表明HTTP版本为1.1版本,状态码为200,状态消息为(ok)

第二部分:消息报头,用来说明客户端要使用的一些附加信息 第二行和第三行和第四行为消息报头, Date:生成响应的日期和时间;Content-Type:指定了MIME类型的HTML(text/html),编码类型是ISO-8859-1

第三部分:空行,消息报头后面的空行是必须的 第四部分:响应正文,服务器返回给客户端的文本信息

空行后面的html部分为响应正文。

HTTP之状态码

状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:

1xx:指示信息–表示请求已接收,继续处理

2xx:成功–表示请求已被成功接收、理解、接受

3xx:重定向–要完成请求必须进行更进一步的操作

4xx:客户端错误–请求有语法错误或请求无法实现

5xx:服务器端错误–服务器未能实现合法的请求

最无耻的 HTTP 常用状态码图解

http-1.png

301  永久移动位置,被请求的资源已经被永久性的转移了位置
302  您请求的资源现在需要临时通过其他的 URI 来获取
305  使用代理,被请求的资源必须通过指定的代理才能访问到
307  临时跳转。被请求的资源在临时从不同的URL响应请求
400  请求错误
402  该状态码是为了将来可能的需求而预留的,比如可能用于一些数字货币或者是微支付
403  禁止访问。服务器已经理解请求,但是拒绝执行它
404  找不到对象。请求失败,资源不存在,程序员找对象简直是宇宙谜题
406  不可接受的。请求的资源的内容特性无法满足请求头中的条件,因而无法生成响应实体

http-1.png

408  请求超时,请活活憋死吧
409  请求冲突。由于和被请求的资源的当前状态之间存在冲突,请求无法完成
410  遗失的。被请求的资源在服务器上已经不再可用,而且没有任何已知的转发地址
413  响应实体太大。服务器拒绝处理当前请求,请求超过服务器所能处理和允许的最大值
417  期望失败。在请求头 Expect 中指定的预期内容无法被服务器满足
418  我是一个茶壶。超文本咖啡罐控制协议,但是并没有被实际的HTTP服务器实现
420  方法失效
422  不可处理的实体。请求格式正确,但是由于含有语义错误,无法响应
500  服务器内部错误。服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理

HTTP请求方法

HTTP 设计了很多动词,来表示不同的操作

先来解释一个概念,幂等性,指一次和多次请求某一个资源应该具有同样的副作用,也就是一次访问与多次访问,对这个资源带来的变化是相同的。

常用的动词及幂等性

动词 描述 是否幂等
GET 获取资源,单个或多个
POST 创建资源
PUT 更新资源,客户端提供完整的资源数据
PATCH 更新资源,客户端提供部分的资源数据
DELETE 删除资源

GET和POST的区别

本质上来说,GET用于查询POST用于修改

  • GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码.

表面的区别

  • GET在浏览器回退时是无害的,而POST再次提交请求

  • GET产生的URL地址可以被保存为书签,而POST不可以。

  • GET请求会被浏览器主动cache,而POST不会,除非手动设置。

  • GET请求只能进行url编码,而POST支持多种编码方式。

  • GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。

  • get方式提交数据的大小(一般来说1024字节),http协议并没有硬性限制,而是与浏览器、服务器、操作系统有关,而POST理论上来说没有大小限制,http协议规范也没有进行大小限制,但实际上post所能传递的数据量根据取决于服务器的设置和内存大小。

  • 对参数的数据类型,GET只接受ASCII字符,而POST没有限制。

  • GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。

  • GET请求在URL中传送的参数是有长度限制的,而POST通过Body传送数据,长度没有限制

没有区别的回答

GET和POST是HTTP协议中的两种发送请求的方法。

HTTP是基于TCP/IP的关于数据如何在万维网中如何通信的协议。

HTTP的底层是TCP/IP。所以GET和POST的底层也是TCP/IP,也就是说,GET/POST都是TCP链接。GET和POST能做的事情是一样一样的。你要给GET加上request body,给POST带上url参数,技术上是完全行的通的。

GET和POST本质上就是TCP链接,并无差别。但是由于HTTP的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同

重大区别

GET产生一个TCP数据包;POST产生两个TCP数据包。

对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);

而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。

因为POST需要两步,时间上消耗的要多一点,看起来GET比POST更有效。因此Yahoo团队有推荐用GET替换POST来优化网站性能。但这是一个坑!跳入需谨慎。

  1. GET与POST都有自己的语义,不能随便混用。

  2. 据研究,在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点。

  3. 并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。

看了这么多,是不是会觉得一脸懵逼,在你做项目的时候要注意:

get一般是用来获取数据,post提交数据

post其实是有大小限制的,只不过是取决于服务器的设置和内存大小。

还有更深入的区别:

GET是用来向获取服务器信息的,请求报文传输的信息只是用于描述所需资源的参数,返回的信息才是数据本身;POST是用来向服务器传递数据的,其请求报文传递的信息就是数据本身,返回的报文只是操作的结果。



章节列表