OC学习22:TCP/UDP/HTTP/HTTPS/Socket/WebSocket/WebService探索

张建 lol

OSI模型

网络协议从低到高:

  • 物理层
  • 数据链路层
  • 网络层(IP)
  • 传输层(TCP/UDP)
  • 会话层(SSL/TLS)
  • 表示层
  • 应用层(HTTP/DNS/WebSocket)

问:那么SSL和TLS在哪一层呢?

答:SSL/TLS作用于应用层和传输层之间,如果硬要说在哪个位置,那就是:会话层

URL

  1. URL 全称是 Uniform Resource Locator(统一资源定位符),通过一个URL能找到 互联网唯一一个资源,URL就是资源的地址、位置,互联网上的每个资源都有一个唯一的URL

  2. URL基本格式 = 协议://主机地址:端口号//路径

例如: http://www.bboyzj.top:80//2020

  • 协议:不同协议,代表着不通的资源查找路径、传输路径
  • 主机地址:存放资源的主机(服务器)的IP地址(域名)
  • 端口:跟在域名后面的是端口,默认是省略的
  • 路径:资源在主机(服务器)中的具体位置

IP(网络层协议)

IP网络层协议。比作:高速公路

TCP & UDP(传输层协议)

TCPUDP传输层的协议,比作:卡车。

TCP(传输控制协议,Transmission Control Protocol)

TCP面向连接的、可靠的、基于字节流的传输层控制协议,需要建立连接和断开连接,即三次握手和四次挥手TCP 提供超时重发、丢弃重复数据、检验数据、流量控制等功能

  1. TCP三次握手过程
  • 为什么是三次握手,而不是二次握手?(三次握手是为了建立一个 可靠的数据传输通道

    • 刚开始 客户端 处于关闭状态,而且 服务端 一直处于监听状态,时刻监听是否有建立连接的请求

    • 当客户端需要建立连接的时候就会发送一个 请求连接 的报文,此报文是 同步报文SYN=1,并且会生成一个 随机的序号seq=x,这是 第一次握手

    • 当服务端接收到请求连接报文时,会发送一个 确认连接 的报文,此报文是 同步报文SYN=1,并且 确认报文ACK=1,同时服务端也会生成一个 随机的序号seq=y,并且将 确认报文确认号ack=x+1,回传给客户端,这是 第二次握手

    • 当客户端接收到服务端的 ACK确认报文后,会回复一个 ACK确认报文,用于确认确认报文已经收到,此报文 ACK=1,seq=x+1,ack=y+1,这是 第三次握手

  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(应用层协议)

  1. HTTP是什么?
  • HTTP的全称是 Hypertext Transfer Protocol超文本传输协议,是互联网上应用最广泛的一种网络协议。应用层的协议,比作:货物

  • 是建立在 TCP 协议之上的一种应用。最显著的特点是 客户端发送的每次请求都需要服务端响应

  • 端口号 80

  1. 作用:
  • 规定客户端和服务端的数据传输格式
  • 让客户端和服务器进行有效的数据沟通

  1. 为什么选HTTP?
  • 简单快速:因为HTTP协议简单,所有的HTTP服务器的程序规模小,因而通信速度很快
  • 灵活:HTTP允许传输任意类型的数据
  • 持续链接:限制每次链接只处理一个请求,服务器对客户端的请求作出响应后,马上断开链接,这种方式可以节省传输时间
  1. 通信过程

  1. 请求:客户端向服务器索要数据
  • 请求行:包含了 请求方法,请求资源路径,HTTP协议版本
1
2
3
GET // 请求方法
/MJServer/resources/images/1.jpg // 请求资源路径
HTTP/1.1 // HTTP协议版本
  • 请求头:包含了对 客户端的描述,客服端请求的主机地址等信息
1
2
3
4
5
Host:192.168.1.105:80 // 客户端想访问的服务器 主机地址/域名/端口号
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9) Firefox/30.0// 客户端的类型,客户端的软件环境
Accept: text/html, // 客户端所能接收的数据类型
Accept-Language: zh-cn // 客户端的语言环境
Accept-Encoding: gzip // 客户端支持的数据压缩格式
  • 请求体:客户端发给服务器的 具体数据,比如文件数据
  1. 响应:服务器返回客户端响应的数据
  • 状态行:包含了 HTTP协议版本,状态码,状态英文名称

HTTP/1.1 200 OK

常用的响应状态码:

  • 响应头:包含了对 服务器的描述,对返回数据的描述
1
2
3
4
5
Server: Apache-Coyote/1.1 // 服务器的类型 
Content-Type: image/jpeg // 返回数据的类型
Content-Length: 56811 // 返回数据的长度
Date: Mon, 23 Jun 2014 12:54:52 GMT // 响应的时间

  • 实体内容:服务器返回给客户端的 具体数据,比如文件数据
  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和Post的选择的建议

    • 如果要传递大量数据,比如文件上传,只能用Post请求
    • Get的安全性比Post要差些,如果包含机密/敏感信息,建议用Post
    • 如果仅仅要索取数据(数据查询),建议使用Get
    • 如果是增加,修改,删除数据,建议使用Post

HTTPS(应用层协议)

  1. HTTPS 是什么?
  • HTTPS (全称:Hyper Text Transfer Protocol over SecureSocket Layer)超文本传输安全协议

  • 是应用层的协议,在 HTTP 基础上引入一个 加密层,使用 SSL/TLS 加密数据包

  • 保护数据的隐私和完整性

  • 默认是建立在 TCP 协议之上的一种应用

  • 端口号 443

  1. 组成:HTTPS协议 = HTTP协议 + SSL/TLS协议
  • SSL:全称是 Secure Sockets Layer,即 安全套接层协议

  • TLS:全称 Transport Layer Security,即 安全传输层协议

  1. 加密是什么?
  • 加密相关术语:

    • 明文:传输的原始数据
    • 密文:通过一定的规则将明文变换后的数据
    • 加密:将明文变成密文
    • 解密:将密文变成明文
    • 密钥:在加密和解密的过程中,往往需要一个或多个中间的数据来辅助该过程,这样的数据称为密钥
  • 为什么需要 HTTPS,为什么需要加密?

    • 防止传输的数据被 运营商/黑客等 篡改。
    • HTTPS 密文传输保证了用户信息的安全。
  1. 加密方式

为了保证数据的安全,就需要进行 加密,即网络传输中不再使用 明文,而是 加密 后的 密文。加密的方式有很多种,整体分为两大类:对称加密非对称加密

  • 对称加密:加密和解密 都会用到 同一个密钥。常见的 对称加密算法DES、AES、3DES、Blowfish、IDEA、RC5、RC6

  • 非对称加密:使用 一对非对称的密钥,一把叫做 私有密钥,另一把叫做 公有密钥;公钥加密只能用私钥来解密,私钥加密只能用公钥来解密。常见的有:RSA、ElGamal、背包算法、Rabin(RSA的特例)、迪菲-赫尔曼密钥交换协议中的公钥加密算法、椭圆曲线加密算法

HTTPS 工作过程:

  • HTTPS 为了兼顾 安全与效率,同时使用了 对称加密 + 非对称加密 + 消息摘要算法

  • SSL/TLS = 对称加密(DES AES) + 非对称加密(RSA) + 消息摘要算法(MD5 SHA)

  1. 引入对称加密

对称加密 只通过一个 秘钥,把明文加密成密文,并且也能把密文解密成明文。

只引入对称秘钥存在的问题:

通过对称秘钥加密,貌似就可以进行数据的保护了。黑客就算入侵了路由器,也只能得到请求的密文内容

但是上述方案有一个问题,就是密钥如何进行约定?毕竟一个服务器对应着很多的客户端,每个客户端和服务器之间都需要约定一个独自的密钥。

可如果让服务器管理所有的密钥,其实并不简单,因此更好的做法就是客户端连接过来时,就自带一个客户端生成好的密钥。当每个客户端在连接之前,自己先生成一个密钥,通过网络将该信息告诉服务器,服务器将这个密钥保存即可。

也正是因为如此,黑客在获取密文请求的同时,也获取到了密钥,因此只使用对称加密并不能起到数据保护的作用。所以还需要让密钥进行加密,但是使用对称加密的话,是行不通的,故引入了 非对称加密

  1. 非对称加密

非对称加密额外 再用到两个密钥,一个叫做 公钥,一个叫做 私钥。公钥和私钥是成对的,这对密钥由服务器产生。

缺点:

运算速度非常慢,比对称加密慢很多

引入流程:

服务器将公钥直接发送给客户端,将私钥保留。客户端得到公钥后,通过公钥将密钥进行加密,再发送给服务器,服务器通过私钥解密获取到密钥。之后再将收到密钥的消息通过密钥加密后发送给客户端,客户端收到后,就使用该密钥通过对称加密的方式与客户端进行数据传输

引入非对称加密后,为什么还要使用对称加密?

由于对称加密的成本(对机器资源的消耗)远远低于非对称加密,而实际上客户端和服务器之间传输的数据量会很大,如果都使用非对称加密,整体的传输速度就会很慢,因此通过非对称加密,让服务器得到密钥后,再使用对称加密进行传输,能够提高传输的效率

引入非对称加密后还存在的问题?

服务器首先生成一对公钥A和私钥A。首先服务器要把公钥A发送给客户端,此时黑客可以当作一个中间人,自己生成一对公钥B和私钥B。他会将服务器的信息阶段,并将自己生成的公钥B发送给客户端。当客户端得到公钥B后,就使用公钥B加密自己生成的密钥A并发送给服务器。此时黑客再次截取,通过私钥B解密公钥B,得到密钥A,并使用公钥A将密钥进行加密返回给服务器。至此服务器和客户端都确定了密钥A,但黑客也神不知鬼不觉的知道了密钥A。故在之后的数据传输中,黑客就可以直接完全的获取客户端和服务器的明文数据。因此即使引入了非对称机密还是存在两个问题:

1)客户端如何获取到公钥?
2)客户端如何确定这个公钥不是黑客伪造的?

为了解决这两个问题,就引入了 证书

  1. 引入证书机制
  • 基本介绍

在客户端和服务器刚建立连接时,服务器就给客户端返回一个 证书。这个证书就好比人的身份证,用来作为网站的身份标识。而每搭建一个 HTTPS 网址时都需要在 CA 机构申请一个证书。

  • 证书含有的重要信息:

    • 证书发布机构
    • 证书有效期
    • 公钥
    • 证书所有者
    • 签名
  • 引入证书流程:

服务器首先产生一对 公钥和私钥,在第三方公证机构申请一个证书时,该证书内就包含了公钥的信息,然后服务器就会将 证书 发送给客户端,由于证书的校验很严格,因此黑客就算获取了,也很难伪造一个假的证书。即使伪造了,客户端也可以拿到第三方公证机构去校验,因此客户端就能够拿到服务器发送的公钥,之后再通过公钥加密自己产生的密钥,发送给服务器。由于黑客没有私钥,就算截获了该请求,也不能拿到密钥,因此服务器就能顺利的得到加密的密钥,并使用私钥来解密。最终就能够很好的防止黑客获取或篡改数据。

  • 校验证书方式:

    • 判定证书的有效期是否过期
    • 判定证书的发布机构是否受信任
    • 判定证书是否被篡改(从系统中拿到该证书发布机构的公钥,对签名解密,得到一个 hash 值(称为数据摘要),设为 hash1。然后计算整个证书的 hash 值,设为 hash2。对比 hash1hash2 是否相等,如果相等,则说明证书是没有被篡改过的)
  • 证书机制

    • 服务器首先把自己的 公钥、网址等信息 发给证书颁发机构,向证书颁发机构申请证书。
    • 证书颁发机构自己也有一对公钥私钥,机构 利用自己的 私钥 对服务器的 公钥、网址等信息 进行 签名加密,生成一个 证书
    • 机构把证书发送给服务端,服务端把证书发送给客户端
    • 客户端到指定的机构验证证书,根据 机构公钥去解密,得到服务器的 公钥

理解数据值摘要和签名:

针对一段数据,可以通过一些特定的算法对这个数据生成一个签名。由于不同的数据生成的签名差别很大,因此就可以使用签名在一定程度上区分不同的数据。常见的生成签名的算法有:MD5SHA,以下以 MD5 为例,介绍其特点

  • 定长:无论多长的字符串,计算出来的 MD5 值都是固定长度(16字节版本或者32字节版本)
  • 分散:源字符串只要改变一点点,最终得到的 MD5 值都会差别很大
  • 不可逆:通过源字符串生成 MD5 很容易,但是通过 MD5 还原成原串理论上是不可能的
  • 由于 MD5 这样的特性,因此可以认为如果两段数据的 MD5 值相同,则这两段数据相同
  1. 完整流程
  • 对称加密:需要有一个客户端生成的对称密钥,用于对传输的数据进行加密,但需要将该对称密钥告知给服务器

  • 非对称加密: 服务器提供一个公钥(自己持有私钥),将公钥传发送给客户端,客户端使用公钥对对称密钥进行加密,将密文传送给服务器

  • 引入证书机制: 通过第三方公证机构,向网站颁发证书,该证书里面就含有公钥。客户端向服务器请求的也就是证书,客户端拿到证书后去公证机构校验,如果证书合法,就使用里面的公钥对对称密钥进行加密

HTTPS连接过程

  • 【第一步】客户端访问HTTPS连接

  • 【第二步】服务端发送证书给客户端,证书是从第三方机构获取

  • 【第三步】客户端验证服务端证书,从里面将 公钥 拿出来

  • 【第四步】客户端用公钥加密对称秘钥,将密文发送给服务端

  • 【第五步】服务端通过私钥解密得到对称秘钥

  • 【第六步】这个时候就可以通过 对称秘钥加密数据进行传输数据了

注:
会话秘钥 = random S + random C + 前主秘钥

HTTPS和HTTP的区别? 重点

  • HTTP:超文本传输协议,信息明文传输;端口号80;响应速度快;

  • HTTPS:超文本传输安全协议,等价于HTTP协议 + SSL/TLS协议;端口号443;响应速度慢;

Socket 重要

  1. 什么是socket?

Socket 俗称 套接字,是网络通信的基石。它可以通过 IP地址、端口号、TCP/UDP协议 实现客户端和服务端的双向通信。

  1. 长链接 和 短链接
  • 长链接:连上就一直聊,通常用于 及时通讯,效率高。(一对一:)

  • 短链接:通讯一次,马上断开,下次再建立连接,效率低。(一对多)

及时通讯:客户端和服务端是 短链接,客户端与客户端是 长链接

  1. iOS端实现 Socket

GCDAsyncSocket 框架

WebSocket

  1. 什么是WebSocket?

WebSocketHTML5 中新协议、新API,同HTTP一样是 应用层的协议

  1. 特点
  • WebSocket 是建立在 TCP 之上
  • WebSocket 是一种 双向通信协议
  • WebSocket全双工通信,服务器和客户端能主动向对方发送或接收数据。

注:什么是单工、半双工、全工通信?
数据只能单向传送为 单工
数据能双向传送但不能同时双向传送称为 半双工
数据能够同时双向传送则称为 全双工

WebService

  1. 什么是WebService?
  • 基于web的服务:服务器端整出一些资源让客户端应用访问(获取数据)
  • 一个夸语言、跨平台的规范(抽象)
  • 多个跨平台、跨语言的应用间通信整合的方案(实际)
  1. 为什么要用WebService?

WebService 能解决 跨平台、跨语言、远程调用

  1. 什么时候使用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.