当前位置: 首页 > news >正文

UDP协议栈内核数据结构与守护进程创建流程分析

文章目录

  • 1 UDP 原理
    • 1.1 分离、分用问题
    • 1.2 内核数据结构
  • 2 守护进程
    • 2.1 进程组与作业
    • 2.2 会话
    • 2.3 手写守护进程

1 UDP 原理

1.1 分离、分用问题


UDP内核数据结构:

structudphdr{__u16 source;__u16 dest;__u16 len;__u16 check;};

UDP 报头由4个部分组成,总共8字节。16位 UDP 长度限制了数据长度必须小于等于65535(64KB)。UDP在发送数据时是数据报,这就意味着不会拆包也不会合并。

UDP作为网络层协议需要解决两个问题:

  1. 报头有效载荷如何分离: UDP报头长度固定8字节,指针指向报头起始地址,类型强转后能分离。
  2. 分用问题,交给上层哪个进程:一个端口只能一个进程监听(一个进程能监听多个端口)。

理解如何分离有效载荷:
Windows、Linux操作系统由C为主写的,这个报头就是一个结构体。当主机收到数据,在网络层,指针指向数据,做指针类型强转就得到了数据的正确分布。

1.2 内核数据结构

UDP 没有真正意义上的发送缓冲区,因为它不需要错误重传等行为。但有接收缓冲区。

sk_buf结构体的四个指针:

  • head:缓冲区开始。
  • data:数据开始。
  • tail:数据结束。
  • end:缓冲区结束。


UDP 将应用层将要发送的数据直接写在的这个缓冲区里面。当向下交付时,直接移动指针即可。

以上是 UDP 结构体和内核中的缓冲区,下面是管理 UDP 的结构体。向上交付时通过指针强转实现,该结构体与缓冲区一样,都是贯穿三层协议栈。

TCP 的管理结构体有所不同之处在于是基于连接的:

2 守护进程

2.1 进程组与作业

前台进程一个终端只能有一个,特点是能够获得键盘输入。

进程组是一组进程的集合,且进程组ID(PGID)等于该组的组长(第一个进程)的PID,进程组有利于统一管理一组进程。单个进程一组是特殊情况。

[jack@ubuntu]~$psajx|head-1;psajx|grepsleepPPIDPID PGID SID TTY TPGID STATUIDTIME COMMAND1336399133648413364841336399pts/01336484S+10010:00sleep10001336399133648513364841336399pts/01336484S+10010:00sleep2000

前台进程组中每一个前台进程会尝试拥有键盘输入,谁先抢到谁先拥有。

进程组是站在系统内核角度看的,作业是站在 shell 角度看的,作业与进程组基本上可以认为是一个东西。

创建三个作业(进程组):

[jack@ubuntu]~$jobs[1]Runningsleep1000|sleep2000|sleep3000&[2]- Runningsleep1000|sleep2000&[3]+ Runningsleep1000&

[1]号后台作业转到前台:

[jack@ubuntu]~$fg1sleep1000|sleep2000|sleep3000

Ctrl+Z可以将前台作业暂停。

使用bg [作业号]可以继续后台作业,也可以使用信号的方式。

2.2 会话

创建出来的进程组会有一个SID,这是会话的session-id。

PPIDPID PGID SID TTY TPGID STATUIDTIME COMMAND1336399133689613368961336399pts/01336896S+10010:00sleep1000

会话是多个进程组的集合。当通过windows的xshell登录linux,linux会创建一个会话,该会话是登录后的第一个进程,即终端。


退出关闭会话,进程组退出。为了让进程组不受会话影响可以使用将进程组守护化。剥离开会话。使进程变成孤儿进程。

可以使用系统调用实现:

intdaemon(intnochdir,intnoclose);

2.3 手写守护进程

使用setsid函数可以分离会话与进程组。

进程组长不能调用setsid,因为组长进程 pid 等于 pgid。当调用setsid后,成为另一个组长,pgid混乱。所以要先 fork,让子进程成为守护进程,父进程退出。

intdaemon(intnoclose,intnodir)// 风云乱世枭雄起,唯有一人称英雄。善事善名传五域,大仁大意救众生。今朝斩命还世人,五域共颂大爱名。才情横溢天资卓,持剑登顶必成尊。{pid_tpid=fork();if(pid)exit(0);elseif(pid<0)return-1;setsid();if(!noclose){close(0);close(1);close(2);}if(!nodir){chdir("/");}return0;}
http://www.jsqmd.com/news/1365792/

相关文章:

  • 13 — 暂存区深入:你挑出来准备交的作业
  • 2026杭州AI搜索优化服务商深度评测与选型指南 - 品牌报告
  • SleeperX:Mac智能睡眠管理完全解决方案 - 告别电量焦虑的终极指南
  • OpenCV+Python人脸识别实战:工业级优化方案
  • FineReport分页功能详解与实战应用
  • Unity雨滴窗户效果:RenderTexture与Shader实现动态雨痕渲染
  • 破解在职学历提升痛点:学历提升学校推荐中OFFER四支柱方法论如何实现高效拿证? - 全域品牌推荐
  • 2026年激光生产线定制行业应用现状及选型参考指南 - 互联网科技品牌测评
  • 2026年泰州抖音推广公司推荐:如何选择最适合您的合作伙伴 - GrowthUME
  • 解决ROS安装中APT内存锁冲突的实用指南
  • 南京中考复读学校哪家好?南京天元中考复读学校怎么样 - GrowthUME
  • VMware虚拟机免费安装与配置指南:从官方渠道获取合法版本
  • Python新闻数据可视化分析系统设计与实战
  • 微电网双层优化:光伏储能容量配置新方法
  • B站字幕下载终极指南:3分钟轻松获取B站CC字幕资源
  • 音乐解锁神器:3分钟解决加密音乐播放难题,实现跨平台自由聆听
  • 5分钟彻底清理Windows臃肿:Win11Debloat让你的电脑重获新生
  • 德州大数据分析师考试难不难?中山优才教育报考全攻略 - 人工智能报名机构推荐
  • 2026年激光打标机行业态势与主流品牌选型参考 - 互联网科技品牌测评
  • Vibe Coding理念下的现代生物信息学工作流实践:从脚本到声明式分析
  • 苏州中考落榜学生,可以跨市到南京天元中考复读学校就读吗 - GrowthUME
  • AI治理技术实战:从原则到代码的MLOps全链路实现
  • 江西九江汽车贴膜哪家好?英德雷特汽车贴膜车衣改色门店精选推荐 - GrowthUME
  • Swift闭包详解:从基础到高级应用
  • python的工业过程控制场景模拟第一百一十一篇:实现动态前馈算法,实时采集干扰信号,提前输出补偿量抵消扰动影响。
  • Python实现本地化文本二维码生成器:从原理到工程实践
  • WechatBakTool终极指南:3种微信聊天记录解密方法深度解析
  • Python数据存储与运算
  • 英雄联盟终极本地化工具:5分钟学会使用League Akari提升游戏效率
  • 2026海南公司股权转让实操指南,股权变更哪家财税机构专业靠谱?正规代办优先选众致财税 - GrowthUME