应用层上的协议非常重要的一个协议是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. 设置注释 idea

    https://blog.csdn.net/weixin_42679529/article/details/81059598 groovyScript("def result=''; def ...

  2. Nginx 核心配置-单节点实现多域名访问

    Nginx 核心配置-单节点实现多域名访问 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.试验环境说明 1>.虚拟机环境说明 [root@node101.yinzheng ...

  3. 【Tomcat】安装Tomcat服务器&Tomcat的目录结构

    创建时间:6.14 一.安装Tomcat服务器 Tomcat下载ver8的,现在用的多 下载并解压 配置环境变量:(切记!!不然startup那步会闪退) 1.新建系统环境变量: (1)进入根目录,复 ...

  4. VIJOS-P1282 佳佳的魔法照片

    洛谷 P1583 魔法照片 洛谷传送门 JDOJ 1396: VIJOS-P1282 佳佳的魔法照片 JDOJ传送门 Description 一共有n个人(以1--n编号)向佳佳要照片,而佳佳只能把照 ...

  5. Java的静态变量初始化的坑

    在网上看到一个很有意思的题目,题目如下 class SingleTon { private static SingleTon singleTon = new SingleTon(); public s ...

  6. Random Access Iterator 徐州网络赛(树形dp)

    Random Access Iterator \[ Time Limit: 4000 ms \quad Memory Limit: 262144 kB \] 题意 给出伪代码,问按着伪代码在树上跑,能 ...

  7. 请解释一下css3的flexbox(弹性盒布局模型),以及适用场景

    弹性盒模型是c3规范的新的布局方式,该布局模型的目的是提供一种更加高效的方式来对容器的条目进行布局.对齐和分配空间.在传统的布局中,block布局是把块级元素在垂直方向从上向下一次排列的,而inlin ...

  8. 洛谷 U96762 小R与三角形 题解

    U96762 小R与三角形 原题链接 题目描述 小 R 所在的小镇有 n 个村落,这 n 个村落分布在一个圆周上,这些村落之间两两有直达的小路,小路可能相交,但不存在三条路交于一点.现在小 R 正好放 ...

  9. javaScript与css、html常见的兼容

    最近几天总是遇到兼容问题,就整理了一下javaScript和html.css出现的常见兼容.有不全面或不对的欢迎大家指正.也希望这条博客可以帮到一些刚学习的前端的朋友. 一.javaScript出现的 ...

  10. Spring Transaction 使用入门 (转)

    Spring Transaction 使用入门 一.开篇陈述 1.1 写文缘由 最近在系统学习spring框架IoC.AOP.Transaction相关的知识点,准备写三篇随笔记录学习过程中的感悟.这 ...