前段时间写了Linux网络收包流程一文,没想到很多人感兴趣,现上货网络发包流程。

sys_write()

file->f_op->write()(sock_writev)(注0)

sock_writev()

sock_sendmsg()

sock->ops->sendmsg()

(inet_sendmsg)

structsock *sk = sock->sk;

sk->sk_prot->sendmsg();(注1)

udp_sendmsg()

udp_push_pending_frames()

ip_push_pending_frames()

dst_output()

ip_output()

/ip_mc_output()

ip_finish_output()

dev_queue_xmit()

注0:

sock_map_fd()

file->f_op =SOCK_INODE(sock)->i_fop =

&socket_file_ops

注1:

struct proto_opsinet_stream_ops = {

.sendmsg =      inet_sendmsg

}

struct proto udp_prot ={

.name =         "UDP",

.sendmsg =      udp_sendmsg,

}

网络收包简单总结:

首先网卡驱动申请一个著名的数据结构sk_buffer,根据数据包中的网络类型 type = skb->protocol(L3层 ipv4 or ipv6 ..) ,去调用提前注册在内核中的ipv4oripv6 ..协议处理函数,比如调用ip_rcv(),然后进一步解包,比如根据目的MAC地址和目的IP地址确定是否转发包,然后从包中解出是TCP or UDP,同样调用内核中注册好的回调函数处理,然后根据网络包的信息(hash一下,怎么hash看源码:) )对接上收包之前sys_recvfrom()建立的sock,最后进一步唤醒等待收包的进程。

网络发包简单总结:

发包相对容易理解一些,比如首先调用sys_sendto(),比如在L4层确定TCP or UDP,同样调用L4层注册好的函数,L3层根据路由表子系统确定IP地址,L2层根据邻居子系统确定MAC地址,然后传给网卡驱动发包。

当然,网络子系统非常复杂,不过这些对了解网络流程,对排查网络故障会起很大的作用。

文章只是一个引子,更深的学习,一定要深入代码细节,等到代码都看明白的时候,你将进入另一重世界。不说了,我去修炼了。

觉得文章有帮助,可以打赏支持一下 :)

linux 查看进程 发包,Linux网络发包流程相关推荐

  1. linux 查看进程变量,Linux下查看进程(程序)启动时的环境变量

    Linux下查看进程(程序)启动时的环境变量 Linux的pargs ==================================== 今天又遇到一个老问题: 同事遇到了sqlplus &qu ...

  2. linux 查看进程阻塞,linux进程 阻塞和非阻塞操作

    在我们看全功能的 read 和 write 方法的实现之前, 我们触及的最后一点是决定何时使 进程睡眠. 有时实现正确的 unix 语义要求一个操作不阻塞, 即便它不能完全地进行下去. 有时还有调用进 ...

  3. linux 查看进程cwd,linux shell 脚本查找进程cwd 求解

    root@center1:~/douyin/DYSECOO# ps -ef|grep msg_test root 30228 29891 2 14:02 pts/4 00:00:40 python3 ...

  4. Linux查看进程线程个数

    1.根据进程号进行查询: # pstree -p 进程号 # top -Hp 进程号 2.根据进程名字进行查询: # pstree -p `ps -e | grep server | awk '{pr ...

  5. Linux 查看进程的几个命令

    查看进程状态的基础指令,有以下几个常用参数: ps 查看当前终端下的命令 top 查看所有的进程(是动态的) 本文重点介绍通过ps命令查看进程 一:一些常用的参数组合及解析 1. 查看包含其他使用者的 ...

  6. linux查看磁盘IO,网络IO 总结

    linux查看磁盘IO,网络 IO可用的命令 1. top    监控整体服务器,cpu,内存,磁盘,网络等 2. dstat -d 查看当前磁盘每秒的读取,写入量,单位K 3. dstat -r 查 ...

  7. linux上根据运行程序的进程号,查看程序所在的绝对路径。linux查看进程启动的时间

    1 linux上根据运行程序的进程号,查看程序所在的绝对路径 1.如下,我想查看python 25_run_train_tripletloss_sknet_8w_offline_c_plus.py 这 ...

  8. Linux查看进程和进程管理

    Linux查看进程和进程管理) 查看指定的进程 查看指定的进程 可以通过使用grep索引关键字(关键字会以特定的颜色标识出来),查看指定的进程. 一般列取所有的进程比较多,不易查看,通过grep索引的 ...

  9. 【Linux 内核】进程管理 ( 进程特殊形式 | 内核线程 | 用户线程 | C 标准库与 Linux 内核中进程相关概念 | Linux 查看进程命令及输出字段解析 )

    文章目录 一.进程特殊形式 ( 内核线程 | 用户线程 ) 二.C 标准库与 Linux 内核中进程相关概念 三.Linux 查看进程命令及输出字段解析 一.进程特殊形式 ( 内核线程 | 用户线程 ...

  10. linux查看进程号和进程

    linux查看进程号和进程 ps -p  aaa           查看aaa进程的进程号 ps  -C  1234          查看进程号为1234的进程 ps   -A           ...

最新文章

  1. mysql cpu 内存占用_MySQL占用内存与CPU过高测试与解决办法
  2. android 多屏幕 设计翻译,android Supporting multiple screen翻译一
  3. linux下通过rsync+inotify 实现数据实时备份(远程容灾备份系统)
  4. .net持续集成cake篇之cake介绍及简单示例
  5. leetcode612. 平面上的最近距离(SQL)
  6. html5 判断分享,好程序员HTML5大前端分享之函数篇
  7. 新年UI的拆红包源码/5级代理功能/会员中心充值接口完善
  8. 拳王虚拟项目公社:闲鱼卖资源还可以卖吗?闲鱼怎么卖虚拟资源?卖什么资源赚钱?闲鱼卖虚拟资源如何赚到钱?
  9. ant编辑java忽略注释_java – 注释不起作用
  10. 环境配置之:pip 一步到位解决 pytorch-gpu 安装
  11. 干货:大米云LAMP使用说明
  12. 某知名网络安全公司的渗透测试工程师面试题实战汇总
  13. 基于微信小程序的人脸分析学生课堂状态监测系统 文档+项目源码
  14. 分享下我 Github 被封的经历
  15. android 免root 模拟器,真正免root的root工具箱详细使用教程
  16. mysql 1449 问题
  17. 【面试-八股文】万字app测试 面试题,助你吊打面试官系列
  18. 【Python】数据存储
  19. 利用计算机可以干什么,打开电脑不知道干什么 多个领域运用广【图解】
  20. Java+spring 基于ssm的美食网站设计与实现#毕业设计

热门文章

  1. 解决复制粘贴出现的错误
  2. 智邦国际erp软件31.86版本最新功能分享
  3. 单片机上的8位数码管同时显示数字“12345678“
  4. android byte[] 清空,android byte的使用
  5. lyapunov函数 matlab,科学网-[转载]Matlab的Lyapunov、Sylvester和Riccati方程的Matlab求解-吴雄君的博文...
  6. 移动端拍照上传到服务器
  7. Windows10中如何使用ADSL固定IP地址连接因特网
  8. 北航微信打卡自动提醒程序
  9. c++ eos智能合约开发_EOS智能合约开发点滴记录-第二篇智能合约编写
  10. 根据hash值找到bt种子的磁力下载链…