图解网络-Linux 系统是如何收发网络包

原文链接 Linux 系统是如何收发网络包的?

核心内容

1. 网络模型

OSI(Open System Interconnection Reference Model) 7层网络模型 (负载均衡)
TCP/IP 4层网络模型

image

负载均衡 是针对OSI 来说的, 负载均衡有四层负载均衡、七层负载均衡,四层负载均衡对应的是传输层。七层负载均衡对应的是应用层。

2. Linux 网络协议栈

如何去记这个数据封装过程,作者提供了一个好办法。

身体比作数据包;-------------应用层
打底衣服比作TCP头;---------传输层
外套比作IP头;----------------网络层
鞋子、帽子比作帧头帧尾;-网络接口层

MTU (Maximum Transmission Unit) 以太网中,规定了最大传输单元(MTU)是 1500 字节,也就是规定了单次传输的最大 IP 包大小。
MTU 是否包含帧头帧尾?
MTU 网络吞吐能力的定义
(实际上,不同的厂商,甚至同一厂商的不同产品型号对MTU的定义也不尽相同; 🤔: 当我们的MTU 是1500 的时候, 是否意味着很有可能我们没有更好的利用我们的网络?上传 受限、?)
MSS

点击查看 mac MTU 命令
// 查看电脑MTU 命令
networksetup -getMTU en0 // en0是没有以太网端口的MacBook Air的Wi-Fi接口
networksetup -setMTU en0 1453

通过上诉过程对应到Linux 网络协议栈

image

  • IP: Internet protocal

  • TCP: Transmission Control Protocol

  • UDP: User Datagram Protocol

  • LVS: Linux Virtual Server

  • Socket: 百度百科对[socket]的解释(https://baike.baidu.com/item/套接字/9637606?fromtitle=socket&fromid=281150&fr=aladdin)

  • ICMP: Internet Control Message Protocol 的缩写,即互联网控制消息协议。它用于 TCP/IP 网络中发送控制消息,提供可能发生在通信环境中的各种问题反馈,通过这些信息,使网络管理者可以对所发生的问题作出诊断,然后采取适当的措施解决问题。

  • ARP: Address Resolution Protocol

3. Linux 接收网络包的流程

image

  1. 网卡收到网络包
  2. 通过DMA 技术写入到RingBuffer
  3. 从RingBuffer 取出数据 (sk_buff)
  4. 经过网络协议栈
  • 网络接口层 去头去尾
  • 网络层 去ip头
  • 传输层 去tcp头或udp头
  • 应用层 将数据交给用户展示或。。。

如何告诉操作系统数据到了?
中断软中断 NAPI

4. Linux 发送网络包的流程

image

  1. 应用程序调用socket 发送数据包的接口 sk_buff (data)
  2. sk_buff 按照 TCP/IP 协议栈从上到下逐层处理
  • 传输层 加 TCP(UDP)头 (segment -> MSS)
  • 网络层 ip 头 packet
  • 网络接口层 帧头帧尾 frame
  1. 告诉应用程序有数据要发,触发软中断
  2. 发送数据
  3. 清理内存

数据包传递过程中可能得几次拷贝

  1. socket 层申请的sk_buff
  2. 在传输层 如果是使用TCP协议传输 需要拷贝数据保证数据传输可靠信(网卡发送完sk_buff是会释放的)
  3. 网络层我们的数据包大小超过MTU,申请额外的sk_buff,将原来的sk_buff拷贝为多个小的

sk_buff 的数据结构设计,众所周知如果我们的数据结构不一样。我们是没办法共用一个结构的,只能通过A数据拷贝为B数据,如果我们的整个数据包都通过这样每一层拷贝处理的话,对于系统来说应该是很浪费的吧。 sk_buff 是整个Linux的协议栈中表示了数据包 从 应用层(不包含)下的socket ,经传输层,网络层,网络接口层 的数据包结构的。

image

5. 总结

image

收获

最大的收获,莫过于可以激发你对网络知识,甚至是操作系统知识的兴趣。

参考资料

负载均衡
什么是MTU(Maximum Transmission Unit)?

mac mtu测试_从Mac OS X的命令行设置MTU大小 | MOS86
深入理解ICMP协议
用大白话解释什么是Socket

提出问题

  1. 对于基础篇的看法
    作者将Linux系统如何收发网络包,放在了基础篇。其实在作者出的电子书上面的排版,这一章是放在 比较靠后的综合篇的。

细想一下似乎放在前面后面都说的通,放在前面是可以让我们带着疑问继续阅读接下来的网络相关的细节知识。

放在后面是带着我们学习到的基础知识去理解网络的综合运用,帮助我们将知识融会贯通、

  1. 如果我们仅关注文中的重点的话我们会有很多疑问
  • TCP 怎么保证可靠传输的?
  • ACK, Acknowledgement,它是一种正向反馈,接收方收到数据后回复消息告知发送方。
  • NACK:Negative Acknowledgement,则是一种负向反馈,接收方只有在没有收到数据的时候才通知发送方。
posted @   shafujiu  阅读(57)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示