Linux网络发包流程

2021年11月20日 阅读数:3
这篇文章主要向大家介绍Linux网络发包流程,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

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

sys_write()网络

       file->f_op->write()(sock_writev)(注0)数据结构

          sock_writev()socket

            sock_sendmsg()函数

            sock->ops->sendmsg()学习

                        (inet_sendmsg)url

              structsock *sk = sock->sk;spa

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

                     udp_sendmsg()3d

                       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 ..) ,去调用提早注册在内核中的ipv4 or ipv6 ..协议处理函数,好比调用ip_rcv(),而后进一步解包,好比根据目的MAC地址和目的IP地址肯定是否转发包,而后从包中解出是TCP or UDP,一样调用内核中注册好的回调函数处理,而后根据网络包的信息(hash一下,怎么hash看源码:) )对接上收包以前sys_recvfrom()创建的sock,最后进一步唤醒等待收包的进程。

网络发包简单总结:

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

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

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

以为文章有帮助,能够打赏支持一下 :)

本文分享自微信公众号 - 相遇Linux(LinuxJeff)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

上一篇: halcon定位匹配圆
下一篇: pandas去除Nan值