OC总结篇 - 网络基础

相关文章: 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的区别

初级回答

  1. 请求参数位置: GET以问好拼接放在URL中,POST放在Body中
  2. 请求参数长度限制: GET限制2048个字符,POST无限制
  3. 安全性: GET不安全,POST相对安全

高级回答

  1. GET: 用来获取资源的,需要遵从得是:安全性,幂等性,可缓存性
  2. POST: 是用来处理资源的,需要遵从的是非安全,非幂等,不可缓存

安全性:
指的是不应该引起Server端相关数据的任何状态变化
GET HEAD OPTIONS遵从安全性

幂等性:
同一个请求方法执行多次和执行一次的效果完全相同
PUT DELETE遵从

可缓存性:
请求是否可以被缓存
GET HEAD遵从

常见状态码及含义

1xx
2xx: 200响应成功
3xx: 301和302可能是网络重定向
4xx: 401和404可能是客户端发起的请求本身存在问题
5xx: 501和502可能代表server端本身异常

HTTP的连接建立流程,涉及到TCP的三次握手和四次挥手
  1. 第一步先发起一个HTTP请求前,需要通过TCP的三次握手来建立连接,其实是客户端和server端的三次交互
  2. 第二步是,在这条TCP通道上进行HTTP的请求与相应的数据传递
  3. 第三次是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的特点
  1. 无连接: 它的连接是有一个建立连接和释放连接的过程
    解决方案是:HTTP的持久连接

  2. 无状态: 在多次发送HTTP请求的时候,如果是同一个用户的话,对于server端,它是不知道这是同一个用户的
    当我们打开一个网页去购买商品的时候,会添加到购物车中,会发送多次请求,那么server端应该如何去规避这种无状态的弊端呢
    解决方案是HTTP的Cookie和Session相关技术

持久连接

非持久连接是指,当客户端和server端进行交互时,会打开一个TCP连接,然后关闭,再请求时,又打开一个TCP连接,再关闭,也就是每次网络请求,都要新创建TCP连接
,每次都要经历三次握手和四次挥手

持久连接是指,当我们打开一条TCP通道,在一定时间内,多个HTTP请求,是在同一条TCP通道中进行数据传递,过一段时间后才会关闭这条通道

HTTP为了提升请求响应的效率,所以才有了持久连接这个方案

持久连接的头部字段有:

  1. Connection : keep-alive 客户端期许采用持久连接
  2. time: 20 持久连接需要持续多长时间,20S内如果再次发起同一个域名或者IP的请求,可以 复用TCP通道
  3. max: 10 最多可以支持多少个HTTP请求和响应对

同一条TCP通道上,产生了多次HTTP请求,那么怎样判断一个请求是否结束和后一个请求的开始呢?

  1. 请求和响应报文都有头部字段,在响应报文的头部字段中会涉及到
    Content-length: 1024
    在我们发送请求,server回复时,会携带响应数据的大小,就是Content-length,当客户端所接收的字节数到达这个值时,说明这个HTTP请求响应已经全部接收了,意味着结束

  2. 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的连接建立流程(有安全保证)
  1. 客户端发报文,包含客户端支持的TLS版本,客户端支持的加密算法,还有一个随机C
  2. Server返回给客户端一个握手消息,也包括最终决定的加密算法(客户端提供N中,Server选择一个),随机数S和Server的证书
  3. 客户端进行证书的公钥验证,来判定当前server是否合法
  4. 客户端组装会话秘钥(用随机数C+S+客户端产生的预主秘钥三个组装合 )
  5. 客户端会发送报文,通过Server的公钥对预主秘钥进行加密传输
  6. server端通过私钥解密得到预主秘钥
  7. server端组装会话秘钥(用随机数C+S+私钥解密得到的预主秘钥三个组装合成)
  8. 客户端向Server端发送加密的握手消息
  9. Server端返回给客户端一个加密的握手消息,来验证安全通道是否已经验证完成
HTTPS的连接建立流程

备注:
会话秘钥 = 随机数S + 随机数C + 预主秘钥
会话秘钥是对称加密的秘钥

公钥和私钥是非对称加密

HTTPS中使用了哪些加密手段,为什么使用这些?

主要使用了对称加密和非对称加密

  1. 连接建立过程使用非对称加密,保证安全
    非对称加密很耗时!!!,因为加密和解密使用的手段不一样
  2. 数据传输过程是使用的对称加密,减少耗时所带来的性能损耗

非对称加密
假设发送方要发送hello出去,那么发送方会先用一个公钥对hello进行加密,之后经过TCP的连接,将加密之后的内容发给接收方
当接收方拿到数据后,用私钥进行解密,然后拿到hello
加密用公钥,解密就要用私钥,如果加密用私钥,那么解密就要用公钥
加密和解密必须使用不同的钥
好处是非常安全,只有公钥是在TCP中传输,私钥永远保留在Server端,不涉及被中间人盗取的情况


对称加密
发送方使用一个对称秘钥进行加密,然后将结果通过TCP连接传过去
接收方通过同一个对称秘钥进行解密,拿到结果
加密和解密是同一把钥匙
自身缺点是:秘钥需要通过TCP通道进行传递,这样server才能使用这个秘钥,一旦在传递过程中被中间人攻击,那么就不能保证安全了


工具
Charles查尔斯小瓶子(网络调试代理)

当你开着charles去刷新某个网页时,charles会抓到你请求的数据

查尔斯抓包原理是什么?
利用了HTTP的中间人攻击漏洞来进行实现的

关于HTTP的中间人攻击是什么?
当客户端发送请求时,中间人会拦截住,然后假冒客户端的身份,去向server请求, server会返回结果给中间人,然后中间人再把结果返回给客户端
中间人可以篡改我们请求的参数,包括server返回的数据也可以篡改

  1. Wireshark(网络分析器)
    打开Wireshark的wifi连接,然后随便打开一个网页,就可以在Wireshark看到网络数据
    80是HTTP的端口号
    5985是客户端的临时端口号
    下面这条59854 - 80的数据,是客户端向服务器端方向发送的一个报文,还可以看到是TCP报文,并且是SYN,证明是第一次握手
传输层中的TCP和UDP

TCP: 传输控制协议
UDP: 用户数据报协议

UDP

UDP协议是什么,特点和功能是什么?
特点:

  1. 无连接: 发送UDP数据报时,不需要事先建立好连接,也不需要释放连接
  2. 尽最大努力交付: 不保证可靠传输
  3. 面向报文: 既不合并,也不拆分,它会将应用层报直接拼接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

特点

  1. 面向连接 : 数据传输开始前需要建立连接,结束后要释放连接
  2. 可靠传输: 保证报文无差错,不丢失,不重复,按序到达
  3. 面向字节流
  4. 流量控制
  5. 拥塞控制

为什么是三次握手?
三次握手能解决请求的超时场景



三次握手可以解决客户端第一次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端

你可能感兴趣的:(OC总结篇 - 网络基础)