网络层协议栈
2020-06-01 17:08:42 0 举报
linux内核网络层协议栈
作者其他创作
大纲/内容
将邻居表项设置为不可达状态
ip_finish_output2
通过路由子系统选择skb->dst
ip_queue_xmit
NF_INET_LOCAL_OUT
NUD_INCOMPLETE
延迟超时
通过sock路由缓存查看是否需要对报文进行早期分流
ip6_output
刚创建时的无状态标识
neigh_lookup查找或创建邻居表项
填充icmp报文内容
NUD_STATE状态下发送的报文已经发出,需得到邻居的可达性确认的状态
skb_dst_set设置skb路由信息
__netif_receive_skb_core
发送邻居解析请求但还未收到回复的过渡状态
arp_send_dst
dst_output
icmp_push_reply如果处理函数有发送报文的需要则进行发送
UDP报文发送
ip6_input_finish送往本地时进行处理
NF_INET_POST_ROUTING
ndisc_recv_ns处理ns报文
ip_finish_output_gso
判断skb的源ip是否为0
ip6_input送往本地时进行处理
将报文丢弃并发送对应的icmp错误处理报文
NF_INET_PRE_ROUTING
l3mdev_ip6_out尝试向使用三层设备发送
链路层协议栈
ndisc_send_na
ip_send_skb
dev_queue_xmit
arp_ignore 判断需要发送arp replay
从输入的请求报文中解析到三层地址
ip_rcv_finish_core
通过dst_entry判断是否为隧道设备
通过路由子系统查找路由表
inet6_csk_route_socket通过sock缓存或路由子系统选择skb->dst
重试失败,接收回应超时
如果大于发送接口的mtu直接进行丢弃
是
arp_process
ICMP协议栈
INDIRECT_CALL_2处理注册的ipv6扩展头部
等待得到邻居的可达性确认的过渡状态
传输层协议栈
icmpv4_xrlim_allow限制发送速度
ipv6_rcv
ip_local_out
skb_checksum_simple_validate对报文校验和进行检查
ip6_sk_dst_lookup_flow通过路由子系统选择skb->dst
ip_rcv_finish
ip_fragment
NUD_REACHABLE
邻居子系统查找arp表项
单播报文
neigh->output
删除邻居表项
发送邻居解析请求
icmp_rcv
否
ip6_send_skb
arp_is_garp判断是否为无目的arp replay
超时重试
ip_push_pending_frames构造skb数据包并将其发送到网络层
dst_input调用在路由子系统选择的处理函数skb_dst(skb)->input(skb);
将所有片段重组后在上传给上层协议
NF_INET_LOCAL_IN
等待得到邻居的可达性确认的状态
网络层协议栈
NUD_PERMANENT
icmpv6_rcv
l3mdev_ip6_rcv尝试使用三层设备来处理ipv6报文
neigh_hh_output
neigh_direact_output在不支持地址解析协议时直接进行发送
NUD_PROBE
对组播报文进行处理
udp等无面向连接与流量控制协议
如果在本地邻居表中有表象项将其删除
创建邻居表项
ARP
ip_append_data把报文添加到sock发送队列同时进行分帧的操作
__icmp_send
xfrm4_policy_check对报文进行安全策略检查
ndisc_update更新邻接主机状态
邻居系统状态机通过constructor以及当前状态来选择neigh->output指定的回调函数
根据icmph.icmp6_type来查找对应的处理函数
需要
NF_INET_FORWARD
没有
NUD_STAEL
ip_defrag
邻居子系统
表项闲置时间超过REACHABLE_TIME
ip_rcv_core对skb进行ip协议相关的校验和初始化
NUD_NONE
NUD_FAILED
有
通过sock路由缓存查看是否需要对报文进行早期分流
组播报文
ip6_xmit
inet6_csk_xmit
查看是否有二层缓存hh_catch
IPv6网络层协议栈
ip6_forward需要转发时进行处理
ip6_mc_input对组播报文进行处理
ipv6_parse_hopopts对逐跳扩展报文头进行处理
ip_output
接收到邻居可达性的回应报文
NDISC
ip6_forward_finish
arp_create构造一个arp报文
IPv4协议栈
查看网卡驱动是否支持硬件分帧(gso)
通过邻居子系统查找出接口以及链路信息
IPv6协议栈
不需要邻居解析协议来创建L2~L3层映射
判断当前状态
NF_ARP_OUT
查看是否需要代理转发
l3mdev_ip_out尝试使用三层设备来处理
neigh_resolev_output慢速发送,会使用地址解析协议对二层地址进行解析
ndisc_opt_addr_space填充ndisc opt字段
ip6_fragment
垃圾回收
ip_local_deliver_finish通过IP层的传输协议字段提交给上层协议处理
调用注册的icmp handler进行处理
l3mdev_ip_rcv尝试使用三层设备来处理
IP网络层协议栈
ip_local_deliver
NUD_NOARP
邻居可达,并且表项已存入缓存
源地址是否为任意地址
ip_forward
arp_xmit_finish
pneigh_lookup查找代理邻居表
在创建时arp_constructor来根据表项状态选择neigh->output
icmp_route_lookup查找发送路由
表项被使用
ip_rcv
arp_xmit
__neigh_lookup进行查找
ip6_rcv_core对ipv6报文进行完整性检查
iptunnel_metadata_reply设置skb dst的input和output回调函数
ip_options_build添加ipoption选项
ip6_protocol_deliver_rcu处理扩展头部以及选择四层协议处理函数进行处理
判断是否需要代理发送
ip6_finish_output2
不需要
neigh_update更新邻居表项
arp_constructor来根据表项状态选择neigh->output
__ip6_local_out
ndisc_parse_options解析nd选项
ndisc_send_skb根据生成的dst_entry来设置skb的dst
可以进行早期分流
__neigh_lookup添加包括无目的arp replay的邻居表项
ndisc_recv_na处理na报文
查看是否需要分帧
ARP为replay时
icmp_pointers[icmph->type].handler(skb)针对于icmph->type字段选择不同的处理函数进行处理
用户通过命令配置的静态邻居表项
查看报文是否有逐跳扩展报文头
IN_DEV_FORWARD 需要进行代理转发
判断是否需要分帧
pneigh_enqueue添加到代理邻居表项
arp_rcv对arp报文进行检验以及安全性检查
ip_forward_finish
ip6_rcv_finish
检查报文mtu以及分段信息和校验和是否合法
neigh_event_ns先通过__neigh_lookup来查找,如果没有则则通过neigh_create来创建一个邻居表项
RTN_LOCAL 发往本地
表项闲置时间超过gc_staletime
arp_filter 当有多网卡时进行端口判断
ip6_finish_output
ndisc_rcv
判断有没有需要处理的扩展头部
ip_local_deliver_finish
ARP为request时
tcp等有面向连接以及流量控制的协议
NF_ARP_IN
ip_is_fragment判断报文是否分段
ip_finish_output
neigh_connected_output快速发送。在确定地址可达时使用
ip_rcv_options处理ip的option字段
icmp_push_reply
TCP报文发送
NUD_DELAY
0 条评论
回复 删除
下一页