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),这个协议是一套加密的 ...
随机推荐
- open_basedir restriction in effect
vim /usr/local/nginx/conf/fastcgi.conf fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_ro ...
- 海盗分金问题SQL求解(贪心算法)
问题 经济学上有个"海盗分金"模型:是说5个海盗抢得100枚金币,他们按抽签的顺序依次提方案:首先由1号提出分配方案,然后5人表决,超过半数同意方案才被通过,否则他将被扔入大海喂鲨 ...
- 定时调度之Quartz
工作中我们经常碰到定时或者固定时间点去做一些事情,然后每天到时间点就会去做这样的事情,如果理解这样的场景,我们就要引入今天我们的主角Quartz,其实这个跟数据库的作业类似,但是不仅仅局限于数据库. ...
- spring boot缓存excel临时文件后再操作
1. 引入poi的两个依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi ...
- 【Java_基础】Java中强制类型转换
首先,狭义上的强制类型转换指的是引用类型,且是父类向子类转换,这种转换只牵扯到引用名义类型的转换,具体的对象内存没有发生一点变化. 而基本类型的转换与此不同,其数据确实发生了变化.如果是基本类型和其包 ...
- Python从零开始——安装与运行
- The 2019 Asia Nanchang First Round Online Programming Contest E. Magic Master
题目链接:https://nanti.jisuanke.com/t/41352 题目意思还是好理解的,看过的人不多,感觉是被通过量吓到了.其实就是个水题,反向模拟就好了, 用队列模拟,反向模拟,它要放 ...
- js处理滚动条操作
在做UI自动化项目的时候,我们不免会遇到一些页面的内容比较多,导致会有滚动条,但是我们又主要操作当前页面看不到的元素,这怎么办呢? 在我们实际操作过程中,我们肯定是直接滑动鼠标操作就可以完成,但是在做 ...
- 京东js加密 nloginpwd 破解
京东登录,有一个参数nloginpwd,是加密字段. 第一步:浏览器抓包 第二部:搜索加密字段 js 代码 第三部: 下断点 2. js代码: var navigator = {}; var wind ...
- python基础语法18 类的内置方法(魔法方法),单例模式
类的内置方法(魔法方法): 凡是在类内部定义,以__开头__结尾的方法,都是类的内置方法,也称之为魔法方法. 类的内置方法,会在某种条件满足下自动触发. 内置方法如下: __new__: 在__ini ...