TCP/IP协议族

TCP/IP协议族概念与分层

       ⼀系列协议所组成的⼀个⽹络分层模型。

1
2
为什么要分层?
因为⽹络的不稳定性。

具体分层

  • Application Layer 应⽤层: HTTP、 FTP、 DNS
  • Transport Layer 传输层: TCP、 UDP
  • Internet Layer ⽹络层: IP
  • Link Layer 数据链路层:以太⽹、 Wi-Fi

TCP/TP网络分层图例

       如上图,从客户端到服务器,中间会有各种各样的中间节点。理想情况下,只需要 HTTP 经过中间节点直接传过去。因为网络不是绝对稳定的,重传是一定会发生的,而传输数据大小不一。如果传输大数据,传输过程中会有丢失的分险,这样数据传输速度和网络利用率都很差,所以需要分块传输。

       假如现在有一个数据“abcdefghijklmnopqrst”,分段传输,切成如图中的四块,每次按照序号传输,假设③号消息没收到,则最后只需要重传一下③号消息,由于多传输了③,一共传输了 5/4 即 125% 的数据。

       由于上层协议不只 HTTP ,其它协议诸如 FTP 也有分块传输的需求,像 JAVA 中抽取方法一样,此处需要将该功能抽出,只用来做包的分发。于是 HTTP 上层不切块,将消息传给 TCP 层,TCP 负责分割消息。哪一块消息丢失了,TCP 会负责将丢失的消息重新传输。TCP 所在的层级叫传输层,用来传递消息。

       TCP 可以保证网络的稳定传输,但并非所有数据都需要重传,类似网络游戏,当网络卡顿后恢复时,没必要重新传输数据,网络恢复玩家只需要知道自己的最新数据即可,比如位置等信息。这种不需要重传,只需要发出消息即可的协议为 UDP ,对数据的完整性并不像 TCP 那样严格。

       不同场景对数据完整性的要求并不相同,但它们都需要寻址,于是再抽出一层,即IP层。

       最下一层,数据链路层,是物理网络,为网络提供实质的现实世界中的支持。

1
TCP/IP协议族为四层模型,另外还有一个七层模型。

TCP 连接

什么叫做连接

       通信双⽅建⽴确认“可以通信”,不会将对⽅的消息丢弃,即为“建⽴连接”。

TCP 连接的建⽴与关闭

TCP 连接的建⽴

TCP 连接的建⽴

       三次握手。首先客户端向服务端发一个消息,该消息是 TCP 的,不是 HTTP 的,表明要和服务端通信;服务端接受到后确认,并表明自己也要向客户端发送消息,这是第二次握手,一是确认自己知道对方要发消息,二是表明自己也要给对方发消息;客户端接受后发消息表明知道对方要给自己发消息了。

TCP 连接的关闭

TCP 连接的关闭

       四次挥手。客户端向服务端表明不再发送消息;服务端收到后确认,但并不会同时表明自己也不再给客户端发送消息;服务端可能还有消息需要发送,之后单独给客户端发送一个消息,表明自己不再发送消息;客户端收到后发送确认消息,此时连接关闭。

⻓连接

为什么要⻓连接?

       因为移动⽹络并不在 Internet 中,⽽是在运营商的内⽹,并不具有真正的公⽹ IP,因此当某个 TCP 连接在⼀段时间不通信之后,⽹关会出于⽹络性能考虑⽽关闭这条 TCP 连接和公⽹的连接通道,导致这个 TCP 端⼝不再能收到外部通信消息,即 TCP 连接被动关闭。

⻓连接的实现⽅式

       ⼼跳。即在⼀定间隔时间内,使⽤ TCP 连接发送超短⽆意义消息来让⽹关不能将⾃⼰定义为“空闲连接”,从⽽防⽌⽹关将⾃⼰的连接关闭。

HTTPS

定义

       HTTP over SSL 的简称,即⼯作在 SSL (或 TLS)上的 HTTP。在 HTTP 之下增加的⼀个安全层,⽤于保障 HTTP 的加密传输,说⽩了就是加密通信的 HTTP。

  • SSL: Secure Socket Layer
  • TLS: Transport Layer Secure

本质

       在客户端和服务器之间使用非对称加密协商出⼀个对称密钥,每次发送信息之前将内容加密,收到之后解密,达到内容的加密传输。

1
2
3
为什么不直接⽤非对称加密?

非对称加密由于使⽤了复杂的数学原理,因此计算相当复杂,如果完全使⽤非对称加密来加密通信内容,会严重影响⽹络通信的性能。

HTTPS 连接

  1. 客户端请求建⽴ TLS 连接

  2. 服务器发回证书

  3. 客户端验证服务器证书

  4. 客户端信任服务器后,和服务器协商对称密钥

  5. 使用对称密钥开始通信

       4中是通过非对称加密来协商对称密钥,只有第5步才开始使用 HTTP 来做沟通的,前面4步都是使用 TCP 。

HTTPS 连接建⽴的过程

       HTTPS的连接建⽴过程图(不完整)

HTTPS的连接建⽴过程(不完整)

       客户端向服务器表明要建立连接,发送“Client Hello”,并附加自己可以支持的 TLS 版本序列、可以接受的对称加密算法、非对称加密算法以及 Hash 算法,并向服务器发送了一个客户端随机数,稍后用来计算加密密钥。

       服务器收到消息,从客户端支持的 TLS 版本序列和算法中选择一组,例如选择 RSA、AES、MD5这一组,选好之后,附加服务端随机数,和“Server Hello”一起返回,此时双方已经确定了 TLS 版本、加密算法和 Hash 算法。

       紧接着服务器返回服务器证书。核心是服务端发送回来自己非对称加密的公钥(包含在服务器证书内),客户端用此公钥加密信息。上图的3是跟在2后面的,但是是两个消息。

       为了验证服务器地址和证书公钥,服务器还会返回证书签名。签名是作用于前面的所有信息的(服务器地址、证书公钥等等),如果签名验证通过,则说明服务器返回的信息确实是真实的。

       为了验证证书签名,服务器会返回证书签名方的信息,即证书机构,如果证书机构的公钥可以对证书签名进行验证,则可以证明服务器的信息是真实的。

       此处只能证明图中蓝色方块内的信息确实是被黄色方块的“主人”所签发的,所以证书机构内部也需要提供信息,来证明自己是被谁签的,即证书机构的签发方。而证书机构签发方的验证是可以找到可靠来源的,来自操作系统内部,Android、IOS、MAC、Windows等都存有根证书列表。证书机构签发方的公钥在系统里。

1
2
3
为什么根证书值得信任?

根证书是随着操作系统一起被创建出来的,在操作系统被生产和打包的过程中,根证书已经存在,它是被操作系统的研发方所认证的,如谷歌官方、苹果官方、微软官方或者各种浏览器的官方等等。它们的身份和安全是被操作系统和浏览器所保证的。

       上图中中间黄色的机构可以去掉,但现在大多数方案都有中间机构。

       客户端拿到服务器证书公钥,加密 Pre-master Secret 发送给服务端,这是唯一的一次非对称加密过程。Pre-master Secret 也是一个随机数。此时双方便拿到足够多的信息来生产对称密钥。

       Pre-master Secret 会和之前的客户端随机数以及服务端随机数一起作用,通过算法生成 Master Secret,用来计算密钥。这个密钥主要的部分有四个:客户端加密密钥、服务端加密密钥、客户端 MAC Secret 、服务端 MAC Secret 。客户端发消息使用客户端加密密钥,服务端发消息使用服务端加密密钥,这样做更安全。

1
2
MAC Secret 指的是 HMAC 的 Secret。
HMAC:Hash-based Message Authenticate Code ,改良版的 Hash 。假设 Hash 算法为 MD5(a) = b , 则 HMAC(a) = MD5(fun(a)) = c ,对 a 做一些操作来保证 Hash 不容易被破解。

       客户端发出消息,服务端接受后对该消息进行 HMAC ,和客户端连着消息发来的 HMAC 比较,二者是否一致,从而确认消息是否来自客户端。加密密钥用来加密解密,MAC Secret 用来验证身份。

       双方进行最后一次验证,看加密算法是否可用。客户端发送开始使⽤加密通信的消息,接着发送 Finished 消息,将前面的1——4包起来,使用加密密钥加密,使用 MAC Secret 进行相当于签名的操作,将整个信息发送给服务端。服务端收到后解密和验证成功,向客户端发送开始使⽤加密通信的消息,接着发送 Finished 消息,将前面的1——6包起来,发送客户端。客户端同样验证的方式。

       客户端验证成功,便会向服务器发送第一个 HTTP 请求。

       HTTPS的连接建⽴过程图(完整)

HTTPS的连接建⽴过程(完整)

在 Android 中使用 HTTPS

       正常情况下直接使⽤,需要⾃己写证书验证过程的场景:

  • 用的是自签名证书(自签名即客户端负责验证签名是否合法,而不是本地的根证书机构。例如只用于内网的 https)
  • 证书信息不全,缺乏中间证书机构信息(可能性不大)
  • ⼿机操作系统较旧,没有安装最新加入的根证书

       以上情况需要⾃己写证书验证过程。

参考资料:
腾讯课堂 HenCoder

Fork me on GitHub