协议栈 订阅
协议栈(英语:Protocol stack),又称协议堆叠,是计算机网络协议套件的一个具体的软件实现。协议套件中的一个协议通常是只为一个目的而设计的,这样可以使得设计更容易。因为每个协议模块通常都要和上下两个其他协议模块通信,它们通常可以想象成是协议栈中的层。最低级的协议总是描述与硬件的物理交互。每个高级的层次增加更多的特性。用户应用程序只是处理最上层的协议。(参见OSI模型) 展开全文
协议栈(英语:Protocol stack),又称协议堆叠,是计算机网络协议套件的一个具体的软件实现。协议套件中的一个协议通常是只为一个目的而设计的,这样可以使得设计更容易。因为每个协议模块通常都要和上下两个其他协议模块通信,它们通常可以想象成是协议栈中的层。最低级的协议总是描述与硬件的物理交互。每个高级的层次增加更多的特性。用户应用程序只是处理最上层的协议。(参见OSI模型)
信息
反映了
一个网络中文件传输的过程
外文名
Protocol Stack
中文名
协议栈
解    释
网络中各层协议的总和
协议栈简介
协议栈(英语:Protocol stack),又称协议堆叠,是计算机网络协议套件的一个具体的软件实现。协议套件中的一个协议通常是只为一个目的而设计的,这样可以使得设计更容易。因为每个协议模块通常都要和上下两个其他协议模块通信,它们通常可以想象成是协议栈中的层。最低级的协议总是描述与硬件的物理交互。每个高级的层次增加更多的特性。用户应用程序只是处理最上层的协议。(参见OSI模型)在实际中,协议栈通常分为三个主要部分:媒体,传输和应用。一个特定的操作系统或平台往往有两个定义良好的软件接口:一个在媒体层与传输层之间,另一个在传输层和应用程序之间。媒体到传输接口定义了传输协议的软件怎样使用特定的媒体和硬件(“驱动程序”)。例如,此接口定义的TCP/IP传输软件怎么与以太网硬件对话。这些接口的例子包括Windows和DOS环境下的ODI和NDIS。应用到传输接口定义了应用程序如何利用传输层。例如,此接口定义一个网页浏览器程序怎样和TCP/IP传输软件对话。这些接口的例子包括Unix世界中的伯克利套接字和微软的Winsock。 [1] 
收起全文
精华内容
下载资源
问答
  • 协议栈

    2021-08-06 07:51:41
    协议栈技术就是指在一台设备上同时启用IPv4协议栈和IPv6协议栈。这样的话,这台设备既能和IPv4网络通信,又能和IPv6网络通信。如果这台设备是一个路由器,那么这台路由器的不同接口上,分别配置了IPv4地址和IPv6...

    双协议栈技术就是指在一台设备上同时启用IPv4协议栈和IPv6协议栈。这样的话,这台设备既能和IPv4网络通信,又能和IPv6网络通信。如果这台设备是一个路由器,那么这台路由器的不同接口上,分别配置了IPv4地址和IPv6地址,并很可能分别连接了IPv4网络和IPv6网络。如果这台设备是一个计算机,那么它将同时拥有IPv4地址和IPv6地址,并具备同时处理这两个协议地址的功能。[1]

    中文名

    双协议栈

    外文名

    Dual Stack对    象

    通信端节点

    种    类

    IPv4和IPv6

    双协议栈 ( Dual Stack) 采用该技术的节点上同时运行IPv4和IPv6两套协议栈。这是使IPv6节点保持与纯IPv4节点兼容最直接的方式,针对的对象是通信端节点(包括主机、路由器)。这种方式对IPv4和IPv6提供了完全的兼容,但是对于IP地址耗尽的问题却没有任何帮助。由于需要双路由基础设施,这种方式反而增加了网络的复杂度。

    一、双协议栈的工作方式

    双协议栈是指在单个节点同时支持IPv4和IPv6两种协议栈。由于IPv6和IPv4是功能相近的网络层协议, 两者都基于相同的物理平台, 而且加载于其上的传输层协议TCP和UDP也基本没有区别, 因此, 支持双协议栈的节点既能与支持IPv4协议的节点通信, 又能与支持IPv6协议的节点通信。可以相信, 网络中主要服务商在网络全部升级到IPv6协议之前必将支持双协议栈的运行。

    1 . 接收数据包

    双栈节点与其它类型的多栈节点的工作方式相同。链路层接收到数据段, 拆开并检查包头。如果IPv4/IPv6头中的第一个字段, 即IP包的版本号是4, 该数据包就由IPv4栈来处理; 如果版本号是6, 则由IPv6栈处理; 如果建立了自动隧道机制, 则采用相应的技术将数据包重新整合为IPv6数据包, 由IPv6栈来处理。

    2 . 发送数据包

    由于双栈主机同时支持IPv4和IPv6两种协议, 所以当其在网络中通信的时候需要根据情况确定使用其中的一种协议栈进行通信, 这就需要制定双协议栈的工作方式。在网络通信过程中, 目的地址是作为路由选择的主要参数, 因而根据应用程序所使用的目的地址的协议类型对双协议栈的工作方式做出如下约定:

    ( 1) 若应用程序使用的目的地址为IPv4地址, 则使用IPv4协议;

    假设节点A与节点B通信, A为双栈节点, 节点B支持IPv4协议( 目的地址为IPv4地址) 。则双栈节点A工作方式:

    使用IPv4协议与节点B通信。

    完备性证明: 节点A有两种选择, 使用IPv4协议或者IPv6协议与主机B通信。根据给定条件, A, B节点均支持

    IPv4协议, 所以选择IPv4协议可以保证通信正常进行, 故约定是充分的。如果使用IPv6协议进行通信, 因为不能确定B是否为双栈节点( 给定条件仅是目的地址为IPv4地址) , 所以当B节点不支持IPv6协议时不能保证通信正常进行, 故约定是必要的。至此可以认为约定( 1) 是完备的。

    ( 2) 若目的地址为IPv6地址, 且为本地在线网络, 则使用IPv6协议。

    ( 3) 若应用程序使用的目的地址为IPv4兼容的IPv6地址, 并且非本地在线网络, 则使用IPv4协议, 此时的IPv6将

    封装在IPv4中。IPv4兼容的IPv6地址, 是IPv6协议规范中提供的特殊地址。这类地址高阶96位均为0, 低价32位包含IPv4地址。IPv4兼容地址被节点用于通过IPv4路由器以隧道方式传送IPv6包,这些节点既理解IPv4又理解IPv6。能够自动将IPv6包以隧道方式在IPv4网络中传送的IPv4/IPv6双栈节点将使用这些地址。根据IPv6协议地址规范以及( 3) 假定的条件, 可以确定目的节点B同样是一个双栈节点, 而结合IPv4/IPv6过渡时期网络的基本状况, 节点A与节点B的通信将跨越IPv4网络,所以使用IPv4协议是可行的。当然, 也可以使用IPv6协议进行通信, 但在过渡初期, ( 3) 的约定将优于使用IPv6协议通信。

    ( 4) 若应用程序使用的目的地址是非IPv4兼容的IPv6地址, 非本地在线网络, 则使用IPv6协议。类似约定( 2) , 使用IPv6协议能够保证通信正常进行,而如果是跨越纯IPv4网络的通信, 将采用隧道等机制实现通信; 而如果通过本地网络, 则无须隧道机制即可完成通信。

    ( 5) 若应用程序使用域名作为目标地址, 则先从域名服务器得到相应的IPv4/IPv6地址, 然后根据地址情况进行相应的处理。

    以上( 1) 至( 5) 是双协议栈的工作方式, 随着IPv6网络规模的不断扩大, 这些工作方式必将做相应的修改和补充,这将取决于过渡的进程与IPv6网络的不断演进。

    二、基于双协议栈的应用服务

    1 . 基于双协议栈的域名服务域名系统( 简称: DNS) 的主要功能是通过域名和IP地址之间的相互对应关系, 来精确定位网络资源, 即根据域名查询IP地址, 反之亦然。DNS是Internet的基础架构, 众多的网络服务都是建立在DNS体系基础之上的。因此, DNS的重要性不言而喻。

    IPv4地址正向解析的资源记录是“A”记录。IPv6地址解析目前有两种资源记录, 即“AAAA” 和“A6” 记录。“A6”记录支持一些“AAAA”所不具备的新特性, 如地址聚合, 地址更改( Renumber) 等。

    在DNS服务器中同时存在“A” 记录和“AAAA” ( 或“A6”) 记录。由于节点既可以处理IPv4协议, 也可以处理IPv6协议, 因此无需DNS ALG等转换设备。无论DNS服务器回答“A”记录还是“AAAA”记录, 都可以进行通信。

    2 . 基于双协议栈的BBS服务

    BBS是互联网上交流的平台, 在网络服务中起着重要的作用, 随着IPv4向IPv6的平滑过渡, 创建基于双协议栈的

    BBS服务系统就显得很有必要。根据“ 基本的支持IPv6的socket ( 套接字) 接口扩展”, 修改相关部分代码, 就可实现兼容IPv6和IPv4的BBS系统。

    ( 1) IPv6套接口地址结构

    在〈sys/socket.h〉中定义了IPv6的地址族———AF_INET6和协议族———PF_INET6, 或者将新的sockaddr_in6数据结构同原来的sockaddr_in数据结构区分开, 后者将在创建socket时使用。

    ( 2) IPv6的几种特殊地址在构造支持IPv6的BBS系统时, 要用到以下两种IPv6的特殊地址。①IPv4地址映射的IPv6地址。②IPv6通配地址。

    ( 3) 如何使程序兼容IPv4/IPv6大部分现有的网络应用程序是为IPv4编写的, 从上述原理可看出, 除了一些同IPv4的特性紧密相关的程序( 如使用多播、IP选项或原始套接口的程序) , 大部分IPv4应用程序若要转换成兼容IPv4/IPv6应用程序并不是很困难的。基于这种思想, 根据Socket API对IPv4和IPv6兼容所做的支持, 对现有的BBS系统( 基于IPv4的应用程序系统) 进行一系列的修改, 构造一个支持IPv6的BBS系统。采取以下主要步骤:

    ①构造一个双协议栈( Dual Stack) BBS服务器, 分别赋予IPv4和IPv6地址, 使得其上运行的BBS服务既能处理使用IPv4的客户, 又能处理使用IPv6的客户。

    ②对原来的IPv4套接字地址部分进行修改, 创建基于IPv6 套接字。

    ③将IPv6套接字绑定到IPv6通配地址和23号监听端口。

    ④采用兼容IPv4/IPv6的地址转换函数代替只支持IPv4的地址转换函数。

    ⑤修改程序中有关IP地址显示格式的代码, 以足够长度

    支持IPv6地址的显示。

    3 . IPv6校园网过渡方案

    在过渡过程中, IPv6网段作为孤岛接入IPv4网络, 为实现IPv6网段之间以及IPv4、IPv6网段之间的互通, 必须综合各种过渡技术, 优化网络结构, 在保证网络安全可靠运行以及逐步过渡、节约投资的前提下, 设计过渡方案。根据以上基本原则以及网络运行状况, 对于校园网络的初期过渡方案

    规划如下:

    ( 1) 跨IPv4网络的IPv6间通信采用隧道技术实现;

    ( 2) 基于IPv4的服务器逐步升级为双协议栈节点服务器;

    ( 3) IPv4/IPv6客户端互通则可以采用NAT- PT技术实现;

    ( 4) 本地IPv6网段联出口路由器接入上级IPv6网络。

    在开展IPv6应用的初期, 应该尽量保证原有网络系统安全、稳定运行, 所以对于新增的IPv6网段, 应该以独立链路接入上级IPv6网络。选择双协议栈路由器作为IPv6网段的接入节点, 以保证新建IPv6网段能同时使用本地网络服务。

    词条图册

    更多图册

    参考资料

    1.

    李振强、赵晓宇、马严等.IPv6技术揭秘:人民邮电出版社,2006年4月

    展开全文
  • 前言本文主要记录 Linux 内核网络协议栈的运行原理数据报文的封装与分用封装:当应用程序用 TCP 协议传送数据时,数据首先进入内核网络协议栈中,然后逐一通过 TCP/IP 协议族的每层...

    前言

    本文主要记录 Linux 内核网络协议栈的运行原理

    数据报文的封装与分用

    68cb2f63ff6d0f46bf8f962435eeb764.png

    封装:当应用程序用 TCP 协议传送数据时,数据首先进入内核网络协议栈中,然后逐一通过 TCP/IP 协议族的每层直到被当作一串比特流送入网络。对于每一层而言,对收到的数据都会封装相应的协议首部信息(有时还会增加尾部信息)。TCP 协议传给 IP 协议的数据单元称作 TCP 报文段,或简称 TCP 段(TCP segment)。IP 传给数据链路层的数据单元称作 IP 数据报(IP datagram),最后通过以太网传输的比特流称作帧(Frame)。

    8e34eb7f8d1805a3b5ed56d36094de0d.png

    分用:当目的主机收到一个以太网数据帧时,数据就开始从内核网络协议栈中由底向上升,同时去掉各层协议加上的报文首部。每层协议都会检查报文首部中的协议标识,以确定接收数据的上层协议。这个过程称作分用。

    c024a8286f1969cccbfb5e6c4f3cdca1.png

    Linux 内核网络协议栈

    协议栈的全景图

    780893aeb7ec4c0fb0ab7a2731f2024b.png

    协议栈的分层结构

    d1b4ea32eb345327419be3ed14ecc834.png

    ead7f7631fcbb19e60cd3532ce9bf229.png

    逻辑抽象层级:

    物理层:主要提供各种连接的物理设备,如各种网卡,串口卡等。

    链路层:主要提供对物理层进行访问的各种接口卡的驱动程序,如网卡驱动等。

    网路层:是负责将网络数据包传输到正确的位置,最重要的网络层协议是 IP 协议,此外还有如 ICMP,ARP,RARP 等协议。

    传输层:为应用程序之间提供端到端连接,主要为 TCP 和 UDP 协议。

    应用层:顾名思义,主要由应用程序提供,用来对传输数据进行语义解释的 “人机交互界面层”,比如 HTTP,SMTP,FTP 等协议。

    协议栈实现层级:

    硬件层(Physical device hardware):又称驱动程序层,提供连接硬件设备的接口。

    设备无关层(Device agnostic interface):又称设备接口层,提供与具体设备无关的驱动程序抽象接口。这一层的目的主要是为了统一不同的接口卡的驱动程序与网络协议层的接口,它将各种不同的驱动程序的功能统一抽象为几个特殊的动作,如 open,close,init 等,这一层可以屏蔽底层不同的驱动程序。

    网络协议层(Network protocols):对应 IP layer 和 Transport layer。毫无疑问,这是整个内核网络协议栈的核心。这一层主要实现了各种网络协议,最主要的当然是 IP,ICMP,ARP,RARP,TCP,UDP 等。

    协议无关层(Protocol agnostic interface),又称协议接口层,本质就是 SOCKET 层。这一层的目的是屏蔽网络协议层中诸多类型的网络协议(主要是 TCP 与 UDP 协议,当然也包括 RAW IP, SCTP 等等),以便提供简单而同一的接口给上面的系统调用层调用。简单的说,不管我们应用层使用什么协议,都要通过系统调用接口来建立一个 SOCKET,这个 SOCKET 其实是一个巨大的 sock 结构体,它和下面的网络协议层联系起来,屏蔽了不同的网络协议,通过系统调用接口只把数据部分呈献给应用层。

    BSD(Berkeley Software Distribution)socket:BSD Socket 层,提供统一的 SOCKET 操作接口,与 socket 结构体关系紧密。

    INET(指一切支持 IP 协议的网络) socket:INET socket 层,调用 IP 层协议的统一接口,与 sock 结构体关系紧密。

    系统调用接口层(System call interface),实质是一个面向用户空间(User Space)应用程序的接口调用库,向用户空间应用程序提供使用网络服务的接口。

    ec61fca86db600807ebfe5d930d08fd7.png

    协议栈的数据结构

    0a6b22daea8eba1f46d8da56bc2e31fc.png

    msghdr:描述了从应用层传递下来的消息格式,包含有用户空间地址,消息标记等重要信息。

    iovec:描述了用户空间地址的起始位置。

    file:描述文件属性的结构体,与文件描述符一一对应。

    file_operations:文件操作相关结构体,包括 read()、write()、open()、ioctl() 等。

    socket:向应用层提供的 BSD socket 操作结构体,协议无关,主要作用为应用层提供统一的 Socket 操作。

    sock:网络层 sock,定义与协议无关操作,是网络层的统一的结构,传输层在此基础上实现了 inet_sock。

    sock_common:最小网络层表示结构体。

    inet_sock:表示层结构体,在 sock 上做的扩展,用于在网络层之上表示 inet 协议族的的传输层公共结构体。

    udp_sock:传输层 UDP 协议专用 sock 结构,在传输层 inet_sock 上扩展。

    proto_ops:BSD socket 层到 inet_sock 层接口,主要用于操作 socket 结构。

    proto:inet_sock 层到传输层操作的统一接口,主要用于操作 sock 结构。

    net_proto_family:用于标识和注册协议族,常见的协议族有 IPv4、IPv6。

    softnet_data:内核为每个 CPU 都分配一个这样的 softnet_data 数据空间。每个 CPU 都有一个这样的队列,用于接收数据包。

    sk_buff:描述一个帧结构的属性,包含 socket、到达时间、到达设备、各层首部大小、下一站路由入口、帧长度、校验和等等。

    sk_buff_head:数据包队列结构。

    net_device:这个巨大的结构体描述一个网络设备的所有属性,数据等信息。

    inet_protosw:向 IP 层注册 socket 层的调用操作接口。

    inetsw_array:socket 层调用 IP 层操作接口都在这个数组中注册。

    sock_type:socket 类型。

    IPPROTO:传输层协议类型 ID。

    net_protocol:用于传输层协议向 IP 层注册收包的接口。

    packet_type:以太网数据帧的结构,包括了以太网帧类型、处理方法等。

    rtable:路由表结构,描述一个路由表的完整形态。

    rt_hash_bucket:路由表缓存。

    dst_entry:包的去向接口,描述了包的去留,下一跳等路由关键信息。

    napi_struct:NAPI 调度的结构。NAPI 是 Linux 上采用的一种提高网络处理效率的技术,它的核心概念就是不采用中断的方式读取数据,而代之以首先采用中断唤醒数据接收服务,然后采用 poll 的方法来轮询数据。NAPI 技术适用于高速率的短长度数据包的处理。

    网络协议栈初始化流程

    这需要从内核启动流程说起。当内核完成自解压过程后进入内核启动流程,这一过程先在 arch/mips/kernel/head.S 程序中,这个程序负责数据区(BBS)、中断描述表(IDT)、段描述表(GDT)、页表和寄存器的初始化,程序中定义了内核的入口函数 kernel_entry()、kernel_entry() 函数是体系结构相关的汇编代码,它首先初始化内核堆栈段为创建系统中的第一过程进行准备,接着用一段循环将内核映像的未初始化的数据段清零,最后跳到 start_kernel() 函数中初始化硬件相关的代码,完成 Linux Kernel 环境的建立。

    start_kenrel() 定义在 init/main.c 中,真正的内核初始化过程就是从这里才开始。函数 start_kerenl() 将会调用一系列的初始化函数,如:平台初始化,内存初始化,陷阱初始化,中断初始化,进程调度初始化,缓冲区初始化,完成内核本身的各方面设置,目的是最终建立起基本完整的 Linux 内核环境。

    start_kernel() 中主要函数及调用关系如下:

    1dff2dc20d3cb33cd6b0edc5e86d5030.png

    start_kernel() 的过程中会执行 socket_init() 来完成协议栈的初始化,实现如下:

    void sock_init(void)//网络栈初始化
    {
    	int i;
     
    	printk("Swansea University Computer Society NET3.019\n");
     
    	/*
    	 *	Initialize all address (protocol) families. 
    	 */
    	 
    	for (i = 0; i < NPROTO; ++i) pops[i] = NULL;
     
    	/*
    	 *	Initialize the protocols module. 
    	 */
     
    	proto_init();
     
    #ifdef CONFIG_NET
    	/* 
    	 *	Initialize the DEV module. 
    	 */
     
    	dev_init();
      
    	/*
    	 *	And the bottom half handler 
    	 */
     
    	bh_base[NET_BH].routine= net_bh;
    	enable_bh(NET_BH);
    #endif  
    }

    536f77c55446473b5ea02a6d107a3311.png

    sock_init() 包含了内核协议栈的初始化工作:

    sock_init:Initialize sk_buff SLAB cache,注册 SOCKET 文件系统。

    net_inuse_init:为每个 CPU 分配缓存。

    proto_init:在 /proc/net 域下建立 protocols 文件,注册相关文件操作函数。

    net_dev_init:建立 netdevice 在 /proc/sys 相关的数据结构,并且开启网卡收发中断;为每个 CPU 初始化一个数据包接收队列(softnet_data),包接收的回调;注册本地回环操作,注册默认网络设备操作。

    inet_init:注册 INET 协议族的 SOCKET 创建方法,注册 TCP、UDP、ICMP、IGMP 接口基本的收包方法。为 IPv4 协议族创建 proc 文件。此函数为协议栈主要的注册函数:

    rc = proto_register(&udp_prot, 1);:注册 INET 层 UDP 协议,为其分配快速缓存。

    (void)sock_register(&inet_family_ops);:向 static const struct net_proto_family *net_families[NPROTO] 结构体注册 INET 协议族的操作集合(主要是 INET socket 的创建操作)。

    inet_add_protocol(&udp_protocol, IPPROTO_UDP) < 0;:向 externconst struct net_protocol *inet_protos[MAX_INET_PROTOS] 结构体注册传输层 UDP 的操作集合。

    static struct list_head inetsw[SOCK_MAX]; for (r = &inetsw[0]; r < &inetsw[SOCK_MAX];++r) INIT_LIST_HEAD(r);:初始化 SOCKET 类型数组,其中保存了这是个链表数组,每个元素是一个链表,连接使用同种 SOCKET 类型的协议和操作集合。

    for (q = inetsw_array; q < &inetsw_array[INETSW_ARRAY_LEN]; ++q):

    inet_register_protosw(q);:向 sock 注册协议的的调用操作集合。

    arp_init();:启动 ARP 协议支持。

    ip_init();:启动 IP 协议支持。

    udp_init();:启动 UDP 协议支持。

    dev_add_pack(&ip_packet_type);:向 ptype_base[PTYPE_HASH_SIZE]; 注册 IP 协议的操作集合。

    socket.c 提供的系统调用接口。

    e6b01e69229d079055992abd373bf129.png

    58d57481a5f6c10df60f28e96a5e6050.png

    协议栈初始化完成后再执行 dev_init(),继续设备的初始化。

    Socket 创建流程

    9412680115ba290575512d8a8e29deea.png

    协议栈收包流程概述

    硬件层与设备无关层:硬件监听物理介质,进行数据的接收,当接收的数据填满了缓冲区,硬件就会产生中断,中断产生后,系统会转向中断服务子程序。在中断服务子程序中,数据会从硬件的缓冲区复制到内核的空间缓冲区,并包装成一个数据结构(sk_buff),然后调用对驱动层的接口函数 netif_rx() 将数据包发送给设备无关层。该函数的实现在 net/inet/dev.c 中,采用了 bootom half 技术,该技术的原理是将中断处理程序人为的分为两部分,上半部分是实时性要求较高的任务,后半部分可以稍后完成,这样就可以节省中断程序的处理时间,整体提高了系统的性能。

    NOTE:在整个协议栈实现中 dev.c 文件的作用重大,它衔接了其下的硬件层和其上的网络协议层,可以称它为链路层模块,或者设备无关层的实现。

    网络协议层:就以 IP 数据报为例,从设备无关层向网络协议层传递时会调用 ip_rcv()。该函数会根据 IP 首部中使用的传输层协议来调用相应协议的处理函数。UDP 对应 udp_rcv()、TCP 对应 tcp_rcv()、ICMP 对应 icmp_rcv()、IGMP 对应 igmp_rcv()。以 tcp_rcv() 为例,所有使用 TCP 协议的套接字对应的 sock 结构体都被挂入 tcp_prot 全局变量表示的 proto 结构之 sock_array 数组中,采用以本地端口号为索引的插入方式。所以,当 tcp_rcv() 接收到一个数据包,在完成必要的检查和处理后,其将以 TCP 协议首部中目的端口号为索引,在 tcp_prot 对应的 sock 结构体之 sock_array 数组中得到正确的 sock 结构体队列,再辅之以其他条件遍历该队列进行对应 sock 结构体的查询,在得到匹配的 sock 结构体后,将数据包挂入该 sock 结构体中的缓存队列中(由 sock 结构体中的 receive_queue 字段指向),从而完成数据包的最终接收。

    NOTE:虽然这里的 ICMP、IGMP 通常被划分为网络层协议,但是实际上他们都封装在 IP 协议里面,作为传输层对待。

    协议无关层和系统调用接口层:当用户需要接收数据时,首先根据文件描述符 inode 得到 socket 结构体和 sock 结构体,然后从 sock 结构体中指向的队列 recieve_queue 中读取数据包,将数据包 copy 到用户空间缓冲区。数据就完整的从硬件中传输到用户空间。这样也完成了一次完整的从下到上的传输。

    协议栈发包流程概述

    1、应用层可以通过系统调用接口层或文件操作来调用内核函数,BSD socket 层的 sock_write() 会调用 INET socket 层的 inet_wirte()。INET socket 层会调用具体传输层协议的 write 函数,该函数是通过调用本层的 inet_send() 来实现的,inet_send() 的 UDP 协议对应的函数为 udp_write()。

    2、在传输层 udp_write() 调用本层的 udp_sendto() 完成功能。udp_sendto() 完成 sk_buff 结构体相应的设置和报头的填写后会调用 udp_send() 来发送数据。而在 udp_send() 中,最后会调用 ip_queue_xmit() 将数据包下放的网络层。

    3、在网络层,函数 ip_queue_xmit() 的功能是将数据包进行一系列复杂的操作,比如是检查数据包是否需要分片,是否是多播等一系列检查,最后调用 dev_queue_xmit() 发送数据。

    4、在链路层中,函数调用会调用具体设备提供的发送函数来发送数据包,e.g. dev->hard_start_xmit(skb, dev);。具体设备的发送函数在协议栈初始化的时候已经设置了。这里以 8390 网卡为例来说明驱动层的工作原理,在 net/drivers/8390.c 中函数 ethdev_init() 的设置如下:

    /* Initialize the rest of the 8390 device structure. */  
    int ethdev_init(struct device *dev)  
    {  
        if (ei_debug > 1)  
            printk(version);  
          
        if (dev->priv == NULL) { //申请私有空间  
            struct ei_device *ei_local; //8390 网卡设备的结构体  
              
            dev->priv = kmalloc(sizeof(struct ei_device), GFP_KERNEL); //申请内核内存空间  
            memset(dev->priv, 0, sizeof(struct ei_device));  
            ei_local = (struct ei_device *)dev->priv;  
    #ifndef NO_PINGPONG  
            ei_local->pingpong = 1;  
    #endif  
        }  
          
        /* The open call may be overridden by the card-specific code. */  
        if (dev->open == NULL)  
            dev->open = &ei_open; // 设备的打开函数  
        /* We should have a dev->stop entry also. */  
        dev->hard_start_xmit = &ei_start_xmit; // 设备的发送函数,定义在 8390.c 中  
        dev->get_stats   = get_stats;  
    #ifdef HAVE_MULTICAST  
        dev->set_multicast_list = &set_multicast_list;  
    #endif  
      
        ether_setup(dev);  
              
        return 0;  
    }

    UDP 的收发包流程总览

    c1806e670978406352bc1a9fa30434b1.png

    内核中断收包流程

    03a13b6fb0744125f69405ddbefedd8c.png

    UDP 收包流程

    2bcc19240d3d83e4bdbe70bed5d1c521.png

    UDP 发包流程

    ba0cc4d4d40d1c1c6e9ab9b4be36f2ac.png

    展开全文
  • 【5G系列】高层协议栈——协议栈架构

    万次阅读 多人点赞 2021-05-30 21:13:08
    文章目录高层协议栈——协议栈架构基础协议栈 高层协议栈——协议栈架构 基础协议栈        上面这张图演示了终端侧数据包如何从APP发送出去。首先终端APP通过TCP/IP协议将数据...

    本人就职于国际知名终端厂商,负责modem芯片研发。
    在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G算力网络技术标准研究。

    高层协议栈——协议栈架构

    基础协议栈

    在这里插入图片描述
           上面这张图演示了终端侧数据包如何从APP发送出去。首先终端APP通过TCP/IP协议将数据发送到modem驱动,在modem中NAS会根据QoS策略过滤数据包,过滤后的数据包通过SDAP->PDCP->RLC->MAC->PHY发送到终端的射频单元,射频单元将数据信号转换成模拟信号发送到空中。

           modem的Layer 2由SDAP、PDCP、RLC和MAC组成,每个数据包在经过上面4个sub-layer时都会被添加/减去该层的包头,如下图所示:(这个过程类似我们的计算机4层网络结构)
    在这里插入图片描述

    协议层功能与接口

      配置了CA的Layer2下行

    在这里插入图片描述

      配置了CA的Layer2上行

    在这里插入图片描述

    DRB+SRB

    在这里插入图片描述

      控制面协议栈

    在这里插入图片描述

      用户面协议栈

    在这里插入图片描述

    5G网络架构的协议栈影响

    在这里插入图片描述
    在这里插入图片描述

    DRB无线协议架构——网络角度

    RLC bearer: RLC and MAC logical channel configuration of a radio bearer in one cell group
    MCG bearer: in MR-DC, a radio bearer with an RLC bearer only in the MCG
    Split bearer: in MR-DC, a radio bearer with RLC bearers both in MCG and SCG
    SCG bearer: in MR-DC, a radio bearer with an RLC bearer only in the SCG

    从用户角度来看,存在三种无线承载:MCG bear, split bear, SCG bear

    EN-DC

    EN-DC下,对于MCG bear,网络可配置UE使用LTE PDCP或NR PDCP;对于SCG bear/split bear,UE使用的均是NR PDCP

    基站侧架构

    在这里插入图片描述

    终端侧架构

    在这里插入图片描述

    NGEN-DC,NE-DC

    NGEN-DC/NE-DC下,对于三种无线承载,UE使用的均是NR PDCP

    基站侧架构

    在这里插入图片描述

    终端侧架构

    在这里插入图片描述

    SRB无线协议架构

    在这里插入图片描述
    在这里插入图片描述

    RB无线协议架构—duplicate SRB/DRB

    在这里插入图片描述


    【5G系列】SDAP (Service Data Adaptation Protocol)协议详解
    【5G系列】PDCP (Packet Data Convergence Protocol)协议详解
    【5G系列】RLC (Radio Link Control )协议详解
    【5G系列】MAC (Medium Access Control)协议详解


    在这里插入图片描述

    展开全文
  • TCP/IP 协议栈是一系列网络协议的总和,是构成网络通信的核心骨架,它定义了电子设备如何连入因特网,以及数据如何在它们之间进行传输。TCP/IP 协议采用4层结构,分别是应用层、传输层、网络层和链路层,每一层都...

    TCP/IP 协议栈是一系列网络协议的总和,是构成网络通信的核心骨架,它定义了电子设备如何连入因特网,以及数据如何在它们之间进行传输。TCP/IP 协议采用4层结构,分别是应用层、传输层、网络层和链路层,每一层都呼叫它的下一层所提供的协议来完成自己的需求。由于我们大部分时间都工作在应用层,下层的事情不用我们操心;其次网络协议体系本身就很复杂庞大,入门门槛高,因此很难搞清楚TCP/IP的工作原理,通俗一点讲就是,一个主机的数据要经过哪些过程才能发送到对方的主机上。 接下来,我们就来探索一下这个过程。

    这里分享两个TCP/IP协议栈现实的视频讲解:

    tcp训练营,滑动窗口,udp并发,状态迁移图,挥手中间状态丨网络底层原理丨手写代码实现网络协议栈(上)

    tcp训练营,滑动窗口,udp并发,状态迁移图,挥手中间状态丨网络底层原理丨手写代码实现网络协议栈(下)

    0、物理介质

    物理介质就是把电脑连接起来的物理手段,常见的有光纤、双绞线,以及无线电波,它决定了电信号(0和1)的传输方式,物理介质的不同决定了电信号的传输带宽、速率、传输距离以及抗干扰性等等。

    TCP/IP协议栈分为四层,每一层都由特定的协议与对方进行通信,而协议之间的通信最终都要转化为 0 和 1 的电信号,通过物理介质进行传输才能到达对方的电脑,因此物理介质是网络通信的基石。

    下面我们通过一张图先来大概了解一下TCP/IP协议的基本框架:

    当通过http发起一个请求时,应用层、传输层、网络层和链路层的相关协议依次对该请求进行包装并携带对应的首部,最终在链路层生成以太网数据包,以太网数据包通过物理介质传输给对方主机,对方接收到数据包以后,然后再一层一层采用对应的协议进行拆包,最后把应用层数据交给应用程序处理。

    网络通信就好比送快递,商品外面的一层层包裹就是各种协议,协议包含了商品信息、收货地址、收件人、联系方式等,然后还需要配送车、配送站、快递员,商品才能最终到达用户手中。

    一般情况下,快递是不能直达的,需要先转发到对应的配送站,然后由配送站再进行派件。

    配送车就是物理介质,配送站就是网关, 快递员就是路由器,收货地址就是IP地址,联系方式就是MAC地址。

    快递员负责把包裹转发到各个配送站,配送站根据收获地址里的省市区,确认是否需要继续转发到其他配送站,当包裹到达了目标配送站以后,配送站再根据联系方式找到收件人进行派件。

    有了整体概念以后,下面我们详细了解一下各层的分工。

    1、链路层

    网络通信就是把有特定意义的数据通过物理介质传送给对方,单纯的发送 0 和 1 是没有意义的,要传输有意义的数据,就需要以字节为单位对 0 和 1 进行分组,并且要标识好每一组电信号的信息特征,然后按照分组的顺序依次发送。以太网规定一组电信号就是一个数据包,一个数据包被称为一帧, 制定这个规则的协议就是以太网协议。一个完整的以太网数据包如下图所示:

    整个数据帧由首部、数据和尾部三部分组成,首部固定为14个字节,包含了目标MAC地址、源MAC地址和类型;数据最短为46个字节,最长为1500个字节,如果需要传输的数据很长,就必须分割成多个帧进行发送;尾部固定为4个字节,表示数据帧校验序列,用于确定数据包在传输过程中是否损坏。因此,以太网协议通过对电信号进行分组并形成数据帧,然后通过物理介质把数据帧发送给接收方。那么以太网如何来识接收方的身份呢?

    以太网规协议定,接入网络的设备都必须安装网络适配器,即网卡, 数据包必须是从一块网卡传送到另一块网卡。而网卡地址就是数据包的发送地址和接收地址,也就是帧首部所包含的MAC地址,MAC地址是每块网卡的身份标识,就如同我们身份证上的身份证号码,具有全球唯一性。MAC地址采用十六进制标识,共6个字节, 前三个字节是厂商编号,后三个字节是网卡流水号,例如 4C-0F-6E-12-D2-19

    有了MAC地址以后,以太网采用广播形式,把数据包发给该子网内所有主机,子网内每台主机在接收到这个包以后,都会读取首部里的目标MAC地址,然后和自己的MAC地址进行对比,如果相同就做下一步处理,如果不同,就丢弃这个包。

    所以链路层的主要工作就是对电信号进行分组并形成具有特定意义的数据帧,然后以广播的形式通过物理介质发送给接收方。

    2、网络层

    对于上面的过程,有几个细节问题值得我们思考:

    发送者如何知道接收者的MAC地址? 发送者如何知道接收者和自己同属一个子网? 如果接收者和自己不在同一个子网,数据包如何发给对方?

    为了解决这些问题,网络层引入了三个协议,分别是IP协议、ARP协议、路由协议。

    【1】IP协议

    通过前面的介绍我们知道,MAC地址只与厂商有关,与所处的网络无关,所以无法通过MAC地址来判断两台主机是否属于同一个子网。

    因此,网络层引入了IP协议,制定了一套新地址,使得我们能够区分两台主机是否同属一个网络,这套地址就是网络地址,也就是所谓的IP地址。

    IP地址目前有两个版本,分别是IPv4和IPv6,IPv4是一个32位的地址,常采用4个十进制数字表示。IP协议将这个32位的地址分为两部分,前面部分代表网络地址,后面部分表示该主机在局域网中的地址。由于各类地址的分法不尽相同,以C类地址192.168.24.1为例,其中前24位就是网络地址,后8位就是主机地址。因此, 如果两个IP地址在同一个子网内,则网络地址一定相同。为了判断IP地址中的网络地址,IP协议还引入了子网掩码, IP地址和子网掩码通过按位与运算后就可以得到网络地址。

    由于发送者和接收者的IP地址是已知的(应用层的协议会传入), 因此我们只要通过子网掩码对两个IP地址进行AND运算后就能够判断双方是否在同一个子网了。

    【2】ARP协议

    即地址解析协议,是根据IP地址获取MAC地址的一个网络层协议。其工作原理如下:

    ARP首先会发起一个请求数据包,数据包的首部包含了目标主机的IP地址,然后这个数据包会在链路层进行再次包装,生成以太网数据包,最终由以太网广播给子网内的所有主机,每一台主机都会接收到这个数据包,并取出标头里的IP地址,然后和自己的IP地址进行比较,如果相同就返回自己的MAC地址,如果不同就丢弃该数据包。ARP接收返回消息,以此确定目标机的MAC地址;与此同时,ARP还会将返回的MAC地址与对应的IP地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。cmd输入 arp -a 就可以查询本机缓存的ARP数据。

    【3】路由协议

    通过ARP协议的工作原理可以发现,ARP的MAC寻址还是局限在同一个子网中,因此网络层引入了路由协议,首先通过IP协议来判断两台主机是否在同一个子网中,如果在同一个子网,就通过ARP协议查询对应的MAC地址,然后以广播的形式向该子网内的主机发送数据包;如果不在同一个子网,以太网会将该数据包转发给本子网的网关进行路由。网关是互联网上子网与子网之间的桥梁,所以网关会进行多次转发,最终将该数据包转发到目标IP所在的子网中,然后再通过ARP获取目标机MAC,最终也是通过广播形式将数据包发送给接收方。

    而完成这个路由协议的物理设备就是路由器,在错综复杂的网络世界里,路由器扮演者交通枢纽的角色,它会根据信道情况,选择并设定路由,以最佳路径来转发数据包。

    【4】IP数据包

    在网络层被包装的数据包就叫IP数据包,IPv4数据包的结构如下图所示:

    IP数据包由首部和数据两部分组成,首部长度为20个字节,主要包含了目标IP地址和源IP地址,目标IP地址是网关路由的线索和依据;数据部分的最大长度为65515字节,理论上一个IP数据包的总长度可以达到65535个字节,而以太网数据包的最大长度是1500个字符,如果超过这个大小,就需要对IP数据包进行分割,分成多帧发送。

    所以,网络层的主要工作是定义网络地址,区分网段,子网内MAC寻址,对于不同子网的数据包进行路由。

    给大家分享一波C/C++Linux后台服务器开发的学习资料,内容包括:C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,MongoDB,ZK,流媒体,P2P,Linux内核,Docker,TCP/IP,协程,DPDK多个高级知识点。

    需要的朋友可以+C/C++Linux后台服务器开发技术交流qun获取:学习资料

    3、传输层

    链路层定义了主机的身份,即MAC地址, 而网络层定义了IP地址,明确了主机所在的网段,有了这两个地址,数据包就从可以从一个主机发送到另一台主机。但实际上数据包是从一个主机的某个应用程序发出,然后由对方主机的应用程序接收。而每台电脑都有可能同时运行着很多个应用程序,所以当数据包被发送到主机上以后,是无法确定哪个应用程序要接收这个包。

    因此传输层引入了UDP协议来解决这个问题,为了给每个应用程序标识身份,UDP协议定义了端口,同一个主机上的每个应用程序都需要指定唯一的端口号,并且规定网络中传输的数据包必须加上端口信息。 这样,当数据包到达主机以后,就可以根据端口号找到对应的应用程序了。UDP定义的数据包就叫做UDP数据包,结构如下所示:

    UDP数据包由首部和数据两部分组成,首部长度为8个字节,主要包括源端口和目标端口;数据最大为65527个字节,整个数据包的长度最大可达到65535个字节。

    UDP协议比较简单,实现容易,但它没有确认机制, 数据包一旦发出,无法知道对方是否收到,因此可靠性较差,为了解决这个问题,提高网络可靠性,TCP协议就诞生了,TCP即传输控制协议,是一种面向连接的、可靠的、基于字节流的通信协议。简单来说TCP就是有确认机制的UDP协议,每发出一个数据包都要求确认,如果有一个数据包丢失,就收不到确认,发送方就必须重发这个数据包。

    为了保证传输的可靠性,TCP 协议在 UDP 基础之上建立了三次对话的确认机制,也就是说,在正式收发数据前,必须和对方建立可靠的连接。由于建立过程较为复杂,我们在这里做一个形象的描述:

    主机A:我想发数据给你,可以么? 主机B:可以,你什么时候发? 主机A:我马上发,你接着!

    经过三次对话之后,主机A才会向主机B发送正式数据,而UDP是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发过去了。所以 TCP 能够保证数据包在传输过程中不被丢失,但美好的事物必然是要付出代价的,相比 UDP,TCP 实现过程复杂,消耗连接资源多,传输速度慢。

    TCP 数据包和 UDP 一样,都是由首部和数据两部分组成,唯一不同的是,TCP 数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常 TCP 数据包的长度不会超过IP数据包的长度,以确保单个 TCP 数据包不必再分割。

    总结一下,传输层的主要工作是定义端口,标识应用程序身份,实现端口到端口的通信,TCP协议可以保证数据传输的可靠性。

    4、应用层

    理论上讲,有了以上三层协议的支持,数据已经可以从一个主机上的应用程序传输到另一台主机的应用程序了,但此时传过来的数据是字节流,不能很好的被程序识别,操作性差。因此,应用层定义了各种各样的协议来规范数据格式,常见的有 HTTP、FTP、SMTP 等,HTTP 是一种比较常用的应用层协议,主要用于B/S架构之间的数据通信,其报文格式如下:

    在 Resquest Headers 中,Accept 表示客户端期望接收的数据格式,而 ContentType 则表示客户端发送的数据格式;在 Response Headers 中,ContentType 表示服务端响应的数据格式,这里定义的格式,一般是和 Resquest Headers 中 Accept 定义的格式是一致的。

    有了这个规范以后,服务端收到请求以后,就能正确的解析客户端发来的数据,当请求处理完以后,再按照客户端要求的格式返回,客户端收到结果后,按照服务端返回的格式进行解析。

    所以应用层的主要工作就是定义数据格式并按照对应的格式解读数据。

    5、全流程

    首先我们梳理一下每层模型的职责:

    • 链路层:对0和1进行分组,定义数据帧,确认主机的物理地址,传输数据;

    • 网络层:定义IP地址,确认主机所在的网络位置,并通过IP进行MAC寻址,对外网数据包进行路由转发;

    • 传输层:定义端口,确认主机上应用程序的身份,并将数据包交给对应的应用程序;

    • 应用层:定义数据格式,并按照对应的格式解读数据。

    然后再把每层模型的职责串联起来,用一句通俗易懂的话讲就是:

    当你输入一个网址并按下回车键的时候,首先,应用层协议对该请求包做了格式定义;紧接着传输层协议加上了双方的端口号,确认了双方通信的应用程序;然后网络协议加上了双方的IP地址,确认了双方的网络位置;最后链路层协议加上了双方的MAC地址,确认了双方的物理位置,同时将数据进行分组,形成数据帧,采用广播方式,通过传输介质发送给对方主机。而对于不同网段,该数据包首先会转发给网关路由器,经过多次转发后,最终被发送到目标主机。目标机接收到数据包后,采用对应的协议,对帧数据进行组装,然后再通过一层一层的协议进行解析,最终被应用层的协议解析并交给服务器处理。

    6、总结

    以上内容是对TCP/IP四层模型做了简单的介绍,而实际上每一层模型都有很多协议,每个协议要做的事情也很多,但我们首先得有一个清晰的脉络结构,掌握每一层模型最基本的作用,然后再去丰富细枝末节的东西,也许会更容易理解。

     

    展开全文
  • 协议栈的内部结构

    2021-07-13 08:11:29
    本章我们将探索操作系统中的网络控制软件(协议栈)和网络硬件(网卡)是如何将浏览器的消息发送给服务器的。和浏览器不同的是,协议栈的工作我们从表面上是看不见的,可能比较难以想象。因此,在实际探索之前,我们...
  • ZigBee Zstack协议栈

    2021-05-27 18:53:46
    一、Zstack协议栈概述 什么是Zstack协议栈 为了使Zigbee的开发更加简单高效,TI公司推出了基于cc2530芯片的协议栈Z-STACK.协议栈的实质就是能实现各个功能的实例框架代码,我们想要实现自己的功能程序,只需要在协议...
  • 硬件协议栈和软件协议的区别: MCU+MAC+PHY方案 传统的以太网接入方案如下图,由 MCU+MAC+PHY 再加入网络接口实现以太网的物理连接,通过在主控芯片中植入TCP/IP 协议代码实现通信及上层应用。 硬件协议栈...
  • 简介2.BTStack 架构BTStack在所实现的协议和服务之间采用很多状态机实现相互作用,特点:<1>单线程.BTStack只有一个单独的循环。<2>没有阻塞,采用event事件方式。<3>No artficially limited ...
  • 本节先简单介绍互联网的发展史,然后讲解 TCPIP 和开放系统互连(OSI)模型,最后会介绍一下用户态协议栈的整体框架。 计算机互联网发展史 最开始的时候计算机是单独运算的,一般有一个大型主机放在那里,然后可以多...
  • 用户态协议栈

    2021-01-05 17:53:36
    用户态协议栈 dpdk/netmap c10M的问题,千万并发 客户端发送数据到服务器,服务器接收数据的步骤: 1. 从网卡copy到内核协议栈 2. 从内核协议栈copy到应用程序 提升系统的性能,降低瓶颈,我们可以设计用户态协议栈...
  • 蓝牙协议栈详解

    2021-05-24 02:31:08
    蓝牙协议体系中的协议蓝牙协议体系中的协议按SIG的关注程度分为四层:核心协议:BaseBand、LMP、L2CAP、SDP;电缆替代协议:RFCOMM;电话传送控制协议:TCS-Binary、AT命令集;选用协议:PPP、UDP/TCP/IP、OBEX、WAP...
  • ZigBee协议栈简介

    2021-09-26 11:23:08
    文章目录Zigbee协议栈简介如何理解Zigbee协议栈如何使用Zigbee协议栈 Zigbee协议栈简介   Zigbee协议分为2部分: IEEE 802.15.4定义了PHY(物理层)和MAC(介质访问层)技术规范。 Zigbee联盟定义了NWK(网络层)、APS...
  • ESP32蓝牙协议栈NIMBLE-HOST协议移植分析 目录 ESP32蓝牙协议栈NIMBLE-HOST协议移植分析 一、 nimble 蓝牙协议栈介绍 二 、关于esp32移植的内容分析 2.1 关于/porting 目录移植 2.2 /nimble 目录移植 三、 ...
  • 链表管理 在对skb链表的操作中,为了防止被其他异步操作打断,在操作前都必须现获取SKB头节点...接下来依着协议栈的层次进行分析和学习,从驱动一直到传输层。只会涉及最基本的几个协议(TCP、IP、UDP、ICMP以及ARP等)。
  • 1、LWIP的结构lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。LWIP(Light weight internet protocol)的主要模块包括...
  • 最近的一篇文章提出了“我们为什么使用Linux内核的TCP协议栈”的问题,并在Hacker News引发了非常有意思的讨论。在CloudFlare的时候我也曾思考这个问题。我的经验绝大部分来自于在这里和生产环境中成千的机器打交道...
  • 2.网络协议栈结构展示(自己实现协议栈就是封装传输层、网络层和数据链路层)3.举例udo数据的发送4.各层的消息头5.柔性数组的使用条件6.如何获取网卡原始数据 1.如何自己实现一个协议栈? ①协议栈的数据如何封装 ②...
  • Linux网络协议栈

    多人点赞 2021-05-21 12:53:19
    TCP 协议栈的大致处理过程如下图所示: TCP 栈简要过程: tcp_sendmsg 函数会首先检查已经建立的 TCP connection 的状态,然后获取该连接的 MSS,开始 segement 发送流程。 构造 TCP 段的 playload:它在内核空间中...
  • 本文主要记录 Linux 内核网络协议栈的运行原理 数据报文的封装与分用 封装:当应用程序用 TCP 协议传送数据时,数据首先进入内核网络协议栈中,然后逐一通过 TCP/IP 协议族的每层直到被当作一串比特流送入网络...
  • BLE 协议架构总体上分成3块,从下到上分别是:控制器(Controller),主机(Host)和应用端(Apps);3者可以在同一芯片类实现,也可以分不同芯片内实现,控制器(Controller)是处理射频数据解析,数据接收和发送,主机...
  • c进行协议栈开发.doc

    2021-05-22 05:56:01
    c进行协议栈开发篇一:协议栈仅供学习, 花了一个早上写的。板子是pca10001f51822.part02.rar (4.07 MB, 下载次数: 1168)载次数: 513)f51822.part01.rar (7 MB, 下载次数: 1635)工程文件f51822\Board\f6310\s120\...
  • 1. 什么是Zigbee协议栈 ? 什么是 ZigBee 协议栈呢?它和 ZigBee 协议有什么关系呢?协议是一系列的通信标准,通信双方 需要共同按照这一标准进行正常的数据发射和接收。协议 栈是协议的具体实现形式,通俗 点来理解...
  • 安卓系统蓝牙协议栈 bluedroid 使能流程分析本文承接上篇文章《安卓中蓝牙系统服务层的使能流程分析》,接续分析协议栈层相关的使能流程,所以蓝牙协议栈bluedroid的使能始于JNI层enableNative()中调用协议栈接口...
  • 1.3 协议栈发生在哪里? 1.4协议栈的类型 第2章 LTE的接网协议栈 第3章 5G的空口协议栈 3.1 5G无线接入网网络架构 3.2 5G空口协议栈 3.3空口L2 下行调度协议栈 3.4 空口L2上行调度协议栈 第4章5G NG接口协议...
  • 作为两个最有名的开源操作系统,Linux和...幸好,我们有源码,可以从协议栈的实现中寻找答案。TCP/IP协议栈是网络中广泛使用的事实网络通信标准。最初的TCP实现源自4.4BSD lite,在Linux兴起后,也不可避免得支持...
  • 《深入浅出LinuxTCP/IP协议栈》主要对Linux2.6.18内核协议栈源代码做了一些基本的分析,这些分析基于作者在操作系统方面的研究和网络协议开发过程中的经验和笔记,编写《深入浅出LinuxTCP/IP协议栈》的目的主要是使...
  • 那时候的大内核,不仅运行的时候所有驱动、文件系统、包括本书要讨论的协议栈要运行在内核态,而且编译的时候,编译的文件必须同时被编译到一个大的二进制文件中。如今的内核,在编译的时候,可以有选择的加入或减去...
  • 这篇文档是基于 x86 体系结构和转发 IP 分组的。数据包在 Linux 内核链路层路径接收分组1 接收中断...接着,会分配一个新的套接字缓冲区 skb ,并调用与协议无关的、网络设备均支持的通用网络接收处理函数 netif_rx(...
  • 用户态协议栈之MTCP

    2021-05-11 06:20:29
    内核TCP协议栈的低效率的原因 lack of connection locally 多个多线程应用共享一个监听套接字(这个监听套接字在一个众所周知的端口接收到来的连接),结果多个线程为了访问套接字的接受队列竞争同一个锁,造成性能...
  • Linux协议栈源码分析.pdfLinux2.6 协议栈源代码分析基于Linux 2.6.18 内核源码V0.1luoyu第 i 页Linux2.6 协议栈源代码分析目 录目 录 ii图目录 iv表目录 viii前 言 xiii感 谢 xiv第1章 协议栈概述 11.1 操作系统及...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 209,840
精华内容 83,936
关键字:

协议栈