网络通信从用户态到物理网络的完整发送和接收流程

1. 数据发送流程

用户程序调用系统调用
  1. 应用程序调用 write()send(),将数据从用户空间传递到内核。
  2. 系统调用接口(如 sys_sendtosys_write)进入内核态。

内核查找套接字
  1. 内核根据文件描述符(如 sockfd)查找对应的套接字对象。
    • 套接字对象中包含通信所需的元数据,例如目标地址、端口号、协议类型(TCP/UDP)等。

发送缓冲区处理
  1. 内核检查套接字的发送缓冲区:
    • 空间足够: 数据被拷贝到发送缓冲区,系统调用立即返回,表示发送成功。
    • 空间不足:
      • 阻塞模式: 系统调用阻塞,直到缓冲区有足够空间。
      • 非阻塞模式: 系统调用返回 -1,并设置 errnoEAGAINEWOULDBLOCK

协议栈处理(传输层和网络层)
  1. 传输层处理(TCP/UDP):

    • TCP:
      • 数据可能被分片(根据发送缓冲区大小和路径 MTU)。
      • 每个分片添加 TCP 头部(源端口、目标端口、序列号、校验和等)。
    • UDP:
      • 数据直接打包为一个 UDP 报文,加上 UDP 头部(源端口、目标端口、长度和校验和)。
  2. 网络层处理(IP):

    • 传输层数据被封装为 IP 数据包。
    • 添加 IP 头部(源 IP、目标 IP、协议类型、TTL 等)。
    • IP 数据包被交给链路层。

链路层和物理网络
  1. 链路层处理:

    • 数据包被传递给网卡驱动。
    • 网卡驱动将 IP 数据包封装为数据帧(以太网帧)。
    • 添加链路层头部(包括目标 MAC 地址、源 MAC 地址等)。
  2. 物理网络发送:

    • 网卡驱动通过网络硬件(如以太网、Wi-Fi)将数据帧发送到目标主机。

2. 数据接收流程

物理网络到链路层
  1. 接收数据帧:

    • 目标主机的网卡硬件接收到数据帧,通过网卡驱动传递到内核。
  2. 链路层解析:

    • 去除链路层头部(如以太网帧头部)。
    • 将 IP 数据包传递给网络层。

网络层处理(IP 协议)
  1. IP 数据包解析:
    • 检查 IP 头部的合法性(如校验和、TTL 等)。
    • 根据目标 IP 地址,确认数据包是否属于本机。
    • 将有效载荷传递给传输层。

传输层处理(TCP/UDP 协议)
  1. TCP:

    • 检查 TCP 头部(如序列号、校验和等)。
    • 将数据按序放入接收缓冲区。
    • 如果有丢包,发送重传请求。
  2. UDP:

    • 检查 UDP 头部合法性。
    • 将数据直接交给应用程序。

接收缓冲区与用户程序
  1. 拷贝数据到用户空间:
    • 应用程序调用 read()recv()
    • 数据从内核的接收缓冲区拷贝到用户空间。
    • 系统调用返回数据长度,表示接收完成。

总结:完整流程

 

plaintext

复制代码

发送端: 应用程序调用 send()/write() ↓ 系统调用进入内核态 ↓ 内核查找套接字,检查发送缓冲区 ↓ 传输层(TCP/UDP):分片、添加头部 ↓ 网络层(IP):添加 IP 头部 ↓ 链路层(以太网):添加 MAC 头部 ↓ 网卡驱动发送到物理网络 物理网络 → 目标主机 接收端: 网卡驱动接收数据帧 ↓ 链路层:解析以太网头部 ↓ 网络层:解析 IP 头部 ↓ 传输层(TCP/UDP):解析传输层头部 ↓ 内核接收缓冲区 ↓ 应用程序调用 recv()/read() 获取数据


关键点补充

  1. 发送缓冲区和接收缓冲区:

    • 发送缓冲区用于存储待发送数据;接收缓冲区用于存储收到的数据。
    • TCP 协议确保缓冲区中的数据完整且有序,UDP 不提供可靠性保证。
  2. 系统调用返回时机:

    • 对阻塞套接字,send() 返回表示数据已被写入发送缓冲区。
    • 对非阻塞套接字,若发送缓冲区满,send() 立即返回 EAGAIN
  3. 协议栈的分层处理:

    • 每一层(传输层、网络层、链路层)负责处理对应的协议头部和功能,层层封装或解析数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/61623.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙NEXT开发案例:字数统计

【引言】 本文将通过一个具体的案例——“字数统计”组件,来探讨如何在鸿蒙NEXT框架下实现这一功能。此组件不仅能够统计用户输入文本中的汉字、中文标点、数字、以及英文字符的数量,还具有良好的用户界面设计,使用户能够直观地了解输入文本…

贪心算法(1)

目录 柠檬水找零 题解: 代码: 将数组和减半的最少操作次数(大根堆) 题解: 代码: 最大数(注意 sort 中 cmp 的写法) 题解: 代码: 摆动序列&#xff0…

数据结构(一)链表

目录 链表 单向链表 单向链表结构与基本操作 插入节点 删除节点 搜索节点 遍历链表 反转链表 双向链表 双向链表结构与基本操作 节点定义和创建 插入节点 删除节点 搜索节点 遍历链表 转链表反 在开始讲线性表之前,先给各位读者重新回顾一下链表 链…

linux从0到1——shell编程7

声明! 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&a…

微软发布Win11 24H2系统11月可选更新KB5046740!

系统之家11月22日报道,微软针对Win11 24H2系统推出2024年11月最新可选更新补丁KB5046740,更新后系统版本后升至26100.2454,此次更新后修复当应用程序以PDF和XLSX格式导出图表对象时停止响应、无法使用API查找旋转信息等问题。以下小编将给大家…

五天SpringCloud计划——DAY2之使用Docker完成项目的部署

一、引言 刚刚学完了Docker的使用,现在知识在脑子里面还是热乎的,是时候把它总结一下了。 现在的我认为Docker时一个部署项目的工具(不知道是不是真的),相比于我以前使用宝塔面板部署项目,使用Docker更能让我看到代码之美,怎么一…

.net6 使用 FreeSpire.XLS 实现 excel 转 pdf - docker 部署

FreeSpire.XLS && Aspose.Cells包都可以实现。实现过程中发现如下问题: 本地测试通过, docker部署服务器后报错: The type initializer for Spire.Xls.Core.Spreadsheet.XlsPageSetupBase threw an exception. 由于缺少依赖&#xf…

sed使用扩展正则表达式时, -i 要写在 -r 或 -E 的后面

sed使用扩展正则表达式时, -i 要写在 -r 或 -E 的后面 前言 -r 等效 -E , 启用扩展正则表达式 -E是新叫法,更统一,能增强可移植性 , 但老系统,比如 CentOS-7 的 sed 只能用 -r ### Ubuntu24.04-E, -r, --regexp-extendeduse extended regular expressions in the script(fo…

学习ASP.NET Core的身份认证(基于Cookie的身份认证2)

采用基于Cookie的身份认证,在调用services.AddAuthentication注册服务时,可以通过CookieAuthenticationOptions对象按需设置Cookie属性,常用的包括以下属性(更详细的介绍见参考文献2,微软的帮助文档中的介绍看的头大&a…

设计模式之 模板方法模式

模板方法模式是行为型设计模式的一种。它定义了一个算法的骨架,并将某些步骤的实现延迟到子类中。模板方法模式允许子类在不改变算法结构的情况下重新定义算法的某些特定步骤。 模板方法模式的核心在于: 封装算法的骨架:通过父类中的模板方…

Softing线上研讨会 | Ethernet-APL:推动数字时代的过程自动化

| (免费)线上研讨会时间:2024年11月19日 16:00~16:30 / 23:00~23:30 Ethernet-APL以10Mb/s的传输速率为过程工业中的现场设备带来了无缝以太网连接和本质安全电源,这不仅革新了新建工厂,也适用于改造现有工厂。 与现…

Idea修改Commit Changes模式、idea使用git缺少部分Commit Changes

文章目录 一、模式一1、页面效果如下2、如何打开为这种样式? 二、模式二1、页面效果如下2、如何打开为这种样式? 三、总结 前言:Idea中代码提交到git库时的commit Change有两种模式,每种模式的界面及功能都不太一样。 Commit Cha…

Getx:GetxController依赖管理02,Binding绑定全局控制器(懒加载Controller)

在使用GetX 状态管理器的时候,如果每个页面都手动实例化一个控制器就太麻烦了, Binding 的作用就是所有需要进行状态管理的控制器进行统一初始化 创建全局控制器Binding import package:get/get.dart; import ../controllers/counter.dart; // 同上一篇内…

东土科技孵化的“网联汽车高速通信技术”前沿产品亮相2024WICV大会

2024世界智能网联汽车大会(WICV)于近日在北京召开。本次大会发布了由中国汽车工程学会组织全球200余位专家,联合评审遴选出未来十年对于智能网联汽车发展具有重要影响的十大技术趋势,包括“面向高级别自动驾驶的超级人工智能”“网…

torch.__version__的torch版本和conda list的torch版本不一致

conda list是1.9.0的torch,但是torch.__version__是1.6的,很奇怪 后来发现这个1.6的torch是base的版本 但是使用“python -m site”查看当前环境的包搜索路径,也是对的,先从我自己的虚拟环境搜索 最后从我自己的虚拟环境里pip uni…

nginx 配置lua执行shell脚本

1.需要nginx安装lua_nginx_module模块,这一步安装时,遇到一个坑,nginx执行configure时,一直提示./configure: error: unsupported LuaJIT version; ngx_http_lua_module requires LuaJIT 2.x。 网上一堆方法都试了,都…

【linux】插入新硬盘如何配置:格式化、分区、自动挂载(Ubuntu)

文章目录 具体方法GPT分区表(GUID Partition Table)(建议都用这种分区方法)MBR分区表方法(最大支持2TB分区)(Master Boot Record) 附加:如何查看硬盘的型号另外&#xff…

使用itextpdf进行pdf模版填充中文文本时部分字不显示问题

在网上找了很多种办法 都解决不了; 最后发现是文本域字体设置出了问题; 在这不展示其他的代码 只展示重要代码; 1 引入扩展包 <dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</v…

【Ubuntu】如何在Ubuntu系统中查看端口是否可用

文章目录 前言一、使用netstat命令二、使用ss命令三、使用lsof命令四、使用nc&#xff08;netcat&#xff09;命令总结 前言 本文介绍了如何在Ubuntu系统中查看端口是否可用的方法&#xff0c;并给出了具体的命令示例&#xff0c;帮助用户通过命令行工具检测端口的开放状态。 …

长短时记忆网络(SLTM):理解与实践

长短时记忆网络&#xff08;SLTM&#xff09;&#xff0c;即短期长期记忆网络&#xff0c;是一种特殊的循环神经网络&#xff08;RNN&#xff09;&#xff0c;它能够学习到数据中的长期依赖关系。在这篇文章中&#xff0c;我们将详细介绍SLTM的工作原理&#xff0c;并提供一个简…