HTTP协议小记
应用层上的协议非常重要的一个协议是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协议小记的更多相关文章
- modbus协议使用小记
下载了libmodbus库,交叉编译后运行,总是接收回复时不正确.原因不明. 由于使用到modbus的需求比较简单,所以选择直接拼出modbus的请求报文,然后用串口直接发送和接收的方式, 拼modb ...
- 解决java代码测试http协议505错误
代码功能:通过java代码获取网页源代码: 所用工具:Myclipse8.5+tomcat6.0+浏览器 系统环境:windows xp旗舰版 火狐浏览器版本: IE浏览器版本: 测试http协议有错 ...
- 【日常小记】统计后缀名为.cc、.c、.h的文件数【转】
转自:http://www.cnblogs.com/skynet/archive/2011/03/29/1998970.html 在项目开发时,有时候想知道源码文件中有多少后缀名为.cc..c..h的 ...
- 转--webservice、socket、http 小记(一)
webservice.socket.http 小记(一) http://blog.csdn.net/m_123hj_520/article/details/9370723 2013-07-18 17: ...
- iOS分类底层实现原理小记
摘要:iOS分类底层是怎么实现的?本文将分如下四个模块进行探究分类的结构体编译时的分类分类的加载总结本文使用的runtime源码版本是objc4-680文中类与分类代码如下//类@interfaceP ...
- JavaScript小记
JavaScript小记 1. 简介 1. 语言描述 JavaScript 是一门跨平台.面向对象的弱类型动态脚本编程语言 JavaScript 是一门基于原型.函数先行的语言 JavaScript ...
- HTTP协议系列(1)
一.为什么学习Http协议 首先明白我们为什么学习HTTP协议,也就是说明白HTTP协议的作用.HTTP协议是用于客户端与服务器之间的通讯.明白了HTTP协议的作用也就知道了为什么要学习H ...
- 重温Http协议--请求报文和响应报文
http协议是位于应用层的协议,我们在日常浏览网页比如在导航网站请求百度首页的时候,会先通过http协议把请求做一个类似于编码的工作,发送给百度的服务器,然后在百度服务器响应请求时把相应的内容再通过h ...
- 协议森林17 我和你的悄悄话 (SSL/TLS协议)
作者:Vamei 出处:http://www.cnblogs.com/vamei 转载请先与我联系. TLS名为传输层安全协议(Transport Layer Protocol),这个协议是一套加密的 ...
随机推荐
- Spark GraphX图算法应用【分区策略、PageRank、ConnectedComponents,TriangleCount】
一.分区策略 GraphX采用顶点分割的方式进行分布式图分区.GraphX不会沿着边划分图形,而是沿着顶点划分图形,这可以减少通信和存储的开销.从逻辑上讲,这对应于为机器分配边并允许顶点跨越多台机器. ...
- Mysql读写分离操作
环境:两台centos环境,安装mysql(mariadb) web网站的优化: 缓存技术 数据库缓存 redis 文件缓存 图片 fastdfs 负载均衡 nginx 数据库主从备份,读写分离 图解 ...
- Linux用户权限管理
Linux操作系统: 多用户多任务的操作系统 用户类型分为: 管理员用户 : root 普通用户分为:系统用户/程序用户 用户相关的文件: /etc/passwd 用 ...
- VUE的element-ui的使用
我们在自己的网站当中有的时候会用到element-ui的组建 1.如何安装element-ui的组件 在命令行工具当中输入cnpm i element-ui -S, 等待安装 2.如何在vue当中使用 ...
- 使用async进行结构化并发程序开发
异步风格的函数: 继续来学习async相关的东东,对于它其实可以用到函数上,也就是用它可以定义一个异步风格的函数,然后在该函数中再来调用普通的函数,下面来瞅一下: 其实“GlobalScope.asy ...
- JMeter3.0及JMeter5.1开发WebService接口脚本(soap取样器 & http取样器)
由于5.1没有soap取样器了,所以用3.0演示. WebService接口信息 WebService接口地址:http://www.webxml.com.cn/WebServices/Weather ...
- Linux使用rz命令上传文件
1.安装 yum -y install lrzsz 2.rz -be命令,选择需要上传的本地文件
- 04-cmake语法-STREQUAL
STREQUAL 用于比较字符串,相同返回 true .
- A Comparison of Serverless Frameworks for Kubernetes: OpenFaas, OpenWhisk, Fission, Kubeless and more
The term Serverless has become synonymous with AWS Lambda. Decoupling from AWS has two benefits; it ...
- 关于DML的一些使用
DML是一种非常简单的标记语言,它帮助基于现有命令的输出发现和执行新命令.许多WinDbg命令(以及扩展命令)都支持DML.例如,下面是lm D命令,它显示DML输出: 在上面的命令输出中,当我单击“ ...