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

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更能让我看到代码之美,怎么一…

设计模式之 模板方法模式

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

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…

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

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

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

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

HTML5实现剪刀石头布小游戏(附源码)

文章目录 1.设计来源1.1 主界面1.2 皮肤风格1.2 游戏中界面 2.效果和源码源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c;在线沟通 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/143798520 HTM…

自动驾驶之激光雷达

这里写目录标题 1 什么是激光雷达2 激光雷达的关键参数3 激光雷达种类4 自动驾驶感知传感器5 激光雷达感知框架5.1 pointcloud_preprocess5.2 pointcloud_map_based_roi5.3 pointcloud_ground_detection5.4 lidar_detection5.5 lidar_detection_filter5.6 lidar_tracking 1 什么…

pycharm在使用conda虚拟环境时Terminal爆红问题

问题&#xff1a; 解决方法&#xff1a; 复制cmd.exe后面所有路径 添加到pycharm的shell path中&#xff1a;

《Python浪漫的烟花表白特效》

一、背景介绍 烟花象征着浪漫与激情&#xff0c;将它与表白结合在一起&#xff0c;会创造出别具一格的惊喜效果。使用Python的turtle模块&#xff0c;我们可以轻松绘制出动态的烟花特效&#xff0c;再配合文字表白&#xff0c;打造一段专属的浪漫体验。 接下来&#xff0c;让…

二次封装的天气时间日历选择组件

这个接口没调通 没有数据展示~ userStore.badgeDate是VUEX全部存的日历数据 <template><!-- 日历组件 --><el-date-pickerref"elPicker":size"size"v-model"dateTimeValue":type"dateType":range-separator"rang…

当你项目服务器磁盘报警

当你们公司运维收到这样的邮件&#xff0c;大概率日志文件过大引起的 在Linux下如何不停止服务,清空nohup.out文件呢&#xff1f; nohup.out会一直一直自己增长下去&#xff0c;如果你的服务器硬盘不给力的话&#xff0c;很容易把应用也挂掉&#xff08;硬盘没空间 &#xff0…

低速接口项目之串口Uart开发(四)——UART串口实现FPGA内部AXILITE寄存器的读写控制

本节目录 一、设计背景 二、设计思路 三、逻辑设计框架 四、仿真验证 五、上板验证 六、往期文章链接本节内容 一、设计背景 通常&#xff0c;芯片手册或者IP都会提供一系列的用户寄存器以及相关的定义&#xff0c;用于软件开发人员进行控制底层硬件来调试&#xff0c;或封装…

git branch -d 删除分支

Git进行版本控制时&#xff0c;删除分支是常见的操作。特别是当特定的功能开发完成或者分支不再需要时&#xff0c;删除分支可以帮助保持仓库的整洁。删除本地分支和删除远端分支是两个独立的操作。如果需要同时删除本地和远端的分支&#xff0c;需要分别执行以下两个命令。 一…

Linux环境开启MongoDB的安全认证

文章目录 1. MongoDB安全认证简介1.1 访问控制1.2 角色1.3 权限 2. MongoDB中的常见角色3. MongoDB Shell3.1 下载MongoDB Shell3.2 通过MongoDB Shell连接MongoDB 4. 创建管理员用户5. 为具体的数据库创建用户6. 开启权限认证7. 重启MongoDB服务8. 连接MongoDB9. MongoDB数据库…

PVE的优化与温度监控(二)—无法识别移动硬盘S.M.A.R.T信息的思考并解决

前情提要&#xff1a;空闲2.5英寸机械硬盘&#xff0c;直接放到PVE上测试NAS 使用&#xff0c;通过SATA线的方式让小主机不太美观&#xff0c;并且失去了前期调试的安全性。购入移动硬盘盒&#xff0c;缺点&#xff0c;USB 连接&#xff0c;会失去一些特性。比如本文中遇到的问…