计算机网络-基础篇

发布时间 2024-01-03 17:14:29作者: wenny-kiki

参考资料:https://xiaolincoding.com/network/1_base/tcp_ip_model.html#应用层

网络模型

Q1:为什么需要网络模型?
同一台设备上的进程间通信,有多种方式,例如管道、消息队列、共享内存、信号等;
不同设备上的进程间通信,就需要网络通信。由于设备是多样性的,为了兼容多种设备,协商出了一套通用的网络协议;
网络协议是分层的,这种体系结构就是网络模型。

Q2:网络模型有哪几种?主要有3种
TCP/IP协议模型:4层
(从上到下)应用层 || 传输层 || 网络层 || 网络接口层

  • 应用层,负责向用户提供一组应用程序,比如 HTTP、DNS、FTP 等;
  • 传输层,负责端到端的通信,比如 TCP、UDP 等;
  • 网络层,负责网络包的封装、分片、路由、转发,比如 IP、ICMP 等;
  • 网络接口层,负责网络包在物理网络中的传输,比如网络包的封帧、 MAC 寻址、差错检测,以及通过网卡传输网络帧等;
    实际应用:5层
    应用层 || 传输层 || 网络层 || 数据链路层 || 物理层
    OSI参考模型:7层
    应用层 || 表示层 || 会话层 || 传输层 || 网络层 || 数据链路层 || 物理层
  • 应用层,负责给应用程序提供统一的接口;
  • 表示层,负责把数据转换成兼容另一个系统能识别的格式;
  • 会话层,负责建立、管理和终止表示层实体之间的通信会话;
  • 传输层,负责端到端的数据传输;
  • 网络层,负责数据的路由、转发、分片
  • 数据链路层,负责数据的封帧和差错检测,以及 MAC 寻址;
  • 物理层,负责在物理网络中传输数据帧;
    常说的七层和四层负载均衡,是用 OSI 网络模型来描述的,七层对应的是应用层,四层对应的是传输层

Q3:协议栈是什么?
所有的网络数据都是通过一层层协议来传送的,像栈一样,所以叫协议栈。
![](https://gitee.com/li_tong26/assert/raw/master/image/Pasted image 20240103161118.png)

网络运作流程

理论

以一个简单的网络拓扑模型为例
![](https://gitee.com/li_tong26/assert/raw/master/image/Pasted image 20240103165955.png)
角色:1.客户端 2.服务器 3.交换机 4.路由器

应用程序:网络应用程序->Socket库
操作系统:协议栈(TCP、UDP->IP)
驱动程序(一般嵌入在操作系统中):网卡驱动程序(控制网卡)
硬件:物理硬件网卡

客户端在浏览器键入一个网址,回车。

应用层:HTTP协议
1.解析URL(网址)
KN1:URL元素组成
http:+//+Web服务器+/+目录名+/+......+文件名
示例:http://www.server.com/dir1/file1.html
当没有路径名时,访问根目录下事先设置的默认文件
2.产生HTTP请求信息(ps:响应报文是服务器返回过来的格式)
![500](https://gitee.com/li_tong26/assert/raw/master/image/Pasted image 20240103170130.png)

应用层:DNS协议
Q1:为什么需要DNS协议?
因为委托操作系统发送消息时,必须提供通信对象的IP地址。HTTP协议解析URL时只能获得服务器的域名。

KN1:域名的层级关系
越靠右层级越高。根域的 DNS 服务器信息保存在互联网中所有的 DNS 服务器中
根DNS服务器(.)
顶级域DNS服务器(.com)
权威DNS服务器(server.com)
![300](https://gitee.com/li_tong26/assert/raw/master/image/Pasted image 20240103170159.png)

KN2:域名解析的工作流程
输入:域名
输出:IP地址
需要与DNS服务器进行交互;
交互前:1.查看浏览器缓存 2.查看操作系统缓存 3.查看hosts文件

获得IP地址后,应用程序调用Socket,委托操作系统的协议栈来工作。协议栈包括传输层的TCP、UDP协议,网络层的IP协议。

传输层:TCP协议
KN1:TCP数据包格式
KN2:TCP的三次握手
KN3:TCP分割数据

网络层:IP协议
KN1:IP数据包格式
KN2:客户端网卡的源IP地址选择

以太网需要MAC头部。发送方的MAC地址在网卡的ROM中。对于接收方的MAC地址⬇
网络层:ARP协议
1.查询ARP缓存,若保存了对方的MAC地址直接使用
2.ARP缓存中不存在,则发送ARP广播查询
![400](https://gitee.com/li_tong26/assert/raw/master/image/Pasted image 20240103170306.png)

网络接口层:
网卡驱动程序为网络包开头加上报头和起始帧分界符,在末尾加上用于检测错误的帧校验序列
![](https://gitee.com/li_tong26/assert/raw/master/image/Pasted image 20240103170335.png)
网卡驱动程序控制网卡将数字信息转换为电信号

二层网络设备-交换机原样转发网络包;
三层网络设备-路由器转发发给自己的网络包

数据包到达服务器后,接收端通过每一层时删除头部;对请求进行响应。最后完成TCP的四次挥手

总结:发送端和接收端反复扒皮和加皮;在路径上数据包不断转发。

Linux收发网络包流程

![300](https://gitee.com/li_tong26/assert/raw/master/image/Pasted image 20240103161235.png)
网卡负责接受和发送网络包。
当网卡接收到一个网络包后,会通过DMA技术,将网络包写入到指定的内存地址,即Ring Buffer,这是一个环形缓冲区。然后告诉操作系统网络包已经到达。
通知操作系统最简单的一种方式就是触发中断。为了解决频繁中断带来的性能开销,Linux 内核在 2.6 版本中引入了 NAPI 机制,它是混合「中断和轮询」的方式来接收网络包,它的核心概念就是不采用中断的方式读取数据,而是首先采用中断唤醒数据接收的服务程序,然后 poll 的方法来轮询数据。
即通知操作系统时,网卡依然向CPU发起硬件中断,CPU收到后,首先根据中断表调用已经注册的中断处理函数①。
②发起硬件中断处理函数,需要先「暂时屏蔽中断」,表示已经知道内存中有数据了,告诉网卡下次再收到数据包直接写内存就可以了,不要再通知 CPU 了,这样可以提高效率,避免 CPU 不停的被中断
③发起软中断处理函数,内核中的 ksoftirqd 内程收到软中断后,就会来轮询处理数据。从 Ring Buffer 中获取一个数据帧,用 sk_buff 表示,从而可以作为一个网络包交给网络协议栈进行逐层处理
恢复刚才屏蔽的中断

当应用程序要发送网络包时,应用程序会进行系统调用从用户态陷入到内核态中的 Socket 层,内核会申请一个内核态的 sk_buff 内存,将用户待发送的数据拷贝到 sk_buff 内存,并将其加入到发送缓冲区①
②网络协议栈从 Socket 发送缓冲区中取出 sk_buff,从上到下逐层处理
③当到达网卡的发送队列时,触发「软中断」告诉网卡驱动程序,这里有新的网络包需要发送,驱动程序会从发送队列中读取 sk_buff,将这个 sk_buff 挂到 RingBuffer 中,接着将 sk_buff 数据映射到网卡可访问的内存 DMA 区域,最后触发真实的发送
④当数据发送完成的时候(eg:收到TCP报文的ACK应答时),网卡设备会触发一个硬中断来释放内存,主要是释放 sk_buff 内存和清理 RingBuffer 内存

sk_buff是定义在内存中的结构体,它可以用来表示各个层的数据包。这样可以大大提高CPU效率,减少拷贝次数。是通过调整sk_buff中的data指针来实现的
![500](https://gitee.com/li_tong26/assert/raw/master/image/Pasted image 20240103165430.png)