Linux网络收发包流程 墨蓝 2023-07-17 06:50 5阅读 0赞 关于linux网络包的收发流程,网上随便一搜都可以搜一桶,但自己不动手永远都搞不原理。最近在家比较闲,对网络这一块也不太了解,小编习惯熟悉内核子系统原理从低版本内核开始. Linux(2.6.11.12)网络收包流程图: ![format_png][] device driver interrupt handler netif_rx() cpu_raise_softirq() do_softirq()net_rx_atcion() dev->poll(dev, &budget)( process_backlog)(注0) process_backlog() netif_receive_skb() skb_bond(skb); 如果网卡绑定,则取netdev 的master设备 pt_prev->func() (注1) type = skb->protocol(L3层 ipv4 or ipv6 ..) ip_rcv() NF_HOOK(PF_INET,NF_IP_PRE_ROUTING,skb, dev, NULL,ip_rcv_finish); ip_rcv_finish() dst_input() skb->dst->input();(注2) (ip_local_deliver或ip_forward) ip_local_deliver() NF_HOOK(PF_INET,NF_IP_LOCAL_IN, skb, skb->dev, NULL, ip_local_deliver_finish); ip_local_deliver_finish() ipprot->handler(skb); (L4层 udp_rcv/tcp_v4_rcv..) udp_rcv() udp_queue_rcv_skb() sock_queue_rcv_skb sk->sk_data_ready() (sock_def_readable) static void sock_def_readable(structsock *sk, int len) { read_lock(&sk->sk_callback_lock); if (sk->sk_sleep && waitqueue_active(sk->sk_sleep)) wake_up_interruptible(sk->sk_sleep); sk_wake_async(sk,1,POLL_IN); read_unlock(&sk->sk_callback_lock);} sys_recvfrom() sock_recvmsg() sock->ops->recvmsg()(sock_common_recvmsg) sock_common_recvmsg() sk->sk_prot->recvmsg()(udp_recvmsg) udp_recvmsg() skb_recv_datagram() wait_for_packet() static int wait_for_packet(structsock *sk, int *err, long *timeo_p){ … DEFINE_WAIT(wait); prepare_to_wait_exclusive(sk->sk_sleep,&wait,TASK_INTERRUPTIBLE);…}注0:net_dev_init(){ … queue->backlog_dev.poll = process_backlog; …}注1:void __init ip_init(void){ dev_add_pack(&ip_packet_type);}static struct packet_type ip_packet_type = { .type = __constant_htons(ETH_P_IP), .func = ip_rcv,};void __init ipv6_packet_init(void){ dev_add_pack(&ipv6_packet_type);} static struct packet_type ipv6_packet_type = { .type = __constant_htons(ETH_P_IPV6), .func = ipv6_rcv,}; void dev_add_pack(struct packet_type *pt){ … list_add_rcu(&pt->list, &ptype_base[hash]); …} 注2:ip_rcv_finish ip_route_input ip_route_input_slowip_route_input_slow(){ … rth->u.dst.input = ip_forward; … rth->u.dst.input= ip_local_deliver;} 前段时间写了[Linux网络收包流程][Linux]一文,没想到很多人感兴趣,现上货网络发包流程。 ![format_png 1][] 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 ..) ,去调用提前注册在内核中的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地址,然后传给网卡驱动发包。 当然,网络子系统非常复杂,不过这些对了解网络流程,对排查网络故障会起很大的作用。 文章只是一个引子,更深的学习,一定要深入代码细节,等到代码都看明白的时候,你将进入另一重世界。不说了,我去修炼了。 [format_png]: /images/20230528/4b993d1c897f4e7299236f50a6d02f9a.png [Linux]: http://mp.weixin.qq.com/s?__biz=MzA5ODI2NzMyMQ==&mid=2458810802&idx=1&sn=6878bee54bb8ff9c81a579bcc59d7126&chksm=87eee064b0996972f945606d5c31117e734b1c43cd65b6546249114d62d702c6f0b2be2e3ce0&scene=21#wechat_redirect [format_png 1]: /images/20230528/3067badd3ae547258431a9f88da7e70e.png
相关 Linux 网络层收发包流程及 Netfilter 框架浅析 1. 前言 本文主要对 Linux 系统内核协议栈中网络层接收,发送以及转发数据包的流程进行简要介绍,同时对 Netfilter 数据包过滤框架的基本原理以及使用方式进行简 朱雀/ 2023年07月17日 07:08/ 0 赞/ 177 阅读
相关 Linux网络收发包流程 关于linux网络包的收发流程,网上随便一搜都可以搜一桶,但自己不动手永远都搞不原理。最近在家比较闲,对网络这一块也不太了解,小编习惯熟悉内核子系统原理从低版本内核开始. 墨蓝/ 2023年07月17日 06:50/ 0 赞/ 6 阅读
相关 linux收发包内核进程名称,Linux内核IP Queue机制的分析(一)——用户态接收数据包... 序 笔者将会通过包括本文在内的三篇文章,对IP Queue机制从用户态的应用到内核态的模块程序设计进行分析。三篇文章的题目分别是: Linux内核IP Queue机制的分析 缺乏、安全感/ 2023年01月19日 15:57/ 0 赞/ 287 阅读
相关 盘点一款Python发包收包利器——scapy 点击上方“Python爬虫与数据挖掘”,进行关注 回复“书籍”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 潮平两岸阔,风正一帆悬。 大 待我称王封你为后i/ 2023年01月17日 14:57/ 0 赞/ 189 阅读
相关 Linux操作系统学习笔记(二十二)网络通信之发包 一. 简介 本文将分析网络协议栈发包的整个流程,根据顺序我们将依次介绍套接字文件系统、传输层、网络层、数据链路层、硬件设备层的相关发包处理流程,内容较多较复杂,主要掌 红太狼/ 2022年12月23日 06:14/ 0 赞/ 288 阅读
相关 DPDK收发包流程分析(一) 一、 前言】 DPDK是intel工程师开发的一款用来快速处理数据包的框架,最初的目的是为了证明传统网络数据包处理性能低不是intel处理器导致的,而是传统 男娘i/ 2022年11月01日 05:39/ 0 赞/ 363 阅读
相关 sendip linux发包工具 第一步:安装 sendip 工具 sudo apt-get update sudo apt-get install sendip man sen 妖狐艹你老母/ 2022年10月22日 11:57/ 0 赞/ 171 阅读
相关 深入理解网络编程,Linux 网络发包过程详细解析 linux服务器开发相关视频解析: [tcpip,accept,11个状态,细枝末节的秘密,还有哪些你不知道][tcpip_accept_11] [基于linux ep 淡淡的烟草味﹌/ 2022年10月10日 13:57/ 0 赞/ 110 阅读
相关 Linux socket发包过程 当调用socket的接口发送一个报文的时候,我们只需要填写其目的IP和端口就可以了。但下面三层的源IP地址,二层的源MAC地址,目的MAC地址以及VLAN是怎么确定的呢? 叁歲伎倆/ 2022年08月13日 17:42/ 0 赞/ 146 阅读
还没有评论,来说两句吧...