用户态网络缓冲区的设计

一、网络缓冲区

  • 在内核中也是有网络缓冲区的,比如使用 read 读取数据(read 是一种系统调用,第一个参数为 fd),当陷入到内核态的时候,会通过 fd 指定 socketsocket 会找到对应的接收缓冲区。
  • 在应用程序中设计缓冲区,通过一定的算法来组织好我们的网络数据,方便应用程序在处理业务逻辑的时候从缓冲区中获取数据,进行解析,展开相对应的业务逻辑。

二、Linux 如何接收发送网络数据

在这里插入图片描述

  • 应用程序通过系统调用由用户态陷入到内核态,在内核态中找到对应的 socket
    • socket有对应的接收缓冲区发送缓冲区
  • 根据具体的接口判断是 TCP 还是 UDP,如果是 TCP,就加上一些 TCP 的处理,比如说加上 TCP
  • 进入 IP 层。
  • 进入 MAC 层,会加上一个 MAC 头部信息(帧头帧尾)。
  • 经过网卡驱动把数据写到一个环形缓冲区中,便于网卡环形缓冲区中读取数据,然后把数据发送到网络中。

  • 内核中读取数据是独立运行的,应用程序读取数据也是独立运行的。
  • 如果应用层需要拿对端发送的数据,先需要通过系统调用陷入到内核态,然后把在 socket 层中的已经准备好的接收缓冲区中的数据拷贝到应用程序中
  • 两个流程:
    • 网络协议栈从网络中把数据写到 socket 对应的的接收缓冲区。
    • 应用程序通过系统调用从接收缓冲区中拷贝数据到应用层去处理。

  • 网络数据
    1. 数据帧 frame → 网卡驱动、MAC 层。
    2. 数据包 packetIP 层。
    3. 数据段 segmentTCP / UDP 层。
    4. data → 应用层。

  • 接收网络数据包的流程:
    • 网卡接收到数据包,然后把数据写到 DMA 区域(ringbuffer 结构)
      • DMADirect Memory Access,直接内存操作,不需要 CPU 参与
    • 网卡向 CPU 发起硬件中断CPU 收到中断请求,根据中断表查找中断处理函数调用中断处理函数
      • 为什么需要硬件中断 ?
        • 因为需要使用 CPU 将数据拷贝出来,然后在内核中进行处理。
    • 中断处理函数将屏蔽硬件中断发起软件中断CPU 参与将 DMA 区域中的数据拷贝到网卡驱动,然后经过网络协议栈进行处理
      • 为什么需要先屏蔽硬件中断 ?
        • 避免 CPU 频繁被网卡中断。
      • 为什么需要软件中断 ?
        • 使用软件中断处理耗时操作,避免执行时间过长,导致 CPU 没法响应其他硬件中断。
    • 内核 ksoftirqd 线程负责软中断处理,该线程从 ringbuffer 中逐个取出数据帧到 sk_buff
    • 从帧头取出 IP 协议,判断是 IPv4 还是 IPv6,去掉帧头帧尾。
    • IP 头看上一层协议是 TCP 还是 UDP根据五元组找到 socket并将数据提取出来放到 socket 的接收缓冲区
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值