http 二进制_浅谈HTTP协议

a4637ecfb136d0f79a05202d53c0f8b4.png

HTTP

一、HTTP协议

http协议,是超文本传输协议,此协议是基于TCP/IP的协议,是互联网上应用最为广泛的一直网络协议是一种无状态协议,默认端口为80,。设计HTTP的最初目的是为了提供一种发布和接受HTML页面的方法。通过HTTP或者HTTPS协议请求的资源由统一资源标识符(URI)来标识。

通常HTTP消息包括客户机向服务器的请求消息和服务器向客户机的响应消息。这两种类型的消息由一个起始行,一个或者多个头域,一个指示头域结束的空行和可选的消息体组成。HTTP的头域包括通用头,请求头,响应头和实体头四个部分。每个头域由一个域名,冒号(:)和域值三部分组成。域名是大小写无关的,域值前可以添加任何数量的空格符,头域可以被扩展为多行,在每行开始处,使用至少一个空格或制表符。

二、各版本的http对比

1、HTTP/0.9

HTTP 0.9是第一个版本的HTTP协议,1991年发布。它的组成极其简单,只允许客户端发送GET这一种请求,且不支持MIME类型和请求头。由于没有协议头,造成了HTTP 0.9协议只支持一种内容,即纯文本。不过网页仍然支持用HTML语言格式化,同时无法插入图片。

HTTP 0.9具有典型的无状态性,每个事务独立进行处理,事务结束时就释放这个连接。由此可见,HTTP协议的无状态特点在其第一个版本0.9中已经成型。一次HTTP 0.9的传输首先要建立一个由客户端到Web服务器的TCP连接,由客户端发起一个请求,然后由Web服务器返回页面内容,然后连接会关闭。如果请求的页面不存在,也不会返回任何错误码。

2、HTTP/1.0

HTTP/1.0是在1996年发布,在原来HTTP/0.9的版本上添加了许多方法,各种HTTP首部,以及对多媒体对象的处理,是请求和响应消息的协议版本。除了GET命令,还引入了POST命令。HTTP的请求和回应格式也变了,除了数据部分,每次通信都必须包含头信息(HTTP Header),用来描叙一些元数据。相对于HTTP/0.9,HTTP/1.0也支持了MIME,使HTTP协议扩大了处理的数据类型,支持对多媒体流信息的处理。

虽然,HTTP/1.0相对于HTTP/0.9有了革命性的改变,但HTTP/1.0依然有一些缺点,主要就是每个TCP连接只能发生一个请求,发送数据完毕之后连接就会自动关闭,如果还要再请求其他的资源,就要再创建一个连接。有些浏览器为了解决这个问题,用了一个非标准的Connection头部,也就是Keep-Alive模式(Connection:Keep-Alive)来避免了重新建立连接。但这个不是标准头部,各个浏览器和服务器实现可能不一致,因此不是根本解决办法。

3、HTTP/1.1

HTTP/1.1在1999年正式发布,是目前用得最广泛的协议版本。

HTTP1.1在HTTP1.0的基础上实现的一次飞跃,主要的改进集中在性能、安全、数据类型处理等方面提出Server端缓冲 对象的概念,是减少网络上相同类型内容的反复传送,提高访问速度。默认的是Keep-Alive模式(持久连接),提高了性能。同时还增加了以下功能

  • Host协议头: 在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机,并且它们共享一个IP地址。因此,Host头的引入就很有必要了。
  • Range分段请求: 请求头中,指定第一个字节的位置和最后一个字节的位置。用于告诉服务器自己想取对象的哪部分。如果服务器能够正常响应的话,服务器会返回 206 Partial Content 的状态码及说明。如果不能处理这种Range的话,就会返回整个资源以及响应状态码为 200 OK。
  • 分块传输编码(chucked):该编码将实体分块传送并逐块标明长度,直到长度为0块表示传输结束, 这在实体长度未知时特别有用(比如由数据库动态产生的数据)
  • 缓存处理等:HTTP/1.1在1.0的基础上加入了一些cache的新特性,新增更为强大的Cache-Control头。
  • 请求的流水线处理:在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟。例如,一个包含有许多图像的网页文件的多个请求和应答可以在一个连接中传输,但每个单独网页文件的请求和应答仍需要使用各自的连接。HTTP/1.1还允许客户端不用等待上一次请求结果的返回,就可以发出下一次请求,但服务器端必须按照请求的先后顺序一次返回响应的结果,以保证客户端能够区分出每次请求的响应内容。

4、HTTP/2

HTTP/2是最新的HTTP协议,与2015年5月发布,谷歌、IE11以及火狐等浏览器已经支持HTTP/2协议了。

注意是HTTP/2而不是HTTP/2.0,因为IEFT(互联网工程任务组)认为HTTP/2已经很成熟了,没有必要再发布子版本了,以后要是有重大改动就直接发布HTTP/3。而HTTP/2与HTTP/1.1也存在着挺大的差别,下面我们来看看HTTP/2独有的特性。

1、二进制协议

我们都知道,HTTP/1.1是超文本传输协议,而HTTP/2是采用二进制协议。相比 HTTP/1.1 的纯文本数据,二进制数据一个显而易见的好处是:更小的传输体积。这就意味着更低的负载。二进制的帧也更易于解析而且不易出错,纯文本帧在解析的时候还要考虑处理空格、大小写、空行和换行等问题,而二进制帧就不存在这个问题。

消息头和消息体均采用二进制格式,并成为(Frame)。目前有10个Frame,由Type字段来区分,各个Frame都有自己的二进制格式,都封装在Frame Payload中。其中有两个重要的Frame:Header Frame(Type=0x1)和Date Frame(Type=0x0),分别对应HTTP/1.1中的消息头(Header)和消息体(Body),由此可见语义并没有太大变化,而是文本格式变成二进制的Frame。两者的转换关系如下图:

f5227340a6822f9152dd1d92ad1e3e12.png

此外,HTTP/2中还有流(Stream)和消息(Message)的概念,通过Strame Identifier(流ID)字段来标识,流ID一样的是同一个流,流中包含消息,这个消息对于HTTP/1.x的请求消息或者响应消息,消息是通过帧来传输的,响应消息比较大时,可能由多个Data Frame来传输

2、多路复用

每个http2连接上传输的帧都关联到一个“流”。流是一个逻辑上的结合,一个独立的,双向的帧序列。它在客户端和服务器端中间通过http2连接进行帧交换。每个单独的http2连接都可以包含多个并发的流,任何一端都可以交错地插入帧。流既可以被客户端/服务器端单方面的建立、使用,也可以被双方共享。同时,两边都可以关闭流。

也就是说,在一个TCP连接里,客户端和服务器端都可以同时发生多个请求或者响应,对于HTTP/1.x来说各个请求和响应都是有严格的次序要求的,而在HTTP/2中,不用按照次序一一对应,而且并发的多个请求或者响应中任何一个请求阻塞了不会影响其他的请求或者响应,这样也就避免了"队头阻塞"。

3、头部压缩

HTTP是无状态协议。简而言之,这意味着每个请求必须要携带服务器需要的所有细节,而不是让服务器保存住之前请求的元数据。因为http2没有改变这个范式,所以它也需要这样(携带所有细节),因此 HTTP 请求的头部需要包含用于标识身份的数据比如 cookies和User Agent,而这些数据的量也在随着时间增长。每一个请求的头部都包含这些大量的重复数据,无疑是一种很大的负担。对请求头部进行压缩,将会大大减轻这种负担,尤其对移动端来说,性能提高非常明显。

而HTTP/2则是采样HPACK格式进行压缩传输,而HPACK简单的说,就是使用2个索引表(静态索引表和动态索引表)来把头部映射到索引值,并对不存在的头部使用 huffman 编码,并动态缓存到索引,从而达到压缩头部的效果。也就是说客户端和服务器端都需要维护一个索引表,相同的消息头只要发送索引号,从而提高效率和速度。

具体关于HPACK的介绍请参考: http://www.jianshu.com/p/f44b930cfcac

4.服务器推送

服务器推送就是说在HTTP/2中服务器未经请求可以直接把资源推送给客户。而在HTTP/1.1中,对服务器请求一个页面,等页面解析之后会再去请求和这个页面有关的css或者js等资源。而HTTP/2则是在响应了某个页面进行请求之后,会顺便把和这个页面有关的css和js等资源推送到到浏览器,当浏览器解析了响应的页面之后发现要请求的有关这个页面的一些css和js等资源就已经在本地之后,就会直接引用,而不会说再次去请求服务器。这就节省了两次请求所花的网络时间,大大提高了网络性能和用户体验。

三、HTTPS

超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息。HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此HTTP协议不适合传输一些敏感信息,比如信用卡号、密码等。

为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS。为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。其主要用途如下:

1.认证用户和服务器,确保数据发送到正确的客户机和服务器

2.加密数据以防止数据中途被窃取

3.维护数据的完整性,确保数据在传输过程中不被改变。

SSL存在三个特性:

1.机密性:SSL使用密钥加密通信数据

2.可靠性:服务器和客户都会被认证,客户的认证是可选的

3.完整性:SSL协议会对传输的数据进行完整性检查

HTTPS和HTTP的区别主要为以下四点:

一、https协议需要到ca申请证书,一般免费证书很少,需要交费。

二、http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。

三、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

四、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/374311.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux redis客户端_为什么单线程Redis能那么快?

我们通常说,Redis 是单线程,主要是指 Redis 的网络 IO 和键值对读写是由一个线程来完成的,这也是 Redis 对外提供键值存储服务的主要流程。但 Redis 的其他功能,比如持久化、异步删除、集群数据同步等,其实是由额外的线…

C语言开发笔记(七)const和指针

const修饰变量是常用的&#xff0c;不容易犯错&#xff0c;而const和指针一起使用时很容易混淆。 (一)const int *p #include <stdio.h>int main(void) {int a 10;int b 20;const int *p &a;*p b;return 0; } const在int *的左侧&#xff0c;即指针指向内容为…

ubuntu php 无法执行exec_利用webhook使php项目自动部署

php中文网最新课程每日17点准时技术干货分享1.先来讲一下自动部署的原理&#xff0c;一般在我们push代码的时候&#xff0c;可以自动请求webhook中设置的url&#xff0c;完成一次请求与响应。那么只要我们设置的url地址请求的php文件内容是执行命令行git push命令&#xff0c;则…

C语言开发笔记(八)static

在C语言中&#xff0c;static有3个作用&#xff1a; &#xff08;1&#xff09;在函数体&#xff0c;一个被声明为静态的变量在这一函数体内被调用的过程中维持其值不变。 #include <stdio.h>void test(void) {static int i 0;printf("%d\n", i); }int main…

ppt修复无法读取_移动硬盘故障分析以及建议修复方法

移动硬盘中存储了大量的重要数据&#xff0c;一旦出现什么问题&#xff0c;会让人急得焦头烂额。换个硬盘倒是件小事&#xff0c;但其中资料、数据的丢失更令人懊恼。而在硬盘使用的过程中&#xff0c;由于使用者一时的不注意&#xff0c;往往就很容易造成意外的问题。接下来&a…

(原创)c#学习笔记04--流程控制01--布尔逻辑03--运算符优先级

转载于:https://www.cnblogs.com/wodehao0808/p/4896018.html

m.2接口和nvme区别_NVMe/SATA SSD有啥不一样?萌新怎么选

随着NAND技术的升级迭代&#xff0c;堆栈层数不断提高使得SSD单位容量成本不断下降&#xff0c;消费级市场基本已经成为了SSD的天下。目前主流的SSD大致有两种接口&#xff0c;分别是M.2和SATA两种类型。NVMe/SATA有啥区别SATA接口的SSD执行的AHCI协议标准&#xff0c;是目前较…

带有NetBeans 7.1 RC 2的WebLogic 12c快速入门

WebLogic服务器12c停运了几天。 它是针对“裸露”的Java开发人员的–花哨的Fusion Middleware东西将继续沿线升至12c。 因此&#xff0c;这基本上是我要运行的版本。 今天&#xff0c;我为您提供了一个最新的NetBeans 7.1&#xff08;RC 2&#xff09;和WebLogic的快速入门 &am…

python爬虫反爬机制_Python Scrapy突破反爬虫机制(项目实践)

对于 BOSS 直聘这种网站&#xff0c;当程序请求网页后&#xff0c;服务器响应内容包含了整个页面的 HTML 源代码&#xff0c;这样就可以使用爬虫来爬取数据。但有些网站做了一些“反爬虫”处理&#xff0c;其网页内容不是静态的&#xff0c;而是使用 JavaScript 动态加载的&…

自定义URL Scheme完全指南

iPhone / iOS SDK 最酷的特性之一就是应用将其自身”绑定”到一个自定义 URL scheme 上&#xff0c;该 scheme 用于从浏览器或其他应用中启动本应用。 注册自定义 URL Scheme 注册自定义 URL Scheme 的第一步是创建 URL Scheme — 在 Xcode Project Navigator 中找到并点击工程…

P6 音频格式—— AAC

目录 前言 01 AAC是什么&#xff1f; 02 为什么需要进行AAC进行音频压缩处理&#xff1f; 03 AAC的特点以及优势 04 AAC格式详解&#xff1a; 4.1. ADIF的数据结构&#xff1a; 4.1.1 ADIF Header具体的表格: 4.2. ADTS的结构&#xff08;重点&#xff09;&#xff1a; …

Android开发笔记——ListView模块、缓存及性能

ListView是Android开发中最常用的组件之一。本文将重点说明如何正确使用ListView&#xff0c;以及使用过程中可能遇到的问题。 ListView开发模块图片缓存可能遇到的问题一、ListView开发模块 从项目实践的角度来看&#xff0c;ListView适合“自底向上”的开发模式&#xff0c;即…

python实现excel筛选功能并输出_python如何实现excel按颜色筛选功能

离岛 2020-07-09 09:37 已采纳 不太了解具体需求&#xff0c;提供一些示例代码和思路供你参考&#xff1a; 整体思路&#xff1a;首先已知excel中的颜色值&#xff0c;根据编码实现颜色筛选的功能 示例&#xff1a; 1、首先安装pip install openpyxl 2、示例代码可以获取Excel中…

C学习杂记(七)extern声明可省略变量类型

工作三年&#xff0c;看C的书也不少。第一次知道extern可以省略变量类型。 b.c有一个全局变量unsigned int data_length&#xff0c;a.c想要调用它&#xff0c;通常使用: extern unsigned int data_length&#xff1b; 在声明时可以把外部变量类型去掉&#xff1a;extern da…

linux 内存取证_【取证流程】电子数据证据远程勘验

原创&#xff1a;弘连网络电子数据证据远程勘验在日常的取证工作中必不可少&#xff0c;但由于存在信息安全差、数据可能被篡改的问题。取证过程中&#xff0c;有明确的取证要求来确保取证过程的规范显得至关重要&#xff0c;今天我们就一起来回顾下遇到远程勘验的取证场景&…

python2 print_Python2和Python3中print的不同点

在Python2和Python3中都提供print()方法来打印信息,但两个版本间的print稍微有差异 主要体现在以下几个方面&#xff1a; 1.python3中print是一个内置函数&#xff0c;有多个参数&#xff0c;而python2中print是一个语法结构&#xff1b; 2.Python2打印时可以不加括号&#xff…

java 与 c#的 中 字符串比较“==”与“equals”的差异

.net中&#xff0c;其字符串特有的驻留机制&#xff0c;保证了在同一进程中&#xff0c;相同字符序列的字符串&#xff0c;只有一个实例&#xff0c;这样能避免相同内容的字符串重复实例化&#xff0c;以减少性能开销。 先来回顾一下c#中的代码&#xff1a; public static void…

visual studio 2019 未能在命名空间“System.IO.Ports”中找到类型名“SerialPort”

在vs2019以前的版本&#xff0c;只要using System.IO.Ports就可以用SerialPort。 这里需要自己手动添加相关引用。 工具–>Nuget包管理器&#xff08;N&#xff09;–>管理解决方案的Nuget程序包&#xff08;N&#xff09; –>浏览&#xff0c;左边搜索SerialPort 右…

python开发环境功能介绍_第一模块 第3章 Python介绍与环境配置

python入门(全为重点) 1. 编程语言介绍 编程语言分类、总结 2. python介绍 3. 解释器多版本共存 4. 运行python程序的两种方式 5. 一个python程序运行的三个步骤&#xff08;******&#xff09; 6. 注释 7. IED集成开发环境 3.1 编程语言分类之低级语言 这里的高级/低级指的是离…

用WPF做关于MEF 简单学习记录

写在前面&#xff1a;下面学习所得多是从自http://www.cnblogs.com/comsokey/p/MEF1.html和http://www.cnblogs.com/yunfeifei/p/3922668.html两位大神的文章里学到的&#xff0c;特别鸣谢&#xff01;整理下是更大一方面是对自己知识的梳理&#xff0c;用词用句不够准确&#…