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,一经查实,立即删除!

相关文章

登陆注册

登陆注册,注册的账号存在服务器的数据库里,成功了就给你返回成功,失败了就返回失败 有三种登陆方式:普通注册,手机号注册,第三方注册转载于:https://www.cnblogs.com/SensenCoder/p/4885606.html

Java并发教程–线程池

Java 1.5中提供的最通用的并发增强功能之一是引入了可自定义的线程池。 这些线程池使您可以对诸如线程数,线程重用,调度和线程构造之类的东西进行大量控制。 让我们回顾一下。 首先,线程池。 让我们直接进入java.util.concurrent.ExecutorSer…

HTTPPost/AFNetWorking/JSONModel/NSPredicate

一、HTTPPost 1. POST方式发送请求 HTTP协议下默认数据发送请求方法是GET方式,若需要使用POST方法,则需要对发送的请求也就是request对象,进行属性设置。 步骤如下: > 要发送的请求对象,需要使用可变请求对象 [[NSM…

C语言代码规范(八)使用const修饰值不允许改变的变量

使用const限定一个变量的值不允许被改变,从而保护被修饰的东西,防止意外,提高程序的可靠性和安全性。

教育小思

父母的时代是“攒钱,买房,生子,终老”,而现在的时代是“教育,创造,传承,成长”。 改变世界,从教育起步。 传统教育的不足之处: 1. 学习体验不佳,学习者被迫…

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

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

servlet中文乱码处理

servlet中文乱码处理 如果是post设置req.setCharacterEncoding("utf-8");如果是get,不去修改服务器配置的情况下new String(name.getBytes("iso-8859-1"),"utf-8")数据库乱码?useUnicodetrue&characterEncodingUTF-8转载于:http…

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;即指针指向内容为…

从JavaFX 1.3迁移到JavaFX 2.0

几天前&#xff0c;我完成了将Modellus的源代码从JavaFX 1.3脚本迁移到JavaFX 2.0 Java语言的过程。 因此&#xff0c;我认为写关于我在此过程中学到的知识会很好。 我想指出&#xff0c;如果您想继续在JavaFX 2.0中使用JavaFX脚本&#xff0c;则可以使用Visage&#xff1a; ht…

九度OJ 1034:寻找大富翁 (排序)

时间限制&#xff1a;1 秒 内存限制&#xff1a;32 兆 特殊判题&#xff1a;否 提交&#xff1a;5925 解决&#xff1a;2375 题目描述&#xff1a;浙江桐乡乌镇共有n个人,请找出该镇上的前m个大富翁.输入&#xff1a;输入包含多组测试用例.每个用例首先包含2个整数n&#xff08…

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

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

android-verticalseekbar——Android可视化SeekBar类库

android-verticalseekbar——Android可视化SeekBar类库转载于:https://www.cnblogs.com/zhujiabin/p/5706246.html

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

一些定义–测试技术9

我认为我即将结束有关测试技术的博客系列&#xff0c;感觉好像已经过去了。 对我来说更清楚的一件事是&#xff0c;测试方法仍处于起步阶段&#xff0c;因此是开发人员之间争执或讨论的明确来源&#xff0c;这是一件好事。 我怀疑我们正处于职业发展史上的某个时刻&#xff0c;…

百度谷歌面试题目

全新整理&#xff1a;微软、谷歌、百度等公司经典面试100题[第101-160题] 整理:July、二零一一年三月九日。应网友承诺与要求&#xff0c;全新整理。转载&#xff0c;请注明出处。博主说明&#xff1a;此100题V0.2版&#xff0c;本人不再保证&#xff0c;还会提供答案。-------…

C学习杂记(三)笔试题:字符串大小写字母切换

字符串大小写转换&#xff0c;大写转小写&#xff0c; 小写转大写 #include <stdio.h> #include <string.h>int tramsform(char str[]) {int i 0;int strLen strlen(str);for(i 0; i < strLen; i){if( (str[i] > A) && (str[i] < Z) ){str[i]…

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

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

javascript 高级特性探讨A4-A5(call和原型.对象复制)

在js中&#xff0c;call和apply是二个神奇的方法&#xff0c;但同时也是容易令人迷惑的二个方法&#xff0c;call和apply的功能是以不同的对象作为上下文来调用某个函数的&#xff0c;简而言之&#xff0c;就是允许一个对象去调用另一个对象的成员函数&#xff0c;咋一看似乎很…