OC学习22:TCP/UDP/HTTP/HTTPS/Socket/WebSocket/WebService探索
OSI模型
网络协议从低到高:
- 物理层
- 数据链路层
- 网络层(IP)
- 传输层(TCP/UDP)
- 会话层(SSL/TLS)
- 表示层
- 应用层(HTTP/DNS/WebSocket)
问:那么SSL和TLS在哪一层呢?
答:SSL/TLS作用于应用层和传输层之间,如果硬要说在哪个位置,那就是:会话层
URL
URL
全称是Uniform Resource Locator
(统一资源定位符),通过一个URL能找到互联网唯一一个资源
,URL就是资源的地址、位置,互联网上的每个资源都有一个唯一的URLURL基本格式 = 协议://主机地址:端口号//路径
例如: http://www.bboyzj.top:80//2020
- 协议:不同协议,代表着不通的资源查找路径、传输路径
- 主机地址:存放资源的主机(服务器)的IP地址(域名)
- 端口:跟在域名后面的是端口,默认是省略的
- 路径:资源在主机(服务器)中的具体位置
IP(网络层协议)
IP
是 网络层协议
。比作:高速公路
TCP & UDP(传输层协议)
TCP
和 UDP
是 传输层的协议
,比作:卡车。
TCP(传输控制协议
,Transmission Control Protocol)
TCP
是 面向连接的、可靠的、基于字节流的传输层控制协议,需要建立连接和断开连接,即三次握手和四次挥手
,TCP
提供超时重发、丢弃重复数据、检验数据、流量控制等功能
- TCP三次握手过程
为什么是三次握手,而不是二次握手?(三次握手是为了建立一个
可靠的数据传输通道
)刚开始
客户端
处于关闭状态,而且服务端
一直处于监听状态,时刻监听是否有建立连接的请求当客户端需要建立连接的时候就会发送一个
请求连接
的报文,此报文是同步报文SYN=1
,并且会生成一个随机的序号seq=x
,这是第一次握手
当服务端接收到请求连接报文时,会发送一个
确认连接
的报文,此报文是同步报文SYN=1
,并且确认报文ACK=1
,同时服务端也会生成一个随机的序号seq=y
,并且将确认报文确认号ack=x+1
,回传给客户端,这是第二次握手
当客户端接收到服务端的
ACK确认报文后
,会回复一个ACK确认报文
,用于确认确认报文已经收到,此报文ACK=1,seq=x+1,ack=y+1
,这是第三次握手
- 四次挥手
四次挥手则是为了保证数据传输完成接收再关闭连接
客户端断开连接时会发送一个
请求断开连接
的报文,此报文是FIN=1
,并且会生成一个随机的序号seq=u
,发送给服务端,这是第一次挥手
服务端接收到请求断开连接
FIN报文
后,回复一个确认断开连接
报文ACK=1,seq=v,ack=u+1
,这是第二次挥手
当
服务端数据发送完后
,再发送一个准备关闭连接
的FIN
报文给客户端,通知客户端,服务端准备关闭连接,此报文FIN=1,ACK=1,ack=u+1,seq=w
,这是第三次挥手
当客户端收到准备关闭连接
FIN报文
,再发送一个关闭连接FIN
报文ACK=1,seq=u+1,ack=w+1
,并进入TIME-WAIT
等待,等待2MSL
后关闭连接,这是第四次挥手
UDP(用户数据报协议,User Data Protocol)
UDP
是 面向非连接的、不可靠的传输层协议
,不需要建立连接,没有超时重发等功能
TCP 和 UDP 的区别
TCP 需要建立连接和断开连接。UDP 不需要
TCP 数据传输慢。UDP 数据传输快
TCP 传输可靠。UDP 传输不可靠
TCP 传输有序。UDP 传输无序
TCP 基于字节流。UDP 基于数据报
TCP 有超时重发等功能。UDP 没有超时重发等功能
HTTP(应用层协议)
- HTTP是什么?
HTTP的全称是
Hypertext Transfer Protocol
,超文本传输协议
,是互联网上应用最广泛的一种网络协议。应用层的协议
,比作:货物是建立在
TCP
协议之上的一种应用。最显著的特点是客户端发送的每次请求都需要服务端响应
。端口号 80
- 作用:
- 规定客户端和服务端的数据传输格式
- 让客户端和服务器进行有效的数据沟通
- 为什么选HTTP?
简单快速
:因为HTTP协议简单,所有的HTTP服务器的程序规模小,因而通信速度很快灵活
:HTTP允许传输任意类型的数据持续链接
:限制每次链接只处理一个请求,服务器对客户端的请求作出响应后,马上断开链接,这种方式可以节省传输时间
- 通信过程
- 请求:客户端向服务器索要数据
- 请求行:包含了
请求方法,请求资源路径,HTTP协议版本
1 | GET // 请求方法 |
- 请求头:包含了对
客户端的描述
,客服端请求的主机地址等信息
1 | Host:192.168.1.105:80 // 客户端想访问的服务器 主机地址/域名/端口号 |
- 请求体:客户端发给服务器的
具体数据
,比如文件数据
- 响应:服务器返回客户端响应的数据
- 状态行:包含了
HTTP协议版本,状态码,状态英文名称
:
HTTP/1.1 200 OK
常用的响应状态码:
- 响应头:包含了对
服务器的描述
,对返回数据的描述
1 | Server: Apache-Coyote/1.1 // 服务器的类型 |
- 实体内容:服务器返回给客户端的
具体数据
,比如文件数据
- 发送请求的方法:
- 简单说明 : 在HTTP/1.1协议中,定义了8种发送http请求的方法
Get,Post,Put,Delete,Patch,Trace,Connect,Options,Head
get和post请求 ,要想使用Get和Post请求跟服务器进行交互,得先了解一个概念:参数就是传递给服务器的具体数据,比如登录时的账号,密码 ,Get和Post对比:
- Get :在请求URL后面以
?
的形式跟上发给服务器的参数,多个参数之间用&
隔开。 注意:由于客户端和服务器对URL长度有限,因此在URL后面附带的参数是有限制
的,通常不能超过1KB - Post :发给服务器的
参数全部放在请求体
中,理论上,Post传递的参数没有限制
(具体还得看服务器的处理能力)
- Get :在请求URL后面以
Get和Post的选择的建议
- 如果要传递大量数据,比如文件上传,只能用Post请求
- Get的安全性比Post要差些,如果包含机密/敏感信息,建议用Post
- 如果仅仅要索取数据(数据查询),建议使用Get
- 如果是增加,修改,删除数据,建议使用Post
HTTPS(应用层协议)
- HTTPS 是什么?
HTTPS (全称:Hyper Text Transfer Protocol over SecureSocket Layer)
超文本传输安全协议
。是应用层的协议,在
HTTP
基础上引入一个加密层
,使用SSL/TLS
加密数据包保护数据的隐私和完整性
默认是建立在
TCP
协议之上的一种应用端口号
443
- 组成:HTTPS协议 = HTTP协议 + SSL/TLS协议
SSL:全称是 Secure Sockets Layer,即
安全套接层协议
TLS:全称 Transport Layer Security,即
安全传输层协议
- 加密是什么?
加密相关术语:
- 明文:传输的原始数据
- 密文:通过一定的规则将明文变换后的数据
- 加密:将明文变成密文
- 解密:将密文变成明文
- 密钥:在加密和解密的过程中,往往需要一个或多个中间的数据来辅助该过程,这样的数据称为密钥
为什么需要 HTTPS,为什么需要加密?
- 防止传输的数据被
运营商/黑客等
篡改。 HTTPS
密文传输保证了用户信息的安全。
- 防止传输的数据被
- 加密方式
为了保证数据的安全,就需要进行 加密
,即网络传输中不再使用 明文
,而是 加密
后的 密文
。加密的方式有很多种,整体分为两大类:对称加密
和 非对称加密
对称加密:
加密和解密
都会用到同一个密钥
。常见的对称加密算法
有DES、AES、3DES、Blowfish、IDEA、RC5、RC6
。非对称加密:使用
一对非对称的密钥
,一把叫做私有密钥
,另一把叫做公有密钥
;公钥加密只能用私钥来解密,私钥加密只能用公钥来解密。常见的有:RSA、ElGamal、背包算法、Rabin(RSA的特例)、迪菲-赫尔曼密钥交换协议中的公钥加密算法、椭圆曲线加密算法
。
HTTPS 工作过程:
HTTPS
为了兼顾安全与效率
,同时使用了对称加密 + 非对称加密 + 消息摘要算法
。SSL/TLS = 对称加密(DES AES) + 非对称加密(RSA) + 消息摘要算法(MD5 SHA)
- 引入对称加密
对称加密
只通过一个 秘钥
,把明文加密成密文,并且也能把密文解密成明文。
只引入对称秘钥存在的问题:
通过对称秘钥加密,貌似就可以进行数据的保护了。黑客就算入侵了路由器,也只能得到请求的密文内容
但是上述方案有一个问题,就是密钥如何进行约定?毕竟一个服务器对应着很多的客户端,每个客户端和服务器之间都需要约定一个独自的密钥。
可如果让服务器管理所有的密钥,其实并不简单,因此更好的做法就是客户端连接过来时,就自带一个客户端生成好的密钥。当每个客户端在连接之前,自己先生成一个密钥,通过网络将该信息告诉服务器,服务器将这个密钥保存即可。
也正是因为如此,黑客在获取密文请求的同时,也获取到了密钥,因此只使用对称加密并不能起到数据保护的作用。所以还需要让密钥进行加密,但是使用对称加密的话,是行不通的,故引入了 非对称加密
- 非对称加密
非对称加密
要 额外
再用到两个密钥,一个叫做 公钥
,一个叫做 私钥
。公钥和私钥是成对的,这对密钥由服务器产生。
缺点:
运算速度非常慢,比对称加密慢很多
引入流程:
服务器将公钥直接发送给客户端,将私钥保留。客户端得到公钥后,通过公钥将密钥进行加密,再发送给服务器,服务器通过私钥解密获取到密钥。之后再将收到密钥的消息通过密钥加密后发送给客户端,客户端收到后,就使用该密钥通过对称加密的方式与客户端进行数据传输
引入非对称加密后,为什么还要使用对称加密?
由于对称加密的成本(对机器资源的消耗)远远低于非对称加密,而实际上客户端和服务器之间传输的数据量会很大,如果都使用非对称加密,整体的传输速度就会很慢,因此通过非对称加密,让服务器得到密钥后,再使用对称加密进行传输,能够提高传输的效率
引入非对称加密后还存在的问题?
服务器首先生成一对公钥A和私钥A。首先服务器要把公钥A发送给客户端,此时黑客可以当作一个中间人,自己生成一对公钥B和私钥B。他会将服务器的信息阶段,并将自己生成的公钥B发送给客户端。当客户端得到公钥B后,就使用公钥B加密自己生成的密钥A并发送给服务器。此时黑客再次截取,通过私钥B解密公钥B,得到密钥A,并使用公钥A将密钥进行加密返回给服务器。至此服务器和客户端都确定了密钥A,但黑客也神不知鬼不觉的知道了密钥A。故在之后的数据传输中,黑客就可以直接完全的获取客户端和服务器的明文数据。因此即使引入了非对称机密还是存在两个问题:
1)客户端如何获取到公钥?
2)客户端如何确定这个公钥不是黑客伪造的?
为了解决这两个问题,就引入了 证书
- 引入证书机制
- 基本介绍
在客户端和服务器刚建立连接时,服务器就给客户端返回一个 证书
。这个证书就好比人的身份证,用来作为网站的身份标识。而每搭建一个 HTTPS
网址时都需要在 CA
机构申请一个证书。
证书含有的重要信息:
- 证书发布机构
- 证书有效期
- 公钥
- 证书所有者
- 签名
引入证书流程:
服务器首先产生一对 公钥和私钥
,在第三方公证机构申请一个证书时,该证书内就包含了公钥的信息,然后服务器就会将 证书
发送给客户端,由于证书的校验很严格,因此黑客就算获取了,也很难伪造一个假的证书。即使伪造了,客户端也可以拿到第三方公证机构去校验,因此客户端就能够拿到服务器发送的公钥,之后再通过公钥加密自己产生的密钥,发送给服务器。由于黑客没有私钥,就算截获了该请求,也不能拿到密钥,因此服务器就能顺利的得到加密的密钥,并使用私钥来解密。最终就能够很好的防止黑客获取或篡改数据。
校验证书方式:
- 判定证书的有效期是否过期
- 判定证书的发布机构是否受信任
- 判定证书是否被篡改(从系统中拿到该证书发布机构的公钥,对签名解密,得到一个
hash
值(称为数据摘要),设为hash1
。然后计算整个证书的hash
值,设为hash2
。对比hash1
和hash2
是否相等,如果相等,则说明证书是没有被篡改过的)
证书机制
- 服务器首先把自己的
公钥、网址等信息
发给证书颁发机构,向证书颁发机构申请证书。 - 证书颁发机构自己也有一对公钥私钥,
机构
利用自己的私钥
对服务器的公钥、网址等信息
进行签名加密
,生成一个证书
。 - 机构把证书发送给服务端,服务端把证书发送给客户端
- 客户端到指定的机构验证证书,根据
机构公钥去解密
,得到服务器的公钥
。
- 服务器首先把自己的
理解数据值摘要和签名:
针对一段数据,可以通过一些特定的算法对这个数据生成一个签名。由于不同的数据生成的签名差别很大,因此就可以使用签名在一定程度上区分不同的数据。常见的生成签名的算法有:MD5
和 SHA
,以下以 MD5
为例,介绍其特点
- 定长:无论多长的字符串,计算出来的 MD5 值都是固定长度(16字节版本或者32字节版本)
- 分散:源字符串只要改变一点点,最终得到的 MD5 值都会差别很大
- 不可逆:通过源字符串生成 MD5 很容易,但是通过 MD5 还原成原串理论上是不可能的
- 由于 MD5 这样的特性,因此可以认为如果两段数据的 MD5 值相同,则这两段数据相同
- 完整流程
对称加密
:需要有一个客户端生成的对称密钥,用于对传输的数据进行加密,但需要将该对称密钥告知给服务器非对称加密
: 服务器提供一个公钥(自己持有私钥),将公钥传发送给客户端,客户端使用公钥对对称密钥进行加密,将密文传送给服务器引入证书机制
: 通过第三方公证机构,向网站颁发证书,该证书里面就含有公钥。客户端向服务器请求的也就是证书,客户端拿到证书后去公证机构校验,如果证书合法,就使用里面的公钥对对称密钥进行加密
HTTPS连接过程
【第一步】
客户端访问HTTPS连接
【第二步】
服务端发送证书给客户端
,证书是从第三方机构获取【第三步】
客户端验证服务端证书
,从里面将公钥
拿出来【第四步】
客户端用公钥加密对称秘钥
,将密文发送给服务端【第五步】
服务端通过私钥解密得到对称秘钥
【第六步】这个时候就可以通过 对称秘钥加密数据进行传输数据了
注:
会话秘钥 =random S + random C + 前主秘钥
HTTPS和HTTP的区别? 重点
HTTP:超文本传输协议,信息明文传输;端口号80;响应速度快;
HTTPS:超文本传输安全协议,等价于HTTP协议 + SSL/TLS协议;端口号443;响应速度慢;
Socket 重要
- 什么是socket?
Socket 俗称 套接字
,是网络通信的基石。它可以通过 IP地址、端口号、TCP/UDP协议
实现客户端和服务端的双向通信。
- 长链接 和 短链接
长链接:连上就一直聊,通常用于
及时通讯
,效率高。(一对一:)短链接:通讯一次,马上断开,下次再建立连接,效率低。(一对多)
及时通讯:客户端和服务端是 短链接
,客户端与客户端是 长链接
- iOS端实现 Socket
用 GCDAsyncSocket
框架
WebSocket
- 什么是WebSocket?
WebSocket
是 HTML5
中新协议、新API,同HTTP一样是 应用层的协议
。
- 特点
WebSocket
是建立在TCP
之上WebSocket
是一种双向通信协议
WebSocket
是全双工通信
,服务器和客户端能主动向对方发送或接收数据。
注:什么是单工、半双工、全工通信?
数据只能单向传送为单工
数据能双向传送但不能同时双向传送称为半双工
数据能够同时双向传送则称为全双工
WebService
- 什么是WebService?
- 基于web的服务:服务器端整出一些资源让客户端应用访问(获取数据)
- 一个夸语言、跨平台的规范(抽象)
- 多个跨平台、跨语言的应用间通信整合的方案(实际)
- 为什么要用WebService?
WebService
能解决 跨平台、跨语言、远程调用
- 什么时候使用WebService
- 同一家公司的新旧应用之间
- 不同公司应用之间
- 一些提供数据的内容聚合应用:天气预报、股票行情
- Post title:OC学习22:TCP/UDP/HTTP/HTTPS/Socket/WebSocket/WebService探索
- Post author:张建
- Create time:2020-07-09 13:07:02
- Post link:https://redefine.ohevan.com/2020/07/09/OC学习/OC学习22:HTTP&HTTPS&Socket&WebSocket&WebService探索/
- Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.