Skip to content

网络协议

互联网是如何工作的?

一、 计算机网络模型

国际标准模型是 OSI 七层参考模型,它是一个参考,不是一个具体实现,又叫网络互联模型,TCP/IP 协议是参考 OSI 模型进行实现的。OSI 模型分七层:应用层,表示层,会话层,传输层,网络层,数据链路层,物理层。TCP/IP 主要是分四层,应用层,传输控制层,网络层,链路层。将 OSI 模型的应用层,表示层,会话层组成一个应用层,OSI 的链路层和物理层分成链路层。 比 OSI 模型少了三层,结构简单很多。

为什么会有模型?

模型主要就是标准,定义计算机网络的标准,因为早期的网络通信是点对点的通信,那么不同的生产厂商之间的产品和设备不能相互兼容,为了解决这个问题,所以国际上提供了一个标准 OSI 模型标准,所有的厂商都去遵循,兼容这个标准生产。

相同点

  • 都是通过层的结构组成的。
  • 都是网络通信标准。

区别

  • 分层结构不同,OSI 是七层,TCP/IP 是四层
  • OSI 模型是先有模型,再有协议,它是一种设计理论,根据这个去设计接口等规范。TCP/IP 是先有了 http,tcp 等具体的协议,再把这些协议划分到不同的模型层上面去,它是以实际应用为主.
  • OSI 更适合对硬件的开发,比如电流,电压等接口的标准以及对程序的设计。TCP/IP 更多是计算机建立链接需求,主流使用是协议站,比如我和你之间的通信。

二、 TCP/IP 协议(四层模型)

TCP/IP 是网络通信的一个标准,所有的互联网通信都必须遵循这个标准,它是一个由多个协议组成的协议族,他在一定程度上参考了 OSI 模型结构,在 OSI 模型的结构上简化为四层结构。 应用层,传输层,网络层,链路层。不同的层,有不同的协议。其中应用层是指程序员关注的地方,其他的传输层,网络层,链路层都是属于内核。

mac 地址

也叫做物理地址,硬件地址,是由设备出厂商设置的,计算机出厂时就写死在网卡里面了,每个网卡的 mac 地址全世界独一无二,固定不能改变的

IP 地址

是指网络地址,软件地址,每台计算机使用的 ip 地址是由 ISP(指提供 Internet 服务的公司,比如电信、网通、移动等)负责分配的,通常情况下,计算机每次链接不同的网络使用的 ip 地址不一样。IP 地址是动态的,可改变的。

mac 地址和 IP 地址的区别

  • 地址长度不同,mac 的长度是为 48 位,ip 的地址长度为 32 位。
  • 协议层不同,mac 运用在第二层数据链路层,ip 运用在第三层网络层。
  • 分配依据不同,mac 分配是基于制造商,ip 分配基于网络拓朴

路由器

一台独立的拥有 mac 地址的设备,把数据包进行一次转发。 注意,路由器的每一个端口都有独立的 mac 地址 路由只要是负责 ip 地址的寻找

子网

就是给若干个 ip 地址按照某种规则分组,将处在一个大网的若干个 ip 划分成不同组的小网。同处在一个小网里面的 ip 就是被称为同一个子网。

子网掩码

给某台计算机设置一个子网掩码,将 ip 地址和子网掩码进行与运算,得到子网。

默认网关

每台计算机配置一个 ip 地址,用来将数据包发给这个 ip 地址(实际就是路由的 ip 地址)

路由表

确定目的 ip 和路由接口的对应关系,也就是说,我的数据应该从路由的哪个接口出去,路由表是通过子网分组对应接口,同一个子网的不同 ip 对应的是同一个路由接口。

arp 协议

通过 ip 地址找到对应的 mac 地址,电脑里面会缓存一张 arp 表,arp 表缓存了 ip 和 mac 的对应关系,通过 arp 表找到对应的 mac 地址。

为什么要网络分层

  • 为了简化网络的复杂度
  • 有更好的可拓展性,复杂的网络通信通过分层来管理,层与层之间不会相互影响,如果后期需要替换某个应用,🈯️ 需要知道层与层之间的接口连接进行。

应用层

应用层是 tcp/ip 协议的第一层,是直接为应用进程提供服务的,符合应用层的一些协议,主要准备某种协议的数据,发送前通过内核完成和别人的链接。 应用层协议有 HTTP,TFTP,FTP,NFS,WAIS,SMTP,Telent,DNS,SNMP。

  1. 对不同的应用程序,他们会根据自己的需求来使用应用层不同的协议。比如:
  • 邮件传输使用了 SMTP 协议
  • 互联网传输使用了 HTTP 协议
  • 远程登录服务使用了 TELNET 协议
  1. 应用层还能加密,解密,格式化数据。
  2. 应用可以建立或解除与其他节点的联系,可以充分节省网络资源。

传输控制层

传输控制层是端对端的通信,是指应用程序使用什么协议进行通信,给应用层提供端口号。不同协议对应不同的端口号,传输层有两个协议,TCP 协议和 UDP 协议。

  • TCP 协议:面向连接的,可靠的传输协议
  • UDP 协议:无连接,高效的,不可靠的数据报文协议

总体来说,TCP 协议传输效率低,但可靠性强;UDP 协议传输效率高,但可靠性略低,适用于传输可靠性要求不高、体量小的数据(比如 QQ 聊天数据)。

应用层和传输层的联系

应用层是使用传输层的端口号进行传输的,比如 http 使用 80 端口,这个 80 端口是传输层提供的端口,http 是要通过 tcp 去建立链接的。传输层通过端口号来判断应用程序,应用程序通信是需要通过传输层建立通信的管道。

网络层

网络层主要是负责将报文从一台主机传到另一台主机,这个传输报文的整个路程称为网络层,主要是包括寻址(IP)和路由(router)。 网络层包括的协议有:ipv4,ipv6,ICMP,IGMP。

链路层

链路层又称数据链路层或者网络接口层,是物理层,将一个网络层通过多台设备切割成一段一段的网络线路,两个设备直连的这段线路叫做数据链路层,所以一个网络层是由多段数据链路层组成的。 该层包括操作系统硬件的设备驱动,NIC(网卡),光纤等物理可见部分,还包括连接器等一切传输媒介。

网络拓扑:就是指网络线路布局

比如:A 电脑—— 连接路由 1 —— 连接路由器 2 —— 连接 C 电脑

这是 一张网络拓扑。假设 A 通过 http 请求给 C 发送数据。

A 给 C 发送数据通过这个网络拓扑到达 C 这整个网络规划就是 A 和 C 通信的网络层,然而 A 和 C 不是直连的,而是通过路由 1,路由 2 等切割成一段一段的数据线路,然后通过一段一段数据线路查找 mac 地址最终找到 C,那这整个过程就是一个数据链路层,数据链路层就是由这每一段小的线路连接组成,所以网络层是通过数据链路层来组装传输数据的。

A 给 C 发送数据从应用层到链路层的全过程解析:

  • 准备工作,应用层数据包封装,http 请求的发出。
  • 发送数据包之前,传输层接到 http 请求的发出,首先通过 DNS 域名解析获取到 C 的 ip 地址,知道要发给谁,然后通过 TCP 建立通信连接,添加 TCP 包首部
  • 连接建立之后,此时就可以通过连接通道发送数据了,数据发出,程序进入到网络层
  • 网络层的时候封装 IP 头,还有数据包,封装完毕之后,来到链路层,链路层
  • 此时 A 和 路由 1 连接的,A 根据默认网络知道路由 1 的 IP 地址,然后通过 arp 找到路由 1 的 mac,添加一个以太网首部(源 A 电脑 mac,目标 路由 1mac)
  • 路由 1 拿到数据包根据路由表匹配 IP 找到路由 2,再根据 arp 找到路由 2 的 mac,此时更换以太网首部(源 路由 1mac,目标 路由 2mac)
  • 路由 2 拿到数据包根据路由表匹配找到 C 电脑的 IP,再根据 ARP 找到 C 电脑的 mac
  • C 电脑发现 IP 包里面的目标 IP 地址是自己,此时接收数据,并且进行处理。

网络层和链路层的关系

链路层是物理层,一个网络层是由一段一段的链路层组成的,通过链路层给整个网络层传送数据,网络层是通过链路层去查找到最终的接收方,然后将数据传送给他。

三、 TCP 协议

面向连接的,可靠的传输协议。

什么是连接

三次握手

什么是三次握手?

客户端和服务端建立连接了 ,各自开辟了一个队列空间(queue 空间 socket),双方有资源为对方服务。

  • 客户端发送 SYN 给服务端,请求服务端建立建立
  • 服务端收到 SYN 回应一个 SYN+ACK 给客户端,告诉客户端我收到它的连接请求了,并且愿意和他建立连接
  • 客户端收到服务端的 SYN+ACK 回应再次发送 ACK 告诉服务端,我收到你的请求同意了,接下来我们可以进行对话了。

为什么是三次握手?

如果是两次握手,那么 TCP 建立连接只是客户端单方面的,会造成资源的浪费。

TCP 四次挥手

  • 客户端发一个 FIN 报文数据包给服务器请求断开连接
  • 服务器收到 FIN 报文回应一个 ACK 数据包告诉客户端我收到你的断开请求了,正在分配资源,然后进入到 close wait 状态
  • 等到服务 close 状态之后, 有资源断开服务器的连接的了,再发送一个 FIN+ACK 断开连接的报文,服务器进入到 last ack 状态
  • 客户端收到服务器断开连接到 FIN+ACK 报文请求,再次发送 ACK 告诉服务器,我收到你的断开报文了,然后断开。

TCP 的四次挥手为什么是四次,第二部和第三部能不能合并?

第二步和第三步不能合并,服务器收到客户端断开连接的请求后,服务器不可能立马有资源去处理客户端断开连接的请求, 然而客户端每次超过 30 秒没有收到服务端的回应就会重发请求。但是服务器处理断开请求是需要时间的,所以这个时候,服务器需要告诉客户端,他已经收到了客户端的断开请求, 正在等待资源的分配,进入到 close wait 状态。进行了第二部。等到有资源处理了,服务端再发一个断开连接到数据报文回应给客户端,他正在处理断开连接。

什么是 TCP 长连接?

就是一直连接

三、http 协议

什么是 http 协议

超文本传输协议,是一个基于请求与响应,无状态的,应用层的协议,常基于 TCP/IP 协议传输数据,互联网上应用最为广泛的一种网络协议,所有的 WWW 文件都必须遵守这个标准。设计 HTTP 的初衷是为了提供一种发布和接收 HTML 页面的方法。

http1.0,http1.1,http2 比较

  • 时间点:HTTP/0.9(1991 年)、HTTP/1.0(1996 年)、HTTP/1.1(1999 年)、HTTP/2.0(2015 年)

  • HTTP/1.0HTTP/1.1的区别:

    • 缓存处理
    • 带宽优化及网络连接的使用
    • 错误通知的管理
    • Host 头处理
    • 长连接
  • HTTP/1.xHTTP/2.0的区别:

    • 新的二进制格式(Binary Format):HTTP1.x 的解析是基于文本,HTTP2.0 的协议解析采用二进制格式
    • 多路复用(MultiPlexing):即连接共享,即每一个 request 都是是用作连接共享机制的
    • header 压缩:
    • 服务端推送(server push)

http 特点

  • 无状态,无连接
  • 通信是明文的
  • 简单快速、灵活
  • 没有验证通信方的身份
  • 无法保证数据的完整性

四、https

什么是 https

https 不是一个具体的协议,是在 HTTP 基础上进行了 SSL/TLS 加密处理,本质还是 HTTP 通信,在数据传输之前,TCP 握手时候利用 SSL/TLS 建立全信道,加密数据包。 HTTPS 使用的主要目的是提供对网站服务器的身份认证,同时保护交换数据的隐私与完整性。

PS:TLS 是传输层加密协议,前身是 SSL 协议,由网景公司 1995 年发布,有时候两者不区分。

https 特点

  • 内容加密:采用混合加密技术,中间者无法直接查看明文内容
  • 验证身份:通过证书认证客户端访问的是自己的服务器
  • 保护数据完整性:防止传输的内容被中间人冒充或者篡改

https 加密技术

采用非对称加密+对称加密(混合加密技术)来进行加密,就是用非对称加密来沟通获取到对称加密需要的密钥,然后在后续的网络通信中使用对称算法进行加密和解密

为什么需要采用混合加密技术?

  • 如果通过对称加密进行前期的加密沟通,那么加密不够严谨,公钥容易被泄露
  • 如果全部使用非对称加密进行通信,因为非对称加密比较复杂这样数据传输比较慢
  • 所以为了保证前期的加密协商不被窃取以及后期数据的传输效率,加密协商密钥的获取阶段通过非对称加密来协商,后期的数据通信通过对称加密来进行通信

对称加密

就是客户端和服务端使用同一个公钥对内容进行加密和解密。

对称加密的问题

如果客户端和服务端共同持有一个公钥,并且没有被别人知道,那数据进行密钥加密的是安全的。 但是服务端如何把自己拥有的密钥给到客户端?假设服务端生成的密钥通过明文给到客户端,在这个过程中密钥被第三方截取了,那么客户端通过这个密钥进行加密的文件,第三方就可以被截取到

非对称加密

就是由服务端同时生成一对公钥和私钥,通过公钥加密文件,需要对应的私钥解密文件。

非对称加密的问题

客户端需要通过服务端生成的公钥进行加密,所以客户端和服务端协商加密规则时,服务端会把公密给到客户端,如果这个期间第三方截取了服务端给到公钥,同时用它生存的公钥匙替换掉服务器的公钥,那么客户端拿到公钥之后进行加密,将数据传给服务端的时候,第三方截取数据,然后用它的私钥进行解密,就可以截取客户端的数据。

数字签名

CA 机构对服务器上传的.crt 文件进行签名验证数据的真实性和完整性

验证服务端的身份

客户端如何知道它拿到的公钥是服务器给的不是伪造?通过数字证书验证公钥的身份。

数字证书

就是一个.crt 文件,一种验证电脑身份的机制,由数字颁发机构 CA 颁发。

数字证书内容

公钥,申请者,域名等其他的信息。

验证数据的真实性和完整性

客户端如何保证拿到的数字证书是真实的并且完整的?

摘要

将数字证书.crt 进行 hash,就生成了一个摘要,生成摘要之后是不可逆的。

数字签名

对数字证书进行签名,验证数字证书的真实和完整性,CA 机构用自己的私密对摘要进行加密,生成一个数字签名。

如何申请数字证书

  • 服务器将公钥,申请者,域名等其他的信息生成一个.crt 文件然后给到 CA 机构
  • CA 机构收到申请,验证申请者信息,如果没有异常,CA 机构通过.crt 这个明文文件做一个 HASH,得到一个信息摘要。
  • CA 机构用自己的私钥对 HASH 进行加密,得到一个秘文,这就是数字签名
  • 然后通过数字签名+.crt 明文生成一个数字证书

数字签名如何验证数字证书的真实性

  • 浏览器通过 CA 证书提供的公钥对数字签名进行解密得到 hash 值
  • 浏览器再通过 CA 证书提供的公钥对 crt 原文进行 hash 值处理
  • 将数字签名生成的 hash 值和.crt 原文生成的 hash 值进行对比,如果相等,那么数字证书就是完整的。

如何验证颁发机构权威性

通过上面的步骤已经可以验证公钥的身份,以及数字证书的完整性和真实性,但是假如 CA 机构是被第三方入侵者伪造的?这里就需要验证颁发机构的权威性,需要验证颁发机构的权威性,那么就需要更权威的颁发机构来验证,所以就会有一个根证书颁发机构,这个根证书颁发机构是被大家公认的权威机构,通过根证书颁发机构给中证书颁发机构受信,再由中证书颁发机构给用户证书颁发机构授信,来保证用户证书颁发机构的权威性。

证书链

用户颁发机构的权威性是通过证书链来验证的, 证书链主要是有根证书(根证书颁发机构颁发的证书),中间证书(中间证书颁发机构颁发的证书),用户证书(用户证书颁发机构颁发的证书)三部分组成,只有这三个证书都通过了,那么才能证明用户颁发机构证书的权威性。

参考资料和地址:

tcp/ip 工作原理和图解
https 加密原理
[图解 TCP/IP (第五版)书]