自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

one_clouder的专栏

漫步云中,关注云网络领域

  • 博客(92)
  • 收藏
  • 关注

原创 【容器网络】MACVLAN容器网络方案

macvlan容器网络方案macvlan是Linux自带的虚拟网卡,基于同一个底层网卡的macvlan设备会形成一个逻辑的交换机,提供交换能力,性能优化linux bridge。macvlan方案macvlan数据面如下:同节点容器通信容器A访问容器B,数据面流程如下:容器A和容器B在相同网络,直接发送容器A向容器B发送ARP请求macvlan交换机flood ARP请求容...

2019-12-12 17:23:03 1222

原创 【传统网络】以太网发包原理

以太网以太网(Ethernet)是一种计算机局域网技术,是目前应用最普遍的局域网技术,取代了其他局域网标准如令牌环、FDDI和ARCNET。以太网拓扑以太网的标准拓扑结构为总线型拓扑,当今快速以太网使用交换机来进行网络连接和组织,以太网的拓扑结构变成了星型,但在逻辑上,以太网仍然使用总线型拓扑和CSMA/CD的总线技术。总线型拓扑特点同一时刻仅能有一个设备占用总线,即一个节点发送报文...

2019-12-12 17:10:40 1429

原创 【容器网络】Flannel容器网络方案

Flannel容器网络方案Flannel共有三个容器网络方案:Flannel UDP、Flannel VXLAN旧和Flannel VXLAN新。Flannel UDP方案Flannel UDP数据面如下:同节点容器通信容器A访问容器B,数据面流程如下:容器A和容器B在相同网络,直接发送容器A向容器B发送ARP请求,br0交换机flood该ARP请求容器B接收到ARP请求,并响...

2019-12-12 15:12:42 877

原创 【容器网络】Calico容器网络方案

Calico容器网络方案Calico共有两个容器网络方案:Calico BGP和Calico IPIP。Calico BGP方案Calico BGP数据面如下:同节点容器通信容器A访问容器B,数据面流程如下:容器A内的calic0设备的掩码长度为32,即与容器B属于不同网络,需要通过网关进行通信容器A查找路由表,存在default路由,下一跳为169.254.1.1,且169.2...

2019-12-09 12:50:30 1056

原创 【Linux4.1.12源码分析】virtio_net之NAPI机制

在虚拟化场景,中断的开销更大,所以要尽可能的少用中断,我们从中断处理函数开始看。skb_recv_done函数static void skb_recv_done(struct virtqueue *rvq){ struct virtnet_info *vi = rvq->vdev->priv; struct receive_queue *rq = &vi->rq[vq2rxq(r

2016-11-24 23:06:45 2000 1

原创 【Linux4.1.12源码分析】virtio_net之中断注册

virtio_net作为虚拟网卡驱动,最主要的就是实现网路报文收发,对比物理网卡,当收到网络报文时会产生中断,由中断处理函数接收网络报文,这一点可以类比到virtio_net。实际上,virtio_net设备的中断注册是在驱动的probe函数中完成的。virtnet_probe函数static int virtnet_probe(struct virtio_device *vdev)

2016-11-22 22:28:39 3152

原创 【Linux4.1.12源码分析】收包软中断和NAPI

不讲概念,直接上收包软中断处理代码。 net_rx_action函数static void net_rx_action(struct softirq_action *h){ struct softnet_data *sd = this_cpu_ptr(&softnet_data); unsigned long time_limit = jiffies + 2; //定义了处理s

2016-11-19 07:28:35 2455

原创 【Linux4.1.12源码分析】VXLAN之remcsum实现分析

根据之前VXLAN之csum和remcsum实现分析(发包)的分析,由csum配置决定发送端是否计算UDP层的csum。 remcsum会在vxlan头中保存相关信息,然后在接收端进行处理,先看发送端如何构造vxlan头信息。vxlan_xmit_skb函数(片段,发送方向) if (type & SKB_GSO_TUNNEL_REMCSUM) { //配置remcsum场景

2016-11-17 22:44:01 1522

原创 【Linux4.1.12源码分析】UDP层csum计算

我们以发包和收包两个方向,分析UDP层的csum计算,发包方向,以vxlan封包流程中的UDP头封装作为例子来进行分析。udp_set_csum函数(封装UDP头时调用)void udp_set_csum(bool nocheck, struct sk_buff *skb, __be32 saddr, __be32 daddr, int len){ struct udphd

2016-11-15 23:09:24 2855

原创 【Linux4.1.12源码分析】VXLAN之csum和remcsum实现分析(发包)

vxlan报文的csum处理逻辑由VXLAN_F_UDP_CSUM、VXLAN_F_REMCSUM_TX、VXLAN_F_REMCSUM_RX、VXLAN_F_REMCSUM_NOPARTIAL等等标记决定,本篇从发包流程来看实现逻辑:vxlan_xmit_skb函数,还包括iptunnel_handle_offloads函数,实现功能如下图:总结下:1)如果报文是gso报文,

2016-11-12 22:54:41 2412

原创 【OVS2.5.0源码分析】vxlan端口创建流程分析

vxlan端口是通过ovs-vsctl命令创建的,整个调用流程如下:bridge_reconfigure->bridge_add_ports->bridge_add_ports__->iface_create->iface_do_create->ofproto_port_add->port_add(ofproto_class)->dpif_port_add->dpif_netlink_port

2016-11-12 10:58:03 2643 1

原创 【Linux4.1.12源码分析】VXLAN报文内核协议栈处理

4.1.12内核已经支持vxlan报文的gro功能,意味着vxlan报文交给协议栈之前,已经被聚合过了,而在早期的内核中聚合逻辑是在encap_rcv函数之后实现的。之前分析的UDP报文处理中,可以知道如果udp_sock定义了encap_rcv函数,将会把报文交给该函数处理,而不是传统的保存到sock队列,唤醒进程收包。udp_sock定义的encap_rcv函数是在vxlan_sock

2016-11-11 23:27:31 5398 1

原创 【Linux4.1.12源码分析】协议栈gro收包之完整流程分析

前面几篇分析了不同协议层的gro实现,本篇分析报文提交协议栈的完整逻辑,其他逻辑例如csum等不深入分析。 本文分析重点是逻辑,功能执行主体可能是有不一致的。MAC层逻辑1、网卡设备不支持GRO,提交当前报文到协议栈;2、当前报文为GRO,提交报文到协议栈;3、当前报文已已聚合过(frag_list不为空),提交当前报文到协议栈;4、当前报文csum_bad置为1,提交当前报文

2016-11-06 12:09:44 1483

原创 【Linux4.1.12源码分析】协议栈gro收包之VXLAN处理

VXLAN gro处理不是通过定义常量实现的,而是通过动态注册的实现的,在UDP层处理时我们知道是注册到udp_offload_base全局变量中,我们先看下注册过程vxlan_socket_create函数/* Create new listen socket if needed */static struct vxlan_sock *vxlan_socket_create(str

2016-11-05 08:17:54 2716

原创 【Linux4.1.12源码分析】协议栈gro收包之TCP处理

TCP gro实现定义在tcpv4_offload对象static const struct net_offload tcpv4_offload = { .callbacks = { .gso_segment = tcp4_gso_segment, .gro_receive = tcp4_gro_receive, .gro_complete = tcp4_gro_complete

2016-11-04 22:56:40 2180

原创 【Linux4.1.12源码分析】协议栈gro收包之UDP处理

UDP offload为udpv4_offloadstatic const struct net_offload udpv4_offload = { .callbacks = { .gso_segment = udp4_ufo_fragment, .gro_receive = udp4_gro_receive, .gro_complete = udp4_gro_complete

2016-11-03 23:33:37 2229

原创 【Linux4.1.12源码分析】协议栈gro收包之IP层处理

IP层的offload定义是ip_packet_offloadstatic struct packet_offload ip_packet_offload __read_mostly = { .type = cpu_to_be16(ETH_P_IP), .callbacks = { .gso_segment = inet_gso_segment, .gro_receive = in

2016-11-02 23:22:03 1273

原创 【Linux4.1.12源码分析】协议栈gro收包之MAC层处理

网卡驱动接收到报文后,通过netif_receive_skb提交报文到协议栈处理,由于网络设备MTU一般都设置为1500,对于TCP报文如果收到报文后就提交给协议栈处理是非常低效的,一般是通过聚合后再提交给协议栈,可以极大的降低内核的开销。 内核提供了napi_gro_receive函数,通过该函数可以实现报文聚合后再提交给协议栈。1、napi_gro_receive函数gro_resul

2016-11-01 22:58:37 2033

原创 【Linux4.1.12源码分析】IP层csum计算

从收包和发包来看IP层的csum是如何计算的,是如何进行校验的。csum值为2个字节长度。发包流程如下所示,在__ip_local_out_sk函数中调用ip_send_check函数进行csum计算。ip_local_out->ip_local_out_sk->__ip_local_out->__ip_local_out_skip_send_check函数/* Gener

2016-10-31 23:30:14 2679

原创 【Linux4.1.12源码分析】协议栈报文接收之传输层处理分析(UDP)

UDP报文的处理入口是udp_rcv函数,该函数是在ip_local_deliver_finish函数中被调用的。1、udp_rcv函数int udp_rcv(struct sk_buff *skb){ return __udp4_lib_rcv(skb, &udp_table, IPPROTO_UDP);}2、__udp4_lib_rcv函数int __udp4_lib_rcv

2016-10-30 23:47:58 3065

原创 【Linux4.1.12源码分析】AF_INET raw socket实现原理分析

在分析AF_PACKET raw socket实现时,我们从创建socket入手来分析, 本篇我们从收包流程入手来分析。在分析协议栈报文接收IP层分析时,我们知道IP层把报文交给raw sock的如后函数是raw_local_deliver。我们从这个函数来看看是如何把一个报文提交给raw socket的。1、raw_local_deliver函数int raw_local_deliver

2016-10-26 22:19:26 2150 6

原创 【Linux4.1.12源码分析】协议栈报文接收之IP层处理分析(ip_forward)

上一篇分析报文接收,IP层提交本地处理的流程,本篇分析报文转发场景的处理过程,在ip_rcv_finish函数中,会根据IP地址决定是提交给本机处理,还是报文转发,报文转发的入口函数为ip_forward,本篇将从ip_forward函数入手分析转发过程。1、ip_forward函数int ip_forward(struct sk_buff *skb){ u32 mtu; struc

2016-10-26 19:25:16 2541 2

原创 【Linux4.1.12源码分析】协议栈报文接收之IP层处理分析(ip_local_deliver)

报文提交给内核协议栈处理后,最终会调用到__netif_receive_skb_core函数,如果报文没有被rx_handler消费掉,最终会交给ptype_base中注册的协议处理,包括内核注册的协议,也包括raw socket等创建的协议处理。本文将分析普通ipv4报文的处理过程,处理入口函数为ip_rcv函数。1、ip_rcv函数int ip_rcv(struct sk_buff *

2016-10-24 22:34:29 1894

原创 【Linux4.1.12源码分析】邻居子系统实现分析

邻居子系统实现了IP层发包不感知MAC,即由邻居子系统实现了MAC头封装。MAC头信息包括:源MAC、目的MAC、协议类型,其中协议类型由上层指定,例如IPV4等等,源MAC地址是出口设备MAC地址(在路由表中确定出口设备),目的MAC是由邻居子系统提供的,大致可以猜到,邻居子系统会主动发起arp请求获取到mac地址,实现MAC封包。IP层发包最后会调用ip_finish_output2函数,我们

2016-10-22 08:37:05 3630

原创 【Linux4.1.12源码分析】AF_PACKET raw socket实现原理分析

raw socket按照检测到的报文主要可以分两类:mac报文、IP报文、传输层报文。本文分析二层报文,例如:socket(AF_PACKET, SOCK_RAW, ETH_P_ALL)方式创建的socket,可以检测到所有的二层报文。raw socket实现的核心在于,socket的建立,并注册到相应的数据中,实现在收包阶段把报文提交给socket处理,例如ptype_all、ptype_bas

2016-10-21 21:16:26 4402

原创 【Linux4.1.12源码分析】协议栈报文接收之netif_receive_skb函数分析

netif_receive_skb函数是协议栈报文接收的入口,一般由驱动调用,把报文送入协议栈,4.1.12内核做了对sk的封装,目的是什么没还未搞清楚。1、netif_receive_skb函数static inline int netif_receive_skb(struct sk_buff *skb){ return netif_receive_skb_sk(skb->sk, s

2016-10-20 22:47:51 10580

原创 【Linux4.1.12源码分析】二层报文发送之net_tx_action

net_tx_action函数报文发送软中断处理函数,本篇不分析软中断注册过程,只分析该函数的处理过程。 产生发包软中断最常见的场景是:1)报文发送PPS很高;2)网络qos限制。1、net_tx_action函数static void net_tx_action(struct softirq_action *h){ struct softnet_data *sd = this_cpu

2016-10-15 10:20:53 2961

原创 【Linux4.1.12源码分析】二层报文发送之报文GSO分段(skb_segment)

skg_segment是实现封装报文GSO分段的基础,直接抛代码。/** * skb_segment - Perform protocol segmentation on skb. * @head_skb: buffer to segment * @features: features for the output path (see dev->features) * * This

2016-10-14 22:18:03 2472

原创 【Linux4.1.12源码分析】二层报文发送之报文GSO分段(TCP)

TCP报文GSO分段的入口函数是tcp4_gso_segment,在tcpv4_offload对象中定义。1、tcp4_gso_segment函数static struct sk_buff *tcp4_gso_segment(struct sk_buff *skb, netdev_features_t features){ if (!pskb_may_pull(skb, si

2016-10-14 21:12:09 1565

原创 【Linux4.1.12源码分析】二层报文发送之报文GSO分段(UDP)

UDP报文GSO分段的入口函数是udp4_ufo_fragment,由udpv4_offload常量中定义。1、udp4_ufo_fragment函数static struct sk_buff *udp4_ufo_fragment(struct sk_buff *skb, netdev_features_t features){ struct sk_buff *segs =

2016-10-14 20:30:13 2630

原创 【Linux4.1.12源码分析】二层报文发送之报文GSO分段(IP层)

IP层的GSO/GRO定义在ip_packet_offload结构体中。static struct packet_offload ip_packet_offload __read_mostly = { .type = cpu_to_be16(ETH_P_IP), .callbacks = { .gso_segment = inet_gso_segment, //gso分段函数

2016-10-09 22:48:18 1752

原创 【Linux4.1.12源码分析】二层报文发送之报文GSO分段(MAC层)

报文GSO分段的入口函数是skb_gso_segment函数,是在validate_xmit_skb函数中被调用。1、skb_gso_segment函数static inlinestruct sk_buff *skb_gso_segment(struct sk_buff *skb, netdev_features_t features){ return __skb_gso_segme

2016-10-09 22:03:14 2182

原创 【Linux4.1.12源码分析】二层报文发送之GSO条件判断

4.1.12内核中,GSO报文的判断和分段的入口函数是validate_xmit_skb,其中使用netif_needs_gso用来判断软件是否要进行GSO分段,skb_gso_segment实现报文的GSO分段,本篇重点讲述GSO分段的判断条件,即netif_needs_gso相关函数。1、netif_needs_gso函数static inline bool netif_needs_g

2016-09-29 23:45:30 2812

原创 【Linux4.1.12源码分析】二层报文发送之qdisc实现分析

二层发送中,实现qdisc的主要函数是__dev_xmit_skb和net_tx_action,本篇将分析qdisc实现的原理,但是不涉及qdisc内部的算法,仅对框架进行分析。1、__dev_xmit_skb函数static inline int __dev_xmit_skb(struct sk_buff *skb, struct Qdisc *q, struct net_de

2016-09-27 22:39:51 4434

原创 【Linux4.1.12源码分析】二层报文发送之dev_queue_xmit

报文到此阶段,已经完成了MAC头封装,在调用驱动发送报文前还有一些工作要做:1)流量控制; 2)报文GSO分段;3)check sum计算;1、dev_queue_xmit函数static inline int dev_queue_xmit(struct sk_buff *skb){ return dev_queue_xmit_sk(skb->sk, skb);}2、dev_queu

2016-09-27 22:07:13 3252

原创 【Linux4.1.12源码分析】IP层报文发送之ip_output

上一篇提到ip_local_out函数最终会调用ip_output完成报文发送,本篇分析ip_output的处理过程。1、ip_output函数int ip_output(struct sock *sk, struct sk_buff *skb){ struct net_device *dev = skb_dst(skb)->dev; IP_UPD_PO_STATS(d

2016-09-26 22:01:46 3575

原创 【Linux4.1.12源码分析】IP层报文发送之ip_local_out

IP层本地报文发送有两个函数ip_local_out和ip_local_out_sk,实际实现两者是等同的,因为本地发送的报文,skb必然关联着一个sock对象。1、ip_local_out函数static inline int ip_local_out(struct sk_buff *skb){ return ip_local_out_sk(skb->sk, skb); //本地报文

2016-09-25 23:23:20 3325 1

原创 【Linux4.1.12源码分析】vxlan报文发送之iptunnel_xmit

iptunnel_xmit函数是发送vxlan报文时,封装UDP报文头之后被调用的,主要作用是封装IP头,并调用三层发包函数,完成报文的发送,该函数相对比较简单。1、iptunnel_xmit函数int iptunnel_xmit(struct sock *sk, struct rtable *rt, struct sk_buff *skb, __be32 src, __be32

2016-09-25 23:07:25 2104

原创 【Linux4.1.12源码分析】vxlan报文发送之udp_tunnel_xmit_skb

udp_tunnel_xmit_skb函数是OVS2.5发送UDP报文的内核入口,在调用该函数之前,headroom空间需要准备完成,且vxlan头已经创建,skb结构体的data指向vxlan头的首地址。1、udp_tunnel_xmit_skb函数int udp_tunnel_xmit_skb(struct rtable *rt, struct sock *sk, struct sk_

2016-09-25 18:28:47 1864

原创 【OVS2.5.0源码分析】vxlan发包流程分析

发包处理函数最终会调用到ovs_vport_send函数,该函数最终会调用vport_ops的send函数。1、ovs_vport_send函数void ovs_vport_send(struct vport *vport, struct sk_buff *skb){ int mtu = vport->dev->mtu; if (unlikely(packet_length(skb

2016-09-21 22:27:27 6425 2

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除