计算机网络复习

发布于:2025-02-24 ⋅ 阅读:(8) ⋅ 点赞:(0)

目录

1. 前言

2.五层模型

1.应用层

2 传输层

3.网络层

4. 数据链路层

​编辑5. 物理层

3.UDP/TCP协议

UDP协议

TCP协议

4. HTTP/HTTPS协议


1. 前言

  博主目前大四, 备战春招, 复习一下计网, 大家也可以看看我的文章. 共同学习, 如有不足之处欢迎指正.

2.五层模型

  在计网中, 有一个很重要的概念就是协议分层, 上层协议无需关注下层做了什么工作, 只需要调用下层提供的接口即可(一般在程序猿的视角里, 大部分调用的是应用层协议,来完成相对应的工作, 这层协议也是平时打交道最多的一层协议)

 下图是OSI七层网络模型, 是最初的大佬们设计出来的方案, 后面由于太过于复杂, 所以舍弃了这种设计, 把应用层, 表示层, 会话层合并为应用层. 

接下来, 我将从上到下给大家逐步介绍一下这些协议分别有什么作用,以及常见协议的特点. 并且用微信发送消息来举例, 描述一下各协议是如何工作的. 

1.应用层

常见协议: HTTP, HTTPS, WebSocket

应用层协议是平时程序员打交道最多的一层, 为应用程序之间的通信提供了规则, 它负责的是把数据进行封装成应用层数据包, 来发送给传输层, 用我们常见的微信发消息距离, 比如a要发送给b一个"你好", 应用层就会封装这个"你好" 成应用层数据包, 假如约定的格式如下: 

发送微信号; 接收方微信号; 发送时间;消息正文

11111; 22222; 2025-2-22 20:28:00; 你好

应用程序就会调用操作系统的api, 把这个数据包交给传输层, 至于传输层怎么做的, 应用层无需关心. 只需要调用api并发送过去即可

2 传输层

常见协议: TCP/UDP

TCP和UDP协议是两种常见的, 不同传输层协议

其中: TCP协议是可靠的, 有连接的, 面向字节流, 全双工的

         UDP协议是不可靠的, 无连接, 面向数据报, 全双工的

  传输层的主要职责是确保数据能够在网络中从源端传输到目的端,并且保证数据的完整性和可靠性。它提供了端到端的数据传输服务,并且对数据进行分段和重组,以适应不同网络环境的传输需求.

如果是TCP协议并且之前没有建立连接, 在这一层还需要做的工作就是通过三次握手建立连接.

此时这个微信消息在传输层这里, 会进行一次封装, 在这条数据前面加上报头

报头里面最主要存放的数据就是, 源端口号, 目的端口号

此时这个封装好的数据包就会继续调用网络层的api, 交给下层继续封装

3.网络层

常见协议: IP协议

  网络层的作用是, 通过目标IP地址,将数据从源主机经过多个网络和多段链路传输到目的主机,  在路由器的路由表中进行寻址, 和路由选择(会有一个字段,记录跳转了多少次路由器, Linux默认最大次数为64, windos默认最大为128, 如果超过64次还没有找到目标ip, 则把这个数据包丢失, 防止路由环路无法到达目的地, 并且消耗网络资源) ,并最终连接到目标IP对应的设备.

此时这个微信消息在网络层这里, 会进行一次封装, 在这条数据前面加上IP报头

这里也会包含一些辅助信息, 其中最关键的就是源IP地址和目标IP地址

构造完完整的IP数据包, 继续调用数据链路层的接口, 来完成下一层的传输

4. 数据链路层

 数据链路层协议: 以太网

以太网就是我们日常最常见的有线网络, 主要是交换机负责传输, 数据链路层主要负责的是mac地址寻址. 找到对应的mac设备

此时这个微信消息会被在这一层封装成帧, 确保数据能够传输下去 到达物理层

5. 物理层

物理层涉及到硬件设备, 提供了网络通信的硬件设施, 它的主要作用就说把数据链路层传来数据帧给转化为光信号/电信号

通过这样一系列操作, 最终可以把数据从家里发送出去

这时候如果到了接收方这里

假设接收方是b

1. b会把收到的光信号/电信号转化为数字信号(0和1) 得到一个以太网数据帧, 进一步把这个以太网数据帧较给数据链路层来处理

2. 数据链路层又会按照以太网数据帧的格式, 来解析出来, 取出载荷, 交给网络层

3.网络层按照IP协议格式进行解析, 取出载荷较给传输层

4.传输层按照UDP协议进行解析, 取出载荷交给应用层

5.到了应用层这里, 就会和对应的程序进行解析数据, 微信这个程序拿到这个数据以后, 就解析出然后弹出对方发送的消息. 发送时间, 然后显示到聊天窗口, 这些步骤其实就是把上述过程反过来, 称为分用.

3.UDP/TCP协议

UDP协议

UDP协议的数据报较为简单, 主要是8个字节的头部报头和载荷(最大为64kb)

其中报头部分包含 源端口, 目标端口, 数据长度, 校验和

由于数据长度采用两个字节来规定, 所以一个UDP数据报的最大就是65535个字节 - 64kb 无法更大了

而端口号也是16位的, 所以端口的取值范围是0-65535

校验和的目的主要是为了校验数据在传输过程中是否损坏, 如果损坏就丢掉, 避免将错就错

TCP协议

相比于UDP协议, TCP协议则更加的复杂, 为了保证可靠性, 牺牲了性能, 也做了很多的处理.

TCP协议的报头大小是20个字节

后面包含了选项(可选无或者有)

保留位(6) 方便后续扩展

标志位(6) TCP协议核心的部分

校验和(16位) 类似于UDP的校验和, 把报头和数据载荷放在一起计算校验和

序号和确认序号则是为了保证UDP协议的重要特性, 可靠传输

首先在发送数据的时候, 

  • 在 TCP 连接建立时,发送方会选择一个 初始序号,这是一个随机值(防止预测攻击)。

  • 每个 TCP 段的序号字段表示该段中 第一个字节的序号。

  • 例如,如果初始序号为 1000,且发送的数据长度为 100 字节,则下一个 TCP 段的序号为 1100

接收数据的一方

收到这个序号以后, 就会把这个序号+1 (确认序号) 发送给发送方

发送方再把这个+1后的确认序号数据, 放到发送方的序号里面发送过去, 来保证数据的可靠传输

TCP协议并没有对数据的大小做出限制, 理论上可以发送无限大的数据, 并且会自动带有分片,组合的功能, 所以如果大数据传输 且需要保证稳定性的话, 更推荐使用tcp协议

通过序号和确认序号, tcp可以在不可靠的网络中提供可靠的网络数据传输

这背后还有很多操作来兼顾可靠性和性能, 如超时重传, 滑动窗口, 拥塞控制, 延时应答, 捎带应答等

这里就不过多阐述了

4. HTTP/HTTPS协议

   HTTP协议又叫超文本 传输协议, 基于TCP协议的应用层协议, 如今被广泛使用, 最主要的应用场景就说网站, 游览器和服务器之间传输数据, 客户端(pc, 手机等)和服务器之间的数据传输, 也很可能是HTTP协议.

 客户端发送一个HTTP请求, 服务器回一个HTTP响应.  是典型的一问一答

而一个HTTP请求包含四个部分

分别为

1. 首行 方法/ url/ 版本号

分别是get, post等方法, 网站的url. 后面跟HTTP版本号

而在响应中 这一行是 版本号/ 状态码/ 状态码的描述

2. 请求头

属于key-value的键值对格式 里面包含了很多信息 如: 游览器类型等 cookie也存储在这里 还有host这种 请求的主机名

3. 空行 

请求头下面的空行, 可以作为请求头的结束标志

4. body 

HTTP的载荷部分

5.HTTPS

http属于明文传输, 不是很安全, 容易被黑客拦截到, 所以现在很多都在用https这种协议

https是基于http做的, 属于加密版本的http, 

至于加密的过程, 可以分为以下几点;

1. 引入对称加密

 将数据进行对称加密

 客户端和服务器使用同一个密钥, 不同的客户端要使用不同的密钥

2.引入非对称加密

 由于密钥非常重要, 而且如果密钥传输的过程中, 被黑客拿到了就很不安全, 所以密钥这一部分使用非对称加密确保密钥的安全性

完整的过程如下:

(1) 客户端连接上服务器以后, 从服务器拿到公钥(公开的 ,谁都可以拿到)

(2) 客户端生成对称密钥, 用公钥加密这个对称密钥 传输给服务器

(3) 服务器用私钥解密对称密钥出来 由于私钥只有服务器自己知道 , 所以相对安全

(4) 后续就可以使用对称加密的方法来进行加密传输数据了

即使是这样, 也存在着很大的安全漏洞

如果黑客使用中间人攻击, 即冒充服务器

此时, 客户端这边以为自己是在和服务器交流, 就用已经被黑客知道自己加密后的对称密钥来加密数据, 黑客自然知道你要发送什么数据, 然后在使用自己伪造客户端发送的对称密钥加密数据, 发送给服务器, 服务器的响应自然自己也都知道. 

黑客不需要关心服务器的公钥私钥是什么, 自己生成一对就行了, 生产公钥和私钥的算法是公开的, 服务器能生, 黑客也可以

黑客可以使用自己的私钥进行解密对称密钥, 拿到了key1

继续使用从服务器拿到的p1对key进行加密, 并且传输给服务器

 这种方式的攻击如何避免呢? 就要用到证书了, 一个证书的构成大概如下图所示: 

1 证书是一个结构化的数据 有很多属性

2 证书有一系列信息 如: 主机名, 公钥, 证书有效期, 公证机构信息, 证书的签名(公证机构使用自己的私钥对校验和进行加密, 就是签名了) 签名本质上就是一个经过加密的校验和

3 证书是搭建服务器的人, 从第三方公证机构申请

验证证书的过程:

 客户端拿到证书以后, 主要做两件事

1. 用一样的校验算法, 把证书的其他字段都算一遍 得到校验和1

2.用系统内置的公证机构公钥, 对证书的签名解密, 得到校验和2

对比一下 ,就可以判断是不是原版证书

  服务器的私钥和第三方公证机构的私钥都只有自己知道. 并且证书里的签名,  是证书里除了签名以外的所有数据(域名, 证书过期时间, 公证机构信息等)进行哈希计算后, 在用私钥进行加密后得到的.  有以下情况:

1. 如果黑客企图篡改公钥, 那么篡改后的证书到了客户端这里, 通过本地的哈希算法计算得到的校验和 与 签名通过公钥解密后得到的校验和并不一致, 所以行不通

2. 如果黑客企图篡改签名, 但是它并没有第三方公证机构的私钥, 所以也篡改不了

3. 如果黑客企图篡改公钥和签名, 用自己的私钥来构造签名, 那么到了用户这里, 通过公钥并不能解密出来这个签名, 自然也失败了

4. 如果黑客申请一个证书, 但是证书里包含了有域名, 客户端拿到了以后, 发现域名都不一致, 所以也行不通, 

所以基于以上的情况, 证书基本上能够杜绝中间人篡改数据.