首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

网络通信小结

(题图:深圳宝安机场,2018)

在通信双方准确地传输数据,是互联网最重要的功能之一。本文以网络模型为切入点,从前端向的角度解析一次网络通信的过程。

国际标准组织规定中网络模型有七层,现实中网络数据的传输更多地以五层模型为准。从下至上依次是:物理层、链路层、网络层、传输层、应用层。每层都有特定的协议来完成特定的功能。

五层网络模型

物理层

使用物理手段(比如光缆、电缆、双绞线)将网络设备连接起来,主要规定网络的电气属性,用来传输 0 和 1 的电信号。

链路层

规定电气信号的解读方式:多少个电信号算一组,每个信号位有何意义。本层使用最广泛是以太网协议。

以太网规定:一组电信号构成一个数据包,叫做帧。它有最大最小长度。一个帧包含两部分:标头和数据,标头中最重要的部分是 MAC 地址。

MAC 地址是互联网中每个网络设备的物理地址。每个网络设备(网卡)出厂的时刻就拥有独一无二的 MAC 地址。以太网协议下,数据在局域网内以广播的形式传递

网络层

主要判断相互通信的网络设备是否属于同一子网络。如果是交给链路层处理。否则,以路由寻址的方式发送到中间节点,直至找到子网络,然后交给链路层处理。使用最广泛的 IP 协议,规定互联网中,网络设备的网络地址,IP 地址。一个网络设备 MAC 地址是唯一的,网络地址随接入的网络动态变化。

IP 地址包含网络地址和主机地址两部分,并且通过子网掩码的方式确定多个网络设备是否属于同一个网络。

传输层

网络层解决了主机到主机间的通信,传输层解决端到端的通信。一台主机上可能同时有多个程序需要使用网络服务,传输层准确地将某个数据包传输给特定的程序,它引进了一个新参数 端口。端口是每个使用网卡的程序的一个编号。每个数据包都会发送到主机特定的端口,不同的程序就能取到所需的数据。确定主机和端口,就能实现程序之间的数据交流。Unix 中把主机和端口称作 套接字 socket。有了 socket 就可进行网络应用程序开发。

UDP 协议,就是在数据包前面加上端口信息。但 UDP 的可靠性比较差,一旦数据发出,无法知道对方是否收到。TCP 由此出现,可以理解成它是有确认机制的 UDP 协议。TCP 有三次握手、四次挥手。

HTTPS 的加密正是在传输层:安全套接层 [SSL Secure Sockets Layer] 和 传输层安全协议 [TLS Transport Layer Security],TLS 是 SSL 的升级版本,目前主要使用的是 TLS,不过习惯上还是统一叫做 SSL。

应用层

规定各种应用服务,使用网络服务时传递的数据格式。常用服务的协议有:FTP DNS STMP Telent HTTP

接下来以 Web 通信中,十分重要的 HTTP/HTTPS为例,展开一次具体的通信过程。

HTTP

一次完整的 http 通信

Http请求是基于TCP connection这个链接的,位码即tcp标志位,有6种标示:

[synchronous 建立联机][acknowledgement 确认][push 传送][finish 结束][reset 重置][urgent 紧急][Sequence number 顺序号码][Acknowledge number确认号码]

三次握手

第一次握手:主机A发送位码为 SYN=1,随机产生 Seq number=1234567 的数据包到服务器,主机B由 SYN=1 知道,A要求建立联机;

第三次握手:主机A收到后检查 ACK number是否正确,即第一次发送的 Seq number+1,以及位码 SYN 是否为1,若正确,主机A会再发送ACK number=7654322(主机B的seq+1),SYN=1,主机B收到后确认ACK值与SYN=1则连接建立成功。

为什么三次握手

第一次握手,B 确定自己接受数据正常;第二次握手,A 确定自己接受和发送数据正常;第三次握手,B 确定自己发送数据正常;

四次挥手

第一次挥手:客户端发送一个FIN = 1(结束) 和随机 seq = u,用来关闭客户到服务端的连接。

第二次挥手:服务端收到这个FIN,他发回一个ACK=1(确认),确认收到序号u+1,以及 seq = v。和SYN一样,一个FIN将占用一个序号。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。(服务器端继续发送未发送完的数据)

第三次挥手:服务端发送一个FIN(结束),ACK=1,seq=w, ack=u+1 到客户端,服务端关闭客户端的连接。

第四次挥手:客户端发送ACK(确认)报文确认,seq=u+1, ack=w+1,这样关闭完成。

(图片源自网络)

为什么四次挥手

握手阶段服务端可直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,服务端收到FIN报文时,可能本身正在传输数据到客户端,所以并不会立即关闭 SOCKET,只能先回复一个ACK报文,告诉客户端端,"你发的FIN报文我已收到"。此时客户端只能接收数据,不能发送。等服务端端所有报文都发送完,才能发送FIN报文。因此需要四步握手。

为什么客户端最后还要等待2MSL?

第一,保证客户端发送的最后一个ACK报文能够到达服务器,因为这个ACK报文可能丢失,于是服务器又会重新发送一次,而客户端就能在这个2MSL时间段内收到这个重传的报文,接着给出回应报文,并且会重启2MSL计时器。第二,防止类似与“三次握手”中提到了的“已经失效的连接请求报文段”出现在本连接中。客户端发送完最后一个确认报文后,在这个2MSL时间中,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样新的连接中不会出现旧连接的请求报文。

HTTPS

什么是 HTTPS

HTTPS 简单说就是 HTTP 的安全版本,是以安全为目标的 HTTP 通道,默认端口号 443,HTTP默认 80 端口。HTTPS = HTTP + SSL/TLS

HTTP 存在的问题: 信息窃听、信息篡改、身份冒充HTTPS解决的问题: 信息加密、完整性校验、身份认证

SSL/TLS 运行机制

主要思路:非对称加密和对称加密混合的方式a. 客户端向服务端索要并验证公钥。为保证公钥不被篡改,将公钥放在 CA 颁发的证书中。b. 双方协商生成 “对话密钥”。c. 双方采用 “对话密钥” 通信。

采用非对称加密方式,信息以一对多的方式传输,但缺点是算法计算复杂,加密速度满。为解决这个问题:每次对话(session),客户端和服务端都生成一个“对话密钥”(session key)来加密信息。对话密钥是对称加密,所以加密速度很快。服务器公钥只用于加密对话密钥本身。这样就减少加密运算消耗的时间,不同客户端密钥不同。

一次完整的 HTTPS 通信步骤(四次握手)

第一次握手:客户端 clientHello

客户端支持的协议版本、支持的加密方法、支持的压缩方法

client random 客户端随机数

第二次握手:服务端 serverHello

确认使用的加密通信版本,如果服务器和浏览器支持的版本不一致,服务器关闭加密通信;确认支持的加密方法

服务器证书

server random

第三次握手:客户端回应验证服务器证书,如果证书不是可信机构颁发的,或者证书中的域名和实际中访问的域名不一致或者证书已过期,就会弹出警告是否继续访问。如果证书没有问题,会向服务器发送以下信息

随机数(pre-master key)用服务端的公钥加密

编码改变通知,随后的信息使用 协商会话密钥 加密发送

客户端握手结束通知,同时发送前面步骤所有内容的 hash 指,供服务器校验。

随后客户端会用三次握手产生的三个随机数 和 相互约定的加密方法,生成会话密钥(session key)

第四次握手:服务端回应服务端用私钥拿到揭秘后的 pre-master key ,结合前两个随机数,使用相互预定的加密方法,在服务端生成和客户端一样的会话密钥,并向客户端返回:

编码改变通知,使用协商会话密钥 加密发送

服务端握手结束通知,同时发送前面步骤所有内容的 hash 指,供客户端校验

接下来,客户端与服务器进入加密通信,就完全是使用普通的HTTP协议,只不过用"会话密钥"加密内容。

(图片源自网络)

参考文档

http://www.ruanyifeng.com/blog/2014/02/ssltls.htmlhttp://www.ruanyifeng.com/blog/2012/05/internetprotocolsuitepart_i.htmlhttps://juejin.im/post/5c1913a46fb9a049db73119ahttps://www.jianshu.com/p/bd31d3b23725

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190218G1AR8J00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券