相关文章: https://www.jianshu.com/p/dc5b91f826f0
HTTP的发展
HTTP诞生:1990年,www全球信息刚起步时就得到了应用
HTTP0.9版本:1991年,只有一个命令GET
HTTP1.0版本:1996年,不仅可以传输文字,还可以传输图像,视频,二进制文件
HTTP1.1版本:1999年,进一步完善了HTTP协议,直到现在一直是很流行的版本
HTTPS: 2000年,是以安全为目标的HTTP通道
什么是HTTP,HTTP协议具体包含哪些内容,HTTP连接是怎么建立的
超文本传输协议
HTTP报文格式
HTTP的请求方式有
GET
POST
HEAD
PUT
DELETE
OPTIONS
GET和POST的区别
初级回答
- 请求参数位置: GET以问好拼接放在URL中,POST放在Body中
- 请求参数长度限制: GET限制2048个字符,POST无限制
- 安全性: GET不安全,POST相对安全
高级回答
- GET: 用来获取资源的,需要遵从得是:安全性,幂等性,可缓存性
- POST: 是用来处理资源的,需要遵从的是非安全,非幂等,不可缓存
安全性:
指的是不应该引起Server端相关数据的任何状态变化
GET HEAD OPTIONS遵从安全性
幂等性:
同一个请求方法执行多次和执行一次的效果完全相同
PUT DELETE遵从
可缓存性:
请求是否可以被缓存
GET HEAD遵从
常见状态码及含义
1xx
2xx: 200响应成功
3xx: 301和302可能是网络重定向
4xx: 401和404可能是客户端发起的请求本身存在问题
5xx: 501和502可能代表server端本身异常
HTTP的连接建立流程,涉及到TCP的三次握手和四次挥手
- 第一步先发起一个HTTP请求前,需要通过TCP的三次握手来建立连接,其实是客户端和server端的三次交互
- 第二步是,在这条TCP通道上进行HTTP的请求与相应的数据传递
- 第三次是TCP的四次挥手,也就是客户端和Server的四次交互
1.客户端发送SYN同步报文给服务端
2.服务端收到后,会给客户端回复报文SYN,ACK
3.客户端收到后会给服务端回复报文信息ACK报文
三次握手成功后证明TCP的通道建立成功了,下面就可以发送数据了
4.当我们点击登录按钮,客户端会发送HTTP的请求报文到服务端
5.当服务端收到4时,处理后返回给客户端信息,就是相应报文
结束后通道需要关闭,假设这次关闭是由客户端发起的
6,客户端发送FIN报文,即终止报文
7. 服务端收到终止报文后,会返回给客户端一个ACK确认终止
此时客户端向服务端方向的连接已经断开了
8。过一段时间,服务端又会发送给客户端第8条FIN ACK终止报文
9。当客户端收到终止报文之后,回复给服务端一条ACK确认报文
此时由服务端向客户端方向的TCP连接通道已经断开了
TCP连接通道是双向的一条通道,客户端可以通过这条通道向服务器端发送数据,服务器端也可以通过这个通道向客户端发送数据???
疑问:
为什么TCP是三次握手,而不是两次?
四次挥手为什么要进行两方面的断开?
HTTP的特点
无连接: 它的连接是有一个建立连接和释放连接的过程
解决方案是:HTTP的持久连接无状态: 在多次发送HTTP请求的时候,如果是同一个用户的话,对于server端,它是不知道这是同一个用户的
当我们打开一个网页去购买商品的时候,会添加到购物车中,会发送多次请求,那么server端应该如何去规避这种无状态的弊端呢
解决方案是HTTP的Cookie和Session相关技术
持久连接
非持久连接是指,当客户端和server端进行交互时,会打开一个TCP连接,然后关闭,再请求时,又打开一个TCP连接,再关闭,也就是每次网络请求,都要新创建TCP连接
,每次都要经历三次握手和四次挥手
持久连接是指,当我们打开一条TCP通道,在一定时间内,多个HTTP请求,是在同一条TCP通道中进行数据传递,过一段时间后才会关闭这条通道
HTTP为了提升请求响应的效率,所以才有了持久连接这个方案
持久连接的头部字段有:
- Connection : keep-alive 客户端期许采用持久连接
- time: 20 持久连接需要持续多长时间,20S内如果再次发起同一个域名或者IP的请求,可以 复用TCP通道
- max: 10 最多可以支持多少个HTTP请求和响应对
同一条TCP通道上,产生了多次HTTP请求,那么怎样判断一个请求是否结束和后一个请求的开始呢?
请求和响应报文都有头部字段,在响应报文的头部字段中会涉及到
Content-length: 1024
在我们发送请求,server回复时,会携带响应数据的大小,就是Content-length,当客户端所接收的字节数到达这个值时,说明这个HTTP请求响应已经全部接收了,意味着结束POST请求时,Server端返回往往是多次响应返回给这些数据的,可以通过头部字段
chuked: 最后一个块是空chuked
来判断一个请求是否结束
当有多个块通过HTTP的TCP连接传输给客户端时,每个报文都会带有一个chuked字段,而最后一个块,它是一个空的chuked,可以根据chuked是否为空来判断上一个请求是否结束
HTTPS与网络安全
2016年年底,苹果公司向开发者提出要求:全面适配https网络请求,此要求是为了提高iOS客户端的安全性
HTTP和HTTPS的区别:HTTPS = HTTP + SSL/TLS,多出的 SSL/TLS,就是安全模块
总结: HTTPS是安全的HTTP,他的安全,是由SSL/TLS协议来保障的
IP层: 网络层
TCP层:传输层
HTTP:应用层
SSL/TLS: 协议中间层
HTTPS的连接建立流程(有安全保证)
- 客户端发报文,包含客户端支持的TLS版本,客户端支持的加密算法,还有一个随机C
- Server返回给客户端一个握手消息,也包括最终决定的加密算法(客户端提供N中,Server选择一个),随机数S和Server的证书
- 客户端进行证书的公钥验证,来判定当前server是否合法
- 客户端组装会话秘钥(用随机数C+S+客户端产生的预主秘钥三个组装合 )
- 客户端会发送报文,通过Server的公钥对预主秘钥进行加密传输
- server端通过私钥解密得到预主秘钥
- server端组装会话秘钥(用随机数C+S+私钥解密得到的预主秘钥三个组装合成)
- 客户端向Server端发送加密的握手消息
- Server端返回给客户端一个加密的握手消息,来验证安全通道是否已经验证完成
备注:
会话秘钥 = 随机数S + 随机数C + 预主秘钥
会话秘钥是对称加密的秘钥
公钥和私钥是非对称加密
HTTPS中使用了哪些加密手段,为什么使用这些?
主要使用了对称加密和非对称加密
- 连接建立过程使用非对称加密,保证安全
非对称加密很耗时!!!,因为加密和解密使用的手段不一样 - 数据传输过程是使用的对称加密,减少耗时所带来的性能损耗
非对称加密
假设发送方要发送hello出去,那么发送方会先用一个公钥对hello进行加密,之后经过TCP的连接,将加密之后的内容发给接收方
当接收方拿到数据后,用私钥进行解密,然后拿到hello
加密用公钥,解密就要用私钥,如果加密用私钥,那么解密就要用公钥
加密和解密必须使用不同的钥
好处是非常安全,只有公钥是在TCP中传输,私钥永远保留在Server端,不涉及被中间人盗取的情况
对称加密
发送方使用一个对称秘钥进行加密,然后将结果通过TCP连接传过去
接收方通过同一个对称秘钥进行解密,拿到结果
加密和解密是同一把钥匙
自身缺点是:秘钥需要通过TCP通道进行传递,这样server才能使用这个秘钥,一旦在传递过程中被中间人攻击,那么就不能保证安全了
工具
Charles查尔斯小瓶子(网络调试代理)
当你开着charles去刷新某个网页时,charles会抓到你请求的数据
查尔斯抓包原理是什么?
利用了HTTP的中间人攻击漏洞来进行实现的
关于HTTP的中间人攻击是什么?
当客户端发送请求时,中间人会拦截住,然后假冒客户端的身份,去向server请求, server会返回结果给中间人,然后中间人再把结果返回给客户端
中间人可以篡改我们请求的参数,包括server返回的数据也可以篡改
- Wireshark(网络分析器)
打开Wireshark的wifi连接,然后随便打开一个网页,就可以在Wireshark看到网络数据
80是HTTP的端口号
5985是客户端的临时端口号
下面这条59854 - 80的数据,是客户端向服务器端方向发送的一个报文,还可以看到是TCP报文,并且是SYN,证明是第一次握手
传输层中的TCP和UDP
TCP: 传输控制协议
UDP: 用户数据报协议
UDP
UDP协议是什么,特点和功能是什么?
特点:
- 无连接: 发送UDP数据报时,不需要事先建立好连接,也不需要释放连接
- 尽最大努力交付: 不保证可靠传输
- 面向报文: 既不合并,也不拆分,它会将应用层报直接拼接UDP首部,组成UDP数报,然后再在IP层拼接上IP首部,直接向外传送
!](https://upload-images.jianshu.io/upload_images/1602974-fc3012d6f898f61f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
备注:
IP层: 网络层
TCP层:传输层
HTTP:应用层
SSL/TLS: 协议中间层
功能:复用分用,差错检测
复用分用
建立传输过程中需要IP地址和端口号的组成,也就是常说的套接字
TCP
特点
- 面向连接 : 数据传输开始前需要建立连接,结束后要释放连接
- 可靠传输: 保证报文无差错,不丢失,不重复,按序到达
- 面向字节流
- 流量控制
- 拥塞控制
为什么是三次握手?
三次握手能解决请求的超时场景
三次握手可以解决客户端第一次SYN报文的超时问题
假如第一次SYN超时,客户端会在一定时间后发起SYN重连,当Server回复连接报文后,如果客户端的第一个超时SYN此时发出来了,如果是两次握手的话,那么Server端会认为客户端发来两次连接报文,如果是三次连接,当Server回复后,会等待客户端的ACK确认报文,客户端只会确认一次,那么Server就会认为客户端第二次发送的SYN报文是无效的
为什么是四次挥手?
6和7之后,客户端向server端的通道就关闭了
8和9之后,server端向客户端的通道就关闭了
之所以关闭两次,是因为TCP通道是双向的,一条通道,两方都可以发送和接收,所以必须两次断开
DNS解析
域名到IP地址的映射
Session / Cookie
是为了解决HTTP的无状态特点的
无状态: 在多次发送HTTP请求的时候,如果是同一个用户的话,对于server端,它是不知道这是同一个用户的
当我们打开一个网页去购买商品的时候,会添加到购物车中,会发送多次请求,那么server端应该如何去规避这种无状态的弊端呢
Cookie是用来区分用户的,他会记录用户状态,保存在客户端
Session也是用来区分用户的,他会记录用户状态,保存在Server端