精华内容
下载资源
问答
  • 网络协议栈

    2019-11-04 20:01:17
  • VxWorks网络协议栈

    2020-10-21 18:11:09
    VxWorks网络协议栈atmintel_networklan_serversonettcp-ip_stackwireless
  • 文章目录目录前文列表用户态网络协议栈简述内核协议栈存在的问题总结参考文档 前文列表 《Linux 内核网络协议栈》 《DPDK 网络加速在 NFV 中的应用》 用户态网络协议栈简述 用户态网络协议栈的底层支撑技术称为「...

    目录

    内核协议栈存在的意义

    关于内核协议栈的功能与原理我们在《Linux 内核网络协议栈》一文中已有讨论,这里我们主要思考内核协议栈存在的意义。要回答这个问题,我希望从操作系统聊起。

    一个正在运行的程序会做一件非常简单的事情:执行指令。CPU 从内存中获取一条指令,对其进行解码、然后执行它应该做的事情,例如:相加算数、访问内存、检查条件、跳转到函数等等。

    实际上,有一类软件负责让这些程序的运行变得简单,运行程序间共享内存,让程序能够与设备交互,这类软件就是操作系统。现在被我们称之为 “操作系统” 的软件其实最早的称谓是 Supervisor,往后还被叫过一段时间的 Master Control Program(主控程序),但最终 Operating System 胜出了。它们负责确保系统即易于使用又能正确高效的运行,为此,操作系统实现了以下两点需求:

    1. 操作系统带来了硬件的独立性和容易使用的 API(系统调用),让上层应用程序的运行更加简单。
    2. 操作系统应用(CPU、内存)虚拟化技术添加了一个时间分享的层,让多个上层应用程序的运行更加简单。

    写到这里不仅感叹 Unix 操作系统与 C 语言的出现,以及贝尔实验室排除万难使用 C 语言重写了 Unix 的壮举。从此,上层应用程序与计算机硬件的世界被解耦,黑客文化与思潮得以诞生,正是这群软件世界的叛逆者捍卫了代码的自由,开源运动才得以启动。

    回到主题,从操作系统的启发,我们大概能够理解内核协议栈的意义,它是为了让种类多如繁星的网络协议能够在计算机上运行得更加简单。但世上本不存在所谓的 “万金油”,计算机的世界从来都是时间与空间的博弈。看似万能的内核协议栈,其实充满妥协 —— Linux 内核协议栈存在严重的 Scalable(可伸展性)问题。

    在这里插入图片描述

    NOTE

    • BPS(Bit Per Second):比特每秒,表示每秒钟传输多少位信息,即带宽。例如:常说的 1M 带宽的意思是 1Mbps(兆比特每秒)。
    • CPS(Connect Per Second):TCP 每秒新建连接数。
    • PPS(Packet Per Second):包转发率,即能够同时转发的数据包的数量,表示转发数据包能力的大小。

    从上图可以看见,内核协议栈的 CPS、PPS 以及 CPU 数量的关系远没有达到线性提升,甚至远没有用户态协议栈来的优秀。据经验,在C1(8 Core)上运行应用程序每 1W 包处理需要消耗 1% 软中断 CPU,这意味着单机的上限是 100W PPS。假设,要跑满 10GE 网卡,每个包 64 字节,就需要 2000W PPS(注:实际上以太网万兆网卡速度上限是 1488W PPS,因为最小数据帧的大小为 84B),100G 就是 2亿 PPS,即每个包的处理耗时不能超过 50 纳秒。而一次 Cache Miss,不管 Miss 的是 TLB、数据 Cache 还是指令 Cache,回内存读取都需要大约为 65 纳秒,而且在 NUMA 架构体系下的跨 Node 通讯大约还需要额外多加 40 纳秒。

    所以,内核协议栈一秒钟能处理的数据包是有限的。当达到上限的时候,所有的 CPU 都开始忙于接收数据包。在这种情形下,数据包要么被丢弃,要么会导致应用 CPU 匮乏( starve of CPU)。诚然,这并非内核协议栈所愿,但现实如此,受限于操作系统和硬件设备的实现细节,内核协议栈选择了向空间(满足大部分常规使用场景)“妥协”。

    对此,笔者曾在《DPDK 网络加速在 NFV 中的应用》一文中详细谈到 Linux 内核协议栈存在的问题,这里不再赘述,简单总结为几点:

    • 上下文切换开销大
    • 内存拷贝昂贵
    • Cache Miss 高
    • 中断处理频繁
    • 系统调用开销

    再回过头来看,我们可以明显的感受到网速一直在提升,网络技术的发展从 1GE/10GE/25GE/40GE/100GE 演变,这也为计算机网络 I/O 能力提出了挑战。如何跟上网速的发展?这是一个宽泛的命题,我们只看其中的一个方法 —— 用户态网络协议栈。

    用户态网络协议栈简述

    用户态网络协议栈,即在 Linux 用户态上实现的网络协议栈处理程序,底层支撑技术被称为内核旁路技术,又可细分为完全内核旁路及部分内核旁路。其思路大抵是绕过内核,直接将网络硬件设备交给运行在用户态的应用程序使用,常见的内核旁路技术实现有 PF_RING、Snabbswitch、Netmap 以及 DPDK。

    有了内核旁路技术,开发者得以编写自己的网络协议栈,让协议栈功能变得更加灵活,专注于某些高级特性,并且针对性能进行优化。可见,用户态网络协议栈最大的特点就是 “自定义”,针对特定的业务需求来实现数据流量转发控制以及性能提升。当然了,这也需要付出代价 —— 每一张网卡只能用于一个进程,此时的网卡不再具备 “常规意义上” 的网卡功能。例如:Linux 的 netstat、tcpdump 等工具可能会停止工作。

    对于部分内核旁路技术,内核仍然保留对网卡的拥有权,并且能让用户态应用程序只在一个单独的接收队列(Rx Queue)上执行旁路,典型的部分内核旁路技术实现有 Linux 社区开源的 Netmap,官方数据是 10G 网卡 1400W PPS,已经比较接近 1488W 的极限了,但是 Netmap 没又得到广泛使用。其原因有几个:

    • Netmap 需要网卡驱动的支持,即受制于网卡厂商。
    • Netmap 仍然依赖中断通知机制,没完全解决瓶颈。
    • Netmap 更像是几个系统调用,实现用户态直接收发包,功能太过原始,没形成依赖的网络开发框架,社区不完善。

    但鉴于目前还没有稳定的开源部分内核旁路技术方案,我们希望 Netmap 能抢占这个商机。毕竟现在常见的 DPDK 与 Intel 的关系实在过于紧密。

    用户态网络协议栈的应用场景

    • 软件定义的交换机或者路由器,例如 OvS、vRouter。该场景中希望将网卡交由应用程序来管理,以及处理原始的数据包并且完全绕开内核。
    • 专用的负载均衡器。类似的,如果该机器只用来做数据包的随机处理(Packet Shuffling),那绕过内核就是合理的。
    • 对于选定的高吞吐/低延迟的应用进行部分旁路。例如:DDoS 缓解系统中。
    • 在高频交易(High Frequency Trading)场景中使用,因为用户态协议可以很好的降低延迟。

    用户态网络协议栈面临的挑战

    • Linux 内核协议栈有很多重要的特性和优秀的调试能力。需要花费长期的时间才可能挑战这个丰富的生态系统。

    用户态协议栈如何解决这个问题?

    解决问题,首先要提出问题。这里的问题是:如何提高收包吞吐?

    以 DPDK 为例,笔者《DPDK 网络加速在 NFV 中的应用》一文中也有过阐述,这里不再赘述。

    netmap 高性能网络 I/O 框架

    Netmap 基于共享内存的思想,是一个高性能收发原始数据包的框架,由 Luigi Rizzo 等人开发完成,其包含了内核模块以及用户态库函数。其目标是,不修改现有操作系统软件以及不需要特殊硬件支持,实现用户态和网卡之间数据包的高性能传递。

    在这里插入图片描述

    在 Netmap 框架下,内核拥有数据包池,发送环\接收环上的数据包不需要动态申请,有数据到达网卡时,当有数据到达后,直接从数据包池中取出一个数据包,然后将数据放入此数据包中,再将数据包的描述符放入接收环中。内核中的数据包池,通过 mmap 技术映射到用户空间。用户态程序最终通过 netmap_if 获取接收发送环 netmap_ring,进行数据包的获取发送。

    参考文档

    https://www.cnblogs.com/huangfuyuan/p/9238437.html
    https://cloud.tencent.com/developer/article/1198333
    https://blog.csdn.net/dog250/article/details/80532754

    展开全文
  • 面对日益膨胀的网络,随着伴随的是多种协议的交叉使用,不知道大家对VxWorks网络协议栈是否有所了解。随着Internet的快速增长和WWW的流行,TCP/IP协议已经成为内部网和广域网的网络协议,随着更多的应用对协议能力的...
  • 网络协议栈超级汇总,网络协议栈超级汇总,网络协议栈超级汇总
  • 转 Linux内核网络协议栈笔记1协议栈分层/层次结构 大家都知道TCP/IP协议栈现在是世界上最流行的网络协议栈恐怕它的普及的最重要的原因就是其清晰的层次结构以及清晰定义的原语和接口不仅使得上层应用开发者可以无需...
  • 人工智能系统的海量数据处理需要很高的网络吞吐来支撑,网络协议栈作为上层人工智能应用和底层高速硬件网卡之间的桥梁,对整个系统的网络性能起到关键性作用。通过对主流网络协议栈兼容性进行详细对比分析,发现目前...
  • 应用层的各种网络应用程序基本上都是通过 Linux Socket 编程接口来和内核空间的网络协议栈通信的。Linux Socket 是从 BSD Socket 发展而来的,它是 Linux 操作系统的重要组成部分之一,它是网络应用程序的基础。从...

    1. Linux 网络路径

    1

    1.1 发送端

    1.1.1 应用层

    (1) Socket

    应用层的各种网络应用程序基本上都是通过 Linux Socket 编程接口来和内核空间的网络协议栈通信的。Linux Socket 是从 BSD Socket 发展而来的,它是 Linux 操作系统的重要组成部分之一,它是网络应用程序的基础。从层次上来说,它位于应用层,是操作系统为应用程序员提供的 API,通过它,应用程序可以访问传输层协议。

    • socket 位于传输层协议之上,屏蔽了不同网络协议之间的差异
    • socket 是网络编程的入口,它提供了大量的系统调用,构成了网络程序的主体
    • 在Linux系统中,socket 属于文件系统的一部分,网络通信可以被看作是对文件的读取,使得我们对网络的控制和对文件的控制一样方便。

    2

    3

     UDP socket 处理过程 (来源

     

     21

    TCP Socket 处理过程(来源

    (2) 应用层处理流程

    1. 网络应用调用Socket API socket (int family, int type, int protocol) 创建一个 socket,该调用最终会调用 Linux system call socket() ,并最终调用 Linux Kernel 的 sock_create() 方法。该方法返回被创建好了的那个 socket 的 file descriptor。对于每一个 userspace 网络应用创建的 socket,在内核中都有一个对应的 struct socket和 struct sock。其中,struct sock 有三个队列(queue),分别是 rx , tx 和 err,在 sock 结构被初始化的时候,这些缓冲队列也被初始化完成;在收据收发过程中,每个 queue 中保存要发送或者接受的每个 packet 对应的 Linux 网络栈 sk_buffer 数据结构的实例 skb。
    2. 对于 TCP socket 来说,应用调用 connect()API ,使得客户端和服务器端通过该 socket 建立一个虚拟连接。在此过程中,TCP 协议栈通过三次握手会建立 TCP 连接。默认地,该 API 会等到 TCP 握手完成连接建立后才返回。在建立连接的过程中的一个重要步骤是,确定双方使用的 Maxium Segemet Size (MSS)。因为 UDP 是面向无连接的协议,因此它是不需要该步骤的。
    3. 应用调用 Linux Socket 的 send 或者 write API 来发出一个 message 给接收端
    4. sock_sendmsg 被调用,它使用 socket descriptor 获取 sock struct,创建 message header 和 socket control message
    5. _sock_sendmsg 被调用,根据 socket 的协议类型,调用相应协议的发送函数。
      1. 对于 TCP ,调用 tcp_sendmsg 函数。
      2. 对于 UDP 来说,userspace 应用可以调用 send()/sendto()/sendmsg() 三个 system call 中的任意一个来发送 UDP message,它们最终都会调用内核中的 udp_sendmsg() 函数。

    4

    1.1.2 传输层

    传输层的最终目的是向它的用户提供高效的、可靠的和成本有效的数据传输服务,主要功能包括 (1)构造 TCP segment (2)计算 checksum (3)发送回复(ACK)包 (4)滑动窗口(sliding windown)等保证可靠性的操作。TCP 协议栈的大致处理过程如下图所示:

    5

    TCP 栈简要过程:

    1. tcp_sendmsg 函数会首先检查已经建立的 TCP connection 的状态,然后获取该连接的 MSS,开始 segement 发送流程。
    2. 构造 TCP 段的 playload:它在内核空间中创建该 packet 的 sk_buffer 数据结构的实例 skb,从 userspace buffer 中拷贝 packet 的数据到 skb 的 buffer。
    3. 构造 TCP header。
    4. 计算 TCP 校验和(checksum)和 顺序号 (sequence number)。
      1. TCP 校验和是一个端到端的校验和,由发送端计算,然后由接收端验证。其目的是为了发现TCP首部和数据在发送端到接收端之间发生的任何改动。如果接收方检测到校验和有差错,则TCP段会被直接丢弃。TCP校验和覆盖 TCP 首部和 TCP 数据。
      2. TCP的校验和是必需的
    5. 发到 IP 层处理:调用 IP handler 句柄 ip_queue_xmit,将 skb 传入 IP 处理流程。

    UDP 栈简要过程:

    1. UDP 将 message 封装成 UDP 数据报
    2. 调用 ip_append_data() 方法将 packet 送到 IP 层进行处理。

    1.1.3 IP 网络层 – 添加header 和 checksum,路由处理,IP fragmentation

    网络层的任务就是选择合适的网间路由和交换结点, 确保数据及时传送。网络层将数据链路层提供的帧组成数据包,包中封装有网络层包头,其中含有逻辑地址信息- -源站点和目的站点地址的网络地址。其主要任务包括 (1)路由处理,即选择下一跳 (2)添加 IP header(3)计算 IP header checksum,用于检测 IP 报文头部在传播过程中是否出错 (4)可能的话,进行 IP 分片(5)处理完毕,获取下一跳的 MAC 地址,设置链路层报文头,然后转入链路层处理。

    IP 头:

    6

    IP 栈基本处理过程如下图所示:

    7

    1. 首先,ip_queue_xmit(skb)会检查skb->dst路由信息。如果没有,比如套接字的第一个包,就使用ip_route_output()选择一个路由。
    2. 接着,填充IP包的各个字段,比如版本、包头长度、TOS等。
    3. 中间的一些分片等,可参阅相关文档。基本思想是,当报文的长度大于mtu,gso的长度不为0就会调用 ip_fragment 进行分片,否则就会调用ip_finish_output2把数据发送出去。ip_fragment 函数中,会检查 IP_DF 标志位,如果待分片IP数据包禁止分片,则调用 icmp_send()向发送方发送一个原因为需要分片而设置了不分片标志的目的不可达ICMP报文,并丢弃报文,即设置IP状态为分片失败,释放skb,返回消息过长错误码。
    4. 接下来就用 ip_finish_ouput2 设置链路层报文头了。如果,链路层报头缓存有(即hh不为空),那就拷贝到skb里。如果没,那么就调用neigh_resolve_output,使用 ARP 获取。

    1.1.4 数据链路层 

       功能上,在物理层提供比特流服务的基础上,建立相邻结点之间的数据链路,通过差错控制提供数据帧(Frame)在信道上无差错的传输,并进行各电路上的动作系列。数据链路层在不可靠的物理介质上提供可靠的传输。该层的作用包括:物理地址寻址、数据的成帧、流量控制、数据的检错、重发等。在这一层,数据的单位称为帧(frame)。数据链路层协议的代表包括:SDLC、HDLC、PPP、STP、帧中继等。

    实现上,Linux 提供了一个 Network device 的抽象层,其实现在 linux/net/core/dev.c。具体的物理网络设备在设备驱动中(driver.c)需要实现其中的虚函数。Network Device 抽象层调用具体网络设备的函数。

    8

    1.1.5 物理层 – 物理层封装和发送

    9

     

    1. 物理层在收到发送请求之后,通过 DMA 将该主存中的数据拷贝至内部RAM(buffer)之中。在数据拷贝中,同时加入符合以太网协议的相关header,IFG、前导符和CRC。对于以太网网络,物理层发送采用CSMA/CD,即在发送过程中侦听链路冲突。
    2. 一旦网卡完成报文发送,将产生中断通知CPU,然后驱动层中的中断处理程序就可以删除保存的 skb 了。

    1.1.6 简单总结

    10 (来源

    1.2 接收端

    1.2.1 物理层和数据链路层

    1122

    简要过程:

    1. 一个 package 到达机器的物理网络适配器,当它接收到数据帧时,就会触发一个中断,并将通过 DMA 传送到位于 linux kernel 内存中的 rx_ring。
    2. 网卡发出中断,通知 CPU 有个 package 需要它处理。中断处理程序主要进行以下一些操作,包括分配 skb_buff 数据结构,并将接收到的数据帧从网络适配器I/O端口拷贝到skb_buff 缓冲区中;从数据帧中提取出一些信息,并设置 skb_buff 相应的参数,这些参数将被上层的网络协议使用,例如skb->protocol;
    3. 终端处理程序经过简单处理后,发出一个软中断(NET_RX_SOFTIRQ),通知内核接收到新的数据帧。
    4. 内核 2.5 中引入一组新的 API 来处理接收的数据帧,即 NAPI。所以,驱动有两种方式通知内核:(1) 通过以前的函数netif_rx;(2)通过NAPI机制。该中断处理程序调用 Network device的 netif_rx_schedule 函数,进入软中断处理流程,再调用 net_rx_action 函数。
    5. 该函数关闭中断,获取每个 Network device 的 rx_ring 中的所有 package,最终 pacakage 从 rx_ring 中被删除,进入 netif _receive_skb 处理流程。
    6. netif_receive_skb 是链路层接收数据报的最后一站。它根据注册在全局数组 ptype_all 和 ptype_base 里的网络层数据报类型,把数据报递交给不同的网络层协议的接收函数(INET域中主要是ip_rcv和arp_rcv)。该函数主要就是调用第三层协议的接收函数处理该skb包,进入第三层网络层处理。

    1.2.2 网络层

    12   23

     

    1. IP 层的入口函数在 ip_rcv 函数。该函数首先会做包括 package checksum 在内的各种检查,如果需要的话会做 IP defragment(将多个分片合并),然后 packet 调用已经注册的 Pre-routing netfilter hook ,完成后最终到达 ip_rcv_finish 函数。
    2. ip_rcv_finish 函数会调用 ip_router_input 函数,进入路由处理环节。它首先会调用 ip_route_input 来更新路由,然后查找 route,决定该 package 将会被发到本机还是会被转发还是丢弃:
      1. 如果是发到本机的话,调用 ip_local_deliver 函数,可能会做 de-fragment(合并多个 IP packet),然后调用 ip_local_deliver 函数。该函数根据 package 的下一个处理层的 protocal number,调用下一层接口,包括 tcp_v4_rcv (TCP), udp_rcv (UDP),icmp_rcv (ICMP),igmp_rcv(IGMP)。对于 TCP 来说,函数 tcp_v4_rcv 函数会被调用,从而处理流程进入 TCP 栈。
      2. 如果需要转发 (forward),则进入转发流程。该流程需要处理 TTL,再调用 dst_input 函数。该函数会 (1)处理 Netfilter Hook (2)执行 IP fragmentation (3)调用 dev_queue_xmit,进入链路层处理流程。

    13  24

    1.2.3 传输层 (TCP/UDP)

    1. 传输层 TCP 处理入口在 tcp_v4_rcv 函数(位于 linux/net/ipv4/tcp ipv4.c 文件中),它会做 TCP header 检查等处理。
    2. 调用 _tcp_v4_lookup,查找该 package 的 open socket。如果找不到,该 package 会被丢弃。接下来检查 socket 和 connection 的状态。
    3. 如果socket 和 connection 一切正常,调用 tcp_prequeue 使 package 从内核进入 user space,放进 socket 的 receive queue。然后 socket 会被唤醒,调用 system call,并最终调用 tcp_recvmsg 函数去从 socket recieve queue 中获取 segment。

    1.2.4 接收端 – 应用层

    1. 每当用户应用调用  read 或者 recvfrom 时,该调用会被映射为/net/socket.c 中的 sys_recv 系统调用,并被转化为 sys_recvfrom 调用,然后调用 sock_recgmsg 函数。
    2. 对于 INET 类型的 socket,/net/ipv4/af inet.c 中的 inet_recvmsg 方法会被调用,它会调用相关协议的数据接收方法。
    3. 对 TCP 来说,调用 tcp_recvmsg。该函数从 socket buffer 中拷贝数据到 user buffer。
    4. 对 UDP 来说,从 user space 中可以调用三个 system call recv()/recvfrom()/recvmsg() 中的任意一个来接收 UDP package,这些系统调用最终都会调用内核中的 udp_recvmsg 方法。

    1.2.5 报文接收过程简单总结

    14

     2. Linux sk_buff struct 数据结构和队列(Queue)

    2.1 sk_buff

    (本章节摘选自 http://amsekharkernel.blogspot.com/2014/08/what-is-skb-in-linux-kernel-what-are.html

    2.1.1 sk_buff 是什么

    当网络包被内核处理时,底层协议的数据被传送更高层,当数据传送时过程反过来。由不同协议产生的数据(包括头和负载)不断往下层传递直到它们最终被发送。因为这些操作的速度对于网络层的表现至关重要,内核使用一个特定的结构叫 sk_buff, 其定义文件在 skbuffer.h。Socket buffer被用来在网络实现层交换数据而不用拷贝来或去数据包 –这显著获得速度收益。

    • sk_buff 是 Linux 网络的一个核心数据结构,其定义文件在 skbuffer.h
    • socket kernel buffer (skb) 是 Linux 内核网络栈(L2 到 L4)处理网络包(packets)所使用的 buffer,它的类型是 sk_buffer。简单来说,一个 skb 表示 Linux 网络栈中的一个 packet;TCP 分段和 IP 分组生产的多个 skb 被一个 skb list 形式来保存。
    • struct sock 有三个 skb 队列(sk_buffer queue),分别是 rx , tx 和 err。

    15

    它的主要结构成员:

    复制代码
    struct sk_buff {
        /* These two members must be first. */ # packet 可以存在于 list 或者 queue 中,这两个成员用于链表处理
        struct sk_buff        *next;
        struct sk_buff        *prev;
        struct sk_buff_head    *list; #该 packet 所在的 list
     ...
        struct sock        *sk;      #跟该 skb 相关联的 socket
        struct timeval        stamp; # packet 发送或者接收的时间,主要用于 packet sniffers
        struct net_device    *dev;  #这三个成员跟踪该 packet 相关的 devices,比如接收它的设备等
        struct net_device    *input_dev;
        struct net_device    *real_dev;
    
        union {                  #指向各协议层 header 结构
            struct tcphdr    *th;
            struct udphdr    *uh;
            struct icmphdr    *icmph;
            struct igmphdr    *igmph;
            struct iphdr    *ipiph;
            struct ipv6hdr    *ipv6h;
            unsigned char    *raw;
        } h;
    
        union {
            struct iphdr    *iph;
            struct ipv6hdr    *ipv6h;
            struct arphdr    *arph;
            unsigned char    *raw;
        } nh;
    
        union {
            unsigned char    *raw;
        } mac;
    
        struct  dst_entry    *dst; #指向该 packet 的路由目的结构,告诉我们它会被如何路由到目的地
        char            cb[40];    # SKB control block,用于各协议层保存私有信息,比如 TCP 的顺序号和帧的重发状态
        unsigned int        len, #packet 的长度
                    data_len,
                    mac_len,       # MAC header 长度
                    csum;          # packet 的 checksum,用于计算保存在 protocol header 中的校验和。发送时,当 checksum offloading 时,不设置;接收时,可以由device计算
    
        unsigned char        local_df, #用于 IPV4 在已经做了分片的情况下的再分片,比如 IPSEC 情况下。
                    cloned:1, #在 skb 被 cloned 时设置,此时,skb 各成员是自己的,但是数据是shared的
                    nohdr:1,  #用于支持 TSO
                    pkt_type, #packet 类型
                    ip_summed; # 网卡能支持的校验和计算的类型,NONE 表示不支持,HW 表示支持,
    
        __u32            priority; #用于 QoS
        unsigned short        protocol, # 接收 packet 的协议
                    security;
    复制代码

    2.1.2 skb 的主要操作

    (1)分配 skb = alloc_skb(len, GFP_KERNEL)

    16

    (2)添加 payload (skb_put(skb, user_data_len))

    17

    (3)使用 skb->push 添加 protocol header,或者 skb->pull 删除 header

    18

      2.2 Linux 网络栈使用的驱动队列 (driver queue)

    (本章节摘选自 Queueing in the Linux Network Stack by Dan Siemon)

    2.2.1 队列

    19

    在 IP 栈和 NIC 驱动之间,存在一个 driver queue (驱动队列)。典型地,它被实现为 FIFO ring buffer,简单地可以认为它是固定大小的。这个队列不包含 packet data,相反,它只是保存 socket kernel buffer (skb)的指针,而 skb 的使用如上节所述是贯穿内核网络栈处理过程的始终的。

    该队列的输入时 IP 栈处理完毕的 packets。这些packets 要么是本机的应用产生的,要么是进入本机又要被路由出去的。被 IP 栈加入队列的 packets 会被网络设备驱动(hardware driver)取出并且通过一个数据通道(data bus)发到 NIC 硬件设备并传输出去。

    在不使用 TSO/GSO 的情况下,IP 栈发到该队列的 packets 的长度必须小于 MTU。

    2.2.2 skb 大小 – 默认最大大小为 NIC MTU

    绝大多数的网卡都有一个固定的最大传输单元(maximum transmission unit, MTU)属性,它是该网络设备能够传输的最大帧(frame)的大小。对以太网来说,默认值为 1500 bytes,但是有些以太网络可以支持巨帧(jumbo frame),最大能到 9000 bytes。在 IP 网络栈内,MTU 表示能发给 NIC 的最大 packet 的大小。比如,如果一个应用向一个 TCP socket 写入了 2000 bytes 数据,那么 IP 栈需要创建两个 IP packets 来保持每个 packet 的大小等于或者小于 1500 bytes。可见,对于大数据传输,相对较小的 MTU 会导致产生大量的小网络包(small packets)并被传入 driver queue。这成为 IP 分片 (IP fragmentation)。

    下图表示 payload 为 1500 bytes 的 IP 包,在 MTU 为 1000 和 600 时候的分片情况:

    20


    展开全文
  • linux 网络协议栈

    2019-05-09 15:36:48
    以下整理网络协议栈文档 linux内核网络协议栈架构分析 https://blog.csdn.net/zxorange321/article/details/75676063 linux 网络协议栈开发 https://blog.csdn.net/zqixiao_09/article/category/7400580 /proc/...

    以下整理网络协议栈文档

    linux内核网络协议栈架构分析 https://blog.csdn.net/zxorange321/article/details/75676063
    linux 网络协议栈开发 https://blog.csdn.net/zqixiao_09/article/category/7400580
    /proc/net/ 目录文件 https://blog.csdn.net/weichanghu_/article/details/80073959

    展开全文
  •  图 无线传感器网络协议栈  下面对各层协议和平台分别作介绍:  (1)物理层  它着眼于信号的调制,发送与接收。物理层的主要工作是负责频段的选择,信号的调制以及数据的加密等等。对于距离较远的无线通信来...
  • linux网络报文接收发送浅析 作者: 七伤 对于linux内核来说,网络报文由... 网络报文的发送与之相反,进程通过系统调用将数据送入网络协议栈,或者由网络协议栈自己发起报文的发送,然后协议栈通过调用网络接口函数
  • (1)Socket应用层的各种网络应用程序基本上都是通过LinuxSocket编程接口来和内核空间的网络协议栈通信的。LinuxSocket是从BSDSocket发展而来的,它是Linux操作系统的重要组成部分之一,它是网络应用程序的基础。从...
  • 证实现 TCP/IP 基础功能的同时,又能很好的控制协议栈对处理器资源及存储资源的消耗,是许多嵌入式系统网络协议栈中非常重要的一种。但是随着 LwIP 协议栈应用场景的扩大,在 LwIP 协议栈应用过程中依然存在着很多...
  • Linux网络协议栈跟Windows系统中的网络协议有什么不一样呢?这个还需要我们来看看具体的内容。下面就来简单看看它的概念,结构以及相应的一些解说吧。望对大家有所帮助。  Linux网络协议栈  Linux的协议栈其实是...
  • 802.11网络协议栈学习指南
  • vxworks网络协议栈编程指南_中文
  • 【Linux 内核网络协议栈源码剖析】系统网络协议栈初始化及数据传输通道建立过程
  • 网络协议栈分析

    2011-11-27 10:51:10
    本文档详细讲述网络协议栈的代码分析与设计,适合学习网络编程和网络管理的参考
  • VxWorks网络协议栈的MUX接口,VxWorks网络协议栈的MUX接口,VxWorks网络协议栈的MUX接口,VxWorks网络协议栈的MUX接口,VxWorks网络协议栈的MUX接口,VxWorks网络协议栈的MUX接口,VxWorks网络协议栈的MUX接口
  • 《监视和调整Linux网络协议栈:接收数据》 《监控和调整Linux网络协议栈的图解指南:接收数据》 《监视和调整Linux网络协议栈:发送数据》 《深入理解 Cilium 的 eBPF(XDP)收发包路径:数据包在Linux网络协议栈...
  • 《TCP/IP网络协议栈:以太网数据包结构、802.3》 《TCP/IP网络协议栈:ARP协议详解》 《TCP / IP攻击:ARP缓存中毒的基本原理、TCP序列号预测和TCP重置攻击》 《TCP/IP网络协议栈:IP协议》 目录 01 IP地址 ...
  • 网络协议栈基本知识

    2020-07-24 13:37:06
    个人觉得原作者把网络协议栈讲解的很好(生动,易理解),所以在这里记录并分享。 1、网络协议分层 按照分层的思想把网络协议栈进行分层主要有以下好处: 1.促进标准化工作,允许各个供应商进行开发 2.各层间...
  • 传感器网络协议栈

    千次阅读 2016-11-23 23:35:24
    传感器网络协议栈 网络协议结构是网络的协议分层以及网络协议的集合,是对网络及其部件所应完成功能的定义和描述。虽然无线传感器网络与传统网络相比有很多不同的地方,但是其网络协议栈都可以划分成TCP/IP的五层...
  • 当前主流的小型嵌入式网络协议栈主要有:uIP,LwIP,embOS/IP,uC/TCP-IP,FreeRTOS-TCP 和 RL-TCPnet。当然,还有其它的网络协议栈,只是不被我们所知,这里把前面说到的其中几款协议栈进行简单的介绍。另外,物联网...
  • 网络协议栈指纹原理

    2012-03-07 09:12:40
    在探测技术中,有一类是通过网络协议栈指纹来进行的。协议栈指纹是指不同操作系统的网络协议栈存在的细微差别,这些差别可以用来区分不同的操作系统。本文研究和分析了此技术的原理和实践,并提出了防止指纹探测的...
  • Linux 网络协议栈纲要

    2016-07-24 10:57:00
    Linux网络核心架构Linux的网络架构从上往下可以分为三层,分别是:用户空间的应用层。内核空间的网络协议栈层。...Linux网络协议栈结构Linux的整个网络协议栈都构建与Linux Kernel中,整个栈也是...
  • 面对日益膨胀的网络,随着伴随的是多种协议的交叉使用,不知道大家对VxWorks网络协议栈是否有所了解。随着Internet的快速增长和WWW的流行,TCP/IP协议已经成为内部网和广域网的首选网络协议,随着更多的应用对协议...
  • Linux1.2.13 网络协议栈源码。该版本源码小而全,适合初学者入门学习tcpip协议栈。
  • Linux 网络协议栈中对于协议的处理。 Table of Contents 1 Overview 1.1 网络协议栈模型1.2 协议 handler 在内核中的组织方式 2 协议 Handler 的注册、注销和使用 2.1 协议的表示 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,605
精华内容 4,642
关键字:

网络协议栈