【Linux】网络编程3

文件描述符的作用

在TCP通信的过程,服务器端会产生两类不同的文件描述符,一个是监听的文件描述符;另一个是用于通信的文件描述符。它们有什么不同呢?

监听的文件描述符:

只有一个,它不负责与客户端的通信,只负责检测客户端的连接请求,检测到有客户端发起连接请求后调用accept函数就可以建立新的连接。

通信的文件描述符:

负责和建立连接的客户端进行通信,如果有N个客户端和服务器建立了新的连接, 通信的文件描述符就有N个,每个客户端和服务器都对应一个通信的文件描述符。

文件描述符对应的内存结构:

  • 一个文件文件描述符对应两块内存, 一块内存是读缓冲区, 一块内存是写缓冲区
  • 读数据: 通过文件描述符将内存中的数据读出, 这块内存称之为读缓冲区
  • 写数据: 通过文件描述符将数据写入到某块内存中, 这块内存称之为写缓冲区

监听的文件描述符:

  • 客户端的连接请求会发送到服务器端监听的文件描述符的读缓冲区中
  • 读缓冲区中有数据, 说明有新的客户端连接
  • 调用accept()函数, 这个函数会检测监听文件描述符的读缓冲区

检测不到数据, 该函数阻塞

如果检测到数据, 解除阻塞, 新的连接建立

通信的文件描述符:

  • 客户端和服务器端都有通信的文件描述符
  • 发送数据:调用函数 write() / send(),数据进入到内核中

数据并没有被发送出去, 而是将数据写入到了通信的文件描述符对应的写缓冲区中

内核检测到通信的文件描述符写缓冲区中有数据, 内核会将数据发送到网络中

  • 接收数据: 调用的函数 read() / recv(), 从内核读数据

数据如何进入到内核程序猿不需要处理, 数据进入到通信的文件描述符的读缓冲区中。

数据进入到内核, 必须使用通信的文件描述符, 将数据从读缓冲区中读出即可

文件描述符的作用是什么?

每一个进程都有一个数据结构task_struct,该结构体里有一个指向「文件描述符数组」的成员指针。该数组里列出这个进程打开的所有文件的文件描述符。数组的下标是文件描述符,是一个整数,而数组的内容是一个指针,指向内核中所有打开的文件的列表,也就是说内核可以通过文件描述符找到对应打开的文件。

然后每个文件都有一个inode,Socket 文件的 inode指向了内核中的Socket 结构,在这个结构体里有两个队列,分别是发送队列和接收队列,这个两个队列里面保存的是一个个struct sk_buff,用链表的组织形式串起来。

sk_buff 可以表示各个层的数据包,在应用层数据包叫 data,在 TCP 层我们称为segment,在IP 层我们叫 packet,在数据链路层称为frame。

你可能会好奇,为什么全部数据包只用一个结构体来描述呢?协议栈采用的是分层结构,上层向下层传递数据时需要增加包头,下层向上层数据时又需要去掉包头,如果每一层都用一个结构体,那在层之间传递数据的时候,就要发生多次拷贝,这将大大降低CPU 效率。

于是,为了在层级之间传递数据时,不发生拷贝,只用 sk_buff 一个结构体来描述所有的网络包,那它是如何做到的呢?是通过调整sk buff 中data 的指针,比如:

· 当接收报文时,从网卡驱动开始,通过协议栈层层往上传送数据报,通过增加skb->data 的值,来逐步剥离协议首部。

这是在发送报文的过程中,data指针的移动过程。

相关推荐
@蓝莓果粒茶33 分钟前
【Unity笔记】保姆级AssetBundle详解(含代码+避坑指南)
笔记·游戏·unity
kobesdu1 小时前
【ROS2实战笔记-20】ROS2 bag 录播与时间模拟:从基础操作到高级调试技巧
笔记·机器人·ros·ros2
云边有个稻草人2 小时前
【Linux系统】进程地址空间
linux·虚拟地址空间·进程地址空间·虚拟地址空间是怎么实现的?·为什么要有虚拟地址空间?·怎么理解虚拟地址空间?
笨鸟先飞的橘猫2 小时前
MMO游戏中的“跨服团队副本”匹配与状态同步系统
分布式·学习·游戏·lua·skynet
Oflycomm2 小时前
工业以太网四大主流协议(EtherCAT/PROFINET/EtherNet/IP/Modbus)技术参数深度对比
网络·网络协议·tcp/ip·欧飞信·plc模组
weixin_514253182 小时前
511-qwen3.5-patch
服务器
yong99902 小时前
C# 实时查看硬件使用率(CPU 内存 硬盘 网络)
开发语言·网络·c#
kobesdu2 小时前
【ROS2实战笔记-18】ROS2 通信的隐秘控制:DDS 配置参数如何决定系统性能
网络·人工智能·笔记·机器人·开源·ros·人形机器人
雨落在了我的手上3 小时前
如何学习java?
java·开发语言·学习
wangl_923 小时前
Modbus RTU 与 Modbus TCP 深入指南-现代替代协议
网络·网络协议·tcp/ip·tcp·modbus·rtu