应用层上的协议非常重要的一个协议是HTTP协议。

这个协议包括了请求和回复两种报文类型。

请求和回复报文的内容形式是

1)起始行

2)首行

3)消息体

请求报文的内容格式是

<version><request-url><method>
<headers>
<entity-body>

回复报文的内容格式是

<version><status><reason-pharse>
<headers>
<entity-body>

报文中标签代表的含义是

method:指请求方法,主要的方法为GET和POST。

request-url:指请求路径/地址

version:指协议版本,现在通常是http/1.1  

status:指响应状态码,主要的响应状态例如200,404。

reason-pharse:原因短语,200 Ok、404 No Found 这种后面描述的就是原因短语,不必太过关注。

method

请求方法使用频繁的是Get和POST。面试的时候通常被问到这两个方法有什么区别。这里我们来谈一谈。

GET和POST在传输形式上有一些差异。GET请求时,会在request-url地址后拼接参数,格式是url?parm1=ss&parm2=dd。

所以,这样的形式会在地址栏中暴露参数。由于url地址采用ASCII编码,如果参数中有Unicode编码的字符,例如汉字,需要转码后传输。

url地址的长度没有被限制,但是在一些服务器和浏览器中会限制url的长度,所有get发起的请求地址不能太长。而POST请求是将参数放在

内容中,不会有长度的限制。

另外一点差别表现在语义上。GET请求是希望从服务器中取到数据,频繁的GET请求对服务器没有影响。而POST请求是线修改、删除服务器中

的数据,例如提交表单修改服务器数据,不建议频繁使用POST请求。

header

在请求报文和响应报文的首部,都可以携带一些信息,通过与其他部分的配合,能够实现各种强大的功能。这些信息位于起始行之下和请求实体之间,

以键值对的形式,称为首部。每条首部以回车换行符结尾,最后一个首部额外多一个换行,与请求实体分开。

重要的首部信息是:

Date
Cache-Control
Last-modified
Etag
Expires
If-Modified-Since
If-None-Match
If-Unmodified-Since
If-Range
If-match

 

HTTP缓存

 HTTP协议为了提高客户端访问服务器速度,有了HTTP缓存技术。

 发送HTTP请求的客户端从服务器取得资源,资源保存在客户端,当客户端再次请求同一个url的资源,请求先判断本地时候存有缓存资源,有则快速从

 本地存储设备中获取缓存资源。

  

 我们知道从同一个url中取得的资源不是一成不变的。服务器中该url的资源可能在一定时间后被修改。这时本地的资源缓存将与服务器一侧的资源存在

差异。

既然在一定时间后资源可能发生改变,那么在某个时间之前我们可以认为这个资源没有改变,从而大胆使用缓存资源。当请求时间超出该时间后,我们

认为这个时间不再与服务器一侧的资源一致了。所以,当我们发起一个资源时需要对缓存的资源进行判断,看看究竟我们是否能使用该缓存资源,这个

个叫做新鲜度检测

如果我们发现超出缓存使用时间了,本地发起请求时不会直接返回缓存资源,而是先去服务器查看这个资源是否已经改变,这个叫做再验证。如果服务器

中的资源没有发生改变,服务器返回状态码304 Not Modified,并不再返回对应实体。这叫做再验证命中。相反,如果在验证未命中,则会返回 200 Ok,并

将改变的url资源返回,此时缓存更新以待之后请求。

  HTTPS

HTTPS流行时,苹果强制上线的APP必须使用https协议,谷歌的chrome浏览器将非https协议一律标注为“不安全”的网络。作为开发者,我们能感受到https

越来越受重视,所以了解https是必须的。

https = http+加密+认证+完整性保护

传统的http协议存在一些缺点:

1) http使用明文传输,在传输过程中容易被盗取信息

2)http对于通信双方没有经过身份认证,通信的双方无法确认对方是否是伪装的客户端或服务端

3)http对于传输内容的完整性没有确认方法,容易被人篡改信息。

     因此,在一些需要安全级别较高的场景下,例如银行转账请求时,http无法抵御这些攻击。HTTPs则可以通过TLS/SSL,支持对通信内容的加密,以及通信双方

身份的认证。

 HTTPS的加密原理

近代密码学的加密方式分为两类:

1)对称密钥加密

2)非对称密钥加密

对称密钥加密是指加密和解密使用同一把密钥。这种方式的优势是处理速度非常快,但是如何从一端安全地将密钥安全地传递到通信的另一端是一个问题。

非对称密钥加密是指加密和解密使用两把不同的密钥。这两把密钥,一把叫公开密钥,可以随意对外公开。另一把叫私有密钥,只用于本身持有。得到公开

密钥的客户端可以使用公开密钥对传输内容进行加密,得到私有密钥的持有者才能对加密的传输内容进行解密。这种方式克服了密钥交换的问题,但是相对于

对称密钥加密方式,处理速度较慢。

TLS/SSL加密方式结合了对称密钥加密和非对称密钥加密的优点。首先采用非对称加密的方式,将一个对称密钥使用公开密钥加密后传输传输到对方,对方使用

私有密钥解密,得到传输的对称密钥。之后双方使用对称密钥进行通讯。这样既解决了对称密钥加密后的传输问题,又利用了对称密钥的高效率来进行通信内容的

加密或解密。

如何确保加密的公开密钥确实是所期望服务器分发的了?也许在收到密钥之前,这个密钥在中途已经被别人篡改了。因此,我们还需要有对这个密钥进行认证的能力,

以确保我们通信的对方是我们期望的对象。

目前的做法是使用数字证书认证机构颁发的公开密钥证书。服务器的运营人员可以向认证机构提出公开密钥申请,认证机构在审核后,会将公开密钥和公钥证书绑定,

服务器就可以将这个公钥证书下发给客户端,客户端收到证书后,使用认证机构的公开密钥进行认证。一旦验证成功,即可知道这个密钥是可信任的密钥。

HTTP协议小记的更多相关文章

  1. modbus协议使用小记

    下载了libmodbus库,交叉编译后运行,总是接收回复时不正确.原因不明. 由于使用到modbus的需求比较简单,所以选择直接拼出modbus的请求报文,然后用串口直接发送和接收的方式, 拼modb ...

  2. 解决java代码测试http协议505错误

    代码功能:通过java代码获取网页源代码: 所用工具:Myclipse8.5+tomcat6.0+浏览器 系统环境:windows xp旗舰版 火狐浏览器版本: IE浏览器版本: 测试http协议有错 ...

  3. 【日常小记】统计后缀名为.cc、.c、.h的文件数【转】

    转自:http://www.cnblogs.com/skynet/archive/2011/03/29/1998970.html 在项目开发时,有时候想知道源码文件中有多少后缀名为.cc..c..h的 ...

  4. 转--webservice、socket、http 小记(一)

    webservice.socket.http 小记(一) http://blog.csdn.net/m_123hj_520/article/details/9370723 2013-07-18 17: ...

  5. iOS分类底层实现原理小记

    摘要:iOS分类底层是怎么实现的?本文将分如下四个模块进行探究分类的结构体编译时的分类分类的加载总结本文使用的runtime源码版本是objc4-680文中类与分类代码如下//类@interfaceP ...

  6. JavaScript小记

    JavaScript小记 1. 简介 1. 语言描述 JavaScript 是一门跨平台.面向对象的弱类型动态脚本编程语言 JavaScript 是一门基于原型.函数先行的语言 JavaScript ...

  7. HTTP协议系列(1)

    一.为什么学习Http协议       首先明白我们为什么学习HTTP协议,也就是说明白HTTP协议的作用.HTTP协议是用于客户端与服务器之间的通讯.明白了HTTP协议的作用也就知道了为什么要学习H ...

  8. 重温Http协议--请求报文和响应报文

    http协议是位于应用层的协议,我们在日常浏览网页比如在导航网站请求百度首页的时候,会先通过http协议把请求做一个类似于编码的工作,发送给百度的服务器,然后在百度服务器响应请求时把相应的内容再通过h ...

  9. 协议森林17 我和你的悄悄话 (SSL/TLS协议)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 转载请先与我联系. TLS名为传输层安全协议(Transport Layer Protocol),这个协议是一套加密的 ...

随机推荐

  1. springboot 启动停止脚本

    https://www.cnblogs.com/lovychen/p/6211209.html   参考 centos 转码解决方案: yum install dos2unix dos2unix ** ...

  2. 【前端_js】jQuery动态设置元素的样式

    1.用css()方法查询元素的某个样式 $("div").css("padding-left")); 2.用css()方法设置元素的样式 法一: $(" ...

  3. HDU 1548 A strange lift 题解

    A strange lift Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  4. postman常用功能汇总(基础必备)

    下载安装 下载地址:https://www.getpostman.com/downloads/ 安装:略 接口测试详解 包含get,post(k-v,json,上传文件,cookie) 参考:http ...

  5. 记录一次群答问:requests获取cookie

    问题: 为了测试,写的sever,下面仅为set cookie的部分代码 response = make_response('{"code":9420, "msg&quo ...

  6. Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = STATEMENT and at least one table uses a storage engine limited to row-based logging. InnoDB is limited to row-logging

    1665 - Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = STATEMENT a ...

  7. java GC jvm 内存分布 和新生代,老年代,永久代,(详细)

    如果大家想深入的了解JVM,可以读读周志明<深入理解Java虚拟机:JVM高级特性与最佳实践> 需要掌握的东西,包括以下内容.判断对象存活还是死亡的算法(引用计数算法.可达性分析算法).常 ...

  8. The happy secret to better work,https://www.ted.com/talks/shawn_achor_the_happy_secret_to_better_work/transcript#t-100352

    When I was seven years old and my sister was just five years old, we were playing on top of a bunk b ...

  9. Pandas | 20 级联

    Pandas提供了各种工具(功能),可以轻松地将Series,DataFrame和Panel对象组合在一起. pd.concat(objs,axis=0,join='outer',join_axes= ...

  10. IIS 报错 Cannot open database "test4" requested by the login. The login failed. Login failed for user 'IIS APPPOOL\test1'.

    报错: Cannot open database "test4" requested by the login. The login failed. Login failed fo ...