关于linux网络包的收发流程,网上随便一搜都可以搜一桶,但自己不动手永远都搞不原理。最近在家比较闲,对网络这一块也不太了解,小编习惯熟悉内核子系统原理从低版本内核开始.

Linux(2.6.11.12)网络收包流程图:

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网络收包流程一文,没想到很多人感兴趣,现上货网络发包流程。

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地址,然后传给网卡驱动发包。

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

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

Linux网络收发包流程相关推荐

  1. Linux 网络层收发包流程及 Netfilter 框架浅析

    本文作者:sivenzhang,腾讯 IEG 测试开发工程师 1. 前言 本文主要对 Linux 系统内核协议栈中网络层接收,发送以及转发数据包的流程进行简要介绍,同时对 Netfilter 数据包过 ...

  2. Linux网络层收发包流程及Netfilter框架浅析

    1. 前言 本文主要对 Linux 系统内核协议栈中网络层接收,发送以及转发数据包的流程进行简要介绍,同时对 Netfilter 数据包过滤框架的基本原理以及使用方式进行简单阐述. 内容如有理解错误而 ...

  3. 阿里云服务器网络收发包PPS性能25万/80万/100万PPS详解

    阿里云服务器ECS网络收发包PPS是什么?云服务器PPS多少合适?网络收发包PPS是指云服务器每秒可以处理的网络数据包数量,单位是PPS即packets per second每秒发包数量.阿里云百科来 ...

  4. 阿里云服务器网络收发包PPS多少合适?

    什么是网络收发包PPS?云服务器网络收发包PPS多少合适?网络收发包PPS是指云服务器每秒可以处理的网络数据包数量,单位是PPS即packets per second每秒发包数量.云服务器吧来详细说下 ...

  5. 关于腾讯云服务器网络收发包PPS一看就懂明了

    阿里云服务器网络收发包是指云服务器内网每秒发包数量,网络收发包是衡量云服务器网络性能的指标,单位是PPS,数值越大网络性能越好,腾讯云百科分享腾讯云服务器网络收发包PPS详解: 腾讯云服务器网络收发包 ...

  6. linux 内核vxlan收发包流程

    1.vxlan口收包处理流程 前面几章详细介绍了vxlan接口的使用,而且已经知道vxlan是 MAC IN UDP中的封装,因此,在解封装之前,一切按照原有流程走,在此复习一下内核收发包流程(驱动层 ...

  7. ixgbe网卡驱动 Ⅳ----收发包流程详解

    目录 1 网卡队列收包流程概述 2 ixgbe_ring 结构 3 ixgbe 驱动收包流程 3.1 硬件中断入口 ixgbe_msix_clean_rings/ixgbe_intr 3.2 软中断入 ...

  8. Linux: 网络数据收发流程简析

    文章目录 1. 前言 2. 背景 3. 网卡数据收发流程 3.1 网络数据接收流程 3.1.1 网卡数据接收流程 3.1.2 网卡数据向上传递给L3,L4的流程 3.2 网卡数据发送流程 1. 前言 ...

  9. linux网络数据发送流程

    网络套接字如何将数据发生出去的呢?这个需要从网络协议初始化开始分析. 网络协议初始化: 所在文件net/ipv4/af_inet.c static int __init inet_init(void) ...

  10. linux网络数据包流程

    一.介绍 对于调试linux网卡驱动或者wifi驱动性能,或者排查网络数据丢包的时候,需要对内核处理包要与基本的了解,从而排查出丢包出现在哪个环节,这里给出大致流程和常用排查方法 二.基本框架 1.硬 ...

最新文章

  1. Nested Mappings
  2. Microbiome: 绝对定量环境样本细菌、真菌、真核群落丰度
  3. Linux多线程——使用信号量同步线程
  4. 【Elasticsearch】es fielddata 字段数据
  5. AcWing 898. 数字三角形
  6. Linux top 使用技巧
  7. 小程序判断ios还是android
  8. excel表格损坏如何修复?
  9. linux环境下hadoop版本的升级、更换
  10. ASP.NET会话(Session) 转载自:寒羽枫(cityhunter172)
  11. 【FPGA】VGA驱动:行同步时序+场同步时序
  12. 你知道微服务如何拆分,能解决哪些问题?
  13. 以后再有人问你selenium是什么,你就把这篇文章给他
  14. 操作系统的概念、功能和目标(操作系统1)
  15. 2020计算机二级office知识点,2020年计算机二级Word常考点汇总
  16. 抖音国际版Tik Tok进入IPFS存储网络 Filecon生态进一步扩大
  17. Linux环境 网络流量统计/proc/net/dev和/proc/net/snmp
  18. 转载:十年驾车经验总结:活着,才是硬道理
  19. 百度人脸识别组件与mmkv冲突问题解决方案
  20. 基于C语言Win32API窗口实现的物流配送信息管理系统

热门文章

  1. mvc基于 ajax实现菜单下拉列表
  2. 新浪网产品设计指南(含UI规范)
  3. PowerMock进行mock测试
  4. 使用PyInstaller将Python程序打包成一个单独的exe文件
  5. rabbitmq消费者设置手动ack
  6. 灭屏取消过温减流功能
  7. PHP学习笔记1:基础知识快速浏览
  8. LAMP环境安装1之freetype
  9. redis 介绍与安装
  10. kafka中zookeeper的作用