Linux内核网络协议栈数据包发送
由于在connect函数中涉及数据包的发送与接收问题,事实上,发送与接收函数不限于connect函数,所以这里单独剖析。
承前文继续剖析 connect 函数,数据包的发送和接收在 ip_queue_xmit 函数和 release_sock 函数中实现。本文着重分析 ip_queue_xmit 函数,下篇将补充分析 connect 函数剩下的部分。
值得注意的是:这些函数是数据包发送函数,在数据传输阶段,基本上都会调用该函数,因为connect涉及该函数,就放在这里介绍了,不意味着这个函数只属于connect下层函数。
1、网络层——ip_queue_xmit 函数123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 ...
Linux内核网络协议栈计算机基础
1、数据报文的封装与分用
封装:当应用程序用 TCP 协议传送数据时,数据首先进入内核网络协议栈中,然后逐一通过 TCP/IP 协议族的每层直到被当作一串比特流送入网络。对于每一层而言,对收到的数据都会封装相应的协议首部信息(有时还会增加尾部信息)。TCP 协议传给 IP 协议的数据单元称作 TCP 报文段,或简称 TCP 段(TCP segment)。IP 传给数据链路层的数据单元称作 IP 数据报(IP datagram),最后通过以太网传输的比特流称作帧(Frame)。
分用:当目的主机收到一个以太网数据帧时,数据就开始从内核网络协议栈中由底向上升,同时去掉各层协议加上的报文首部。每层协议都会检查报文首部中的协议标识,以确定接收数据的上层协议。这个过程称作分用。
2、Linux 内核网络协议栈2.1协议栈的分层结构
逻辑抽象层级:
物理层:主要提供各种连接的物理设备,如各种网卡,串口卡等。
链路层:主要提供对物理层进行访问的各种接口卡的驱动程序,如网卡驱动等。
网路层:是负责将网络数据包传输到正确的位置,最重要的网络层协议是 IP 协议,此外还有如 ICMP,AR ...
Linux内核网络栈主要结构介绍
1、socket(include\linux\Socket.h)该结构体socket 主要使用在BSD socket 层,是最上层的结构,在INET socket 层也会有涉及,但很少。
12345678910111213141516171819202122232425262728/* * Internal representation of a socket. not all the fields are used by * all configurations: * * server client * conn client connected to server connected to * iconn list of clients -unused- * awaiting connections * wait sleep for clients, sleep for connection, * sleep for i/o ...
Linux操作系统原理—内核网络协议栈
前言本文主要记录 Linux 内核网络协议栈的运行原理
数据报文的封装与分用
封装:当应用程序用 TCP 协议传送数据时,数据首先进入内核网络协议栈中,然后逐一通过 TCP/IP 协议族的每层直到被当作一串比特流送入网络。对于每一层而言,对收到的数据都会封装相应的协议首部信息(有时还会增加尾部信息)。TCP 协议传给 IP 协议的数据单元称作 TCP 报文段,或简称 TCP 段(TCP segment)。IP 传给数据链路层的数据单元称作 IP 数据报(IP datagram),最后通过以太网传输的比特流称作帧(Frame)
分用:当目的主机收到一个以太网数据帧时,数据就开始从内核网络协议栈中由底向上升,同时去掉各层协议加上的报文首部。每层协议都会检查报文首部中的协议标识,以确定接收数据的上层协议。这个过程称作分用。
Linux 内核网络协议栈协议栈的全景图
协议栈的分层结构
逻辑抽象层级:
物理层:主要提供各种连接的物理设备,如各种网卡,串口卡等。
链路层:主要提供对物理层进行访问的各种接口卡的驱动程序,如网卡驱动等。
网路层:是负责将网络数据包传输到正确的位置,最重 ...
Linux网络栈解剖
Linux®操作系统的最大功能之一是其网络栈。它最初是BSD协议栈的衍生物,并且组织良好,具有一组干净的接口。其接口范围从协议无关接口(如通用socket层接口或设备层)到各个网络协议的特定接口。本文从网络栈各层的角度探讨了Linux网络栈的结构,并探讨了其一些主要结构体。
协议介绍虽然网络的正式介绍通常是指七层开放系统互连(OSI)模型,但是Linux中基本网络栈的介绍使用互联网模型的四层模型(参见图1)。
网络栈的底部是链路层。链路层是指提供访问物理层的设备驱动程序(物理层可以是各种各样的介质,诸如串行链路或以太网设备)。链路层上面是网络层,负责将数据包引导到目的地。再上一层是传输层,它负责点对点通信(例如,在主机内,像ssh 127.0.0.1)。网络层管理主机之间的通信,传输层管理这些主机之上的端点(Endpoint)之间的通信。最后是应用层,即可以理解所传输的数据的语义层。
核心网络架构现在讨论Linux网络栈的架构以及它如何实现Internet模型。图2提供了Linux网络栈的高级视图。顶部是定义网络栈用户的用户空间层或应用层。底部是提供与网络(串行或高速网络(如以太网 ...
Linux网络源代码学习——整体介绍
简介
源码目录
网络分层
网络与文件操作
数据结构
sk_buff结构
网络协议栈实现——数据struct 和 协议struct
面向过程/对象/ioc
其它
以下来自linux1.2.13源码。linux的网络部分由网卡的驱动程序和kernel的网络协议栈部分组成,它们相互交互,完成数据的接收和发送。
源码目录1234567891011121314151617linux-1.2.13||---net | |---protocols.c |---socket.c |---unix | | | |---proc.c | |---sock.c | |---unix.h |---inet | |---af_inet.c |---arp.h,arp.c |---... ...
深入分析Linux操作系统对于TCP IP栈的实现原理与具体过程
一、Linux内核与网络体系结构在我们了解整个linux系统的网络体系结构之前,我们需要对整个网络体系调用,初始化和交互的位置,同时也是Linux操作系统中最为关键的一部分代码——-内核,有一个初步的认知。
1、Linux内核的结构首先,从功能上,我们将linux内核划分为五个不同的部分,分别是
(1)进程管理:主要负载CPU的访问控制,对CPU进行调度管理;(2)内存管理:主要提供对内存资源的访问控制;(3)文件系统:将硬盘的扇区组织成文件系统,实现文件读写等操作;(4)设备管理:用于控制所有的外部设备及控制器;(5)网洛:主要负责管理各种网络设备,并实现各种网络协议栈,最终实现通过网络连接其它系统的功能;
每个部分分别处理一项明确的功能,又向其它各个部分提供自己所完成的功能,相互协调,共同完成操作系统的任务。
Linux内核架构如下图所示:
2、Linux网络子系统内核的基本架构我们已经了解清楚了,接下来我们重点关注到内核中的网络模块,观察在linux内核中,我们是如何实现及运用TCP/IP协议,并完成网络的初始化及各个模块调用调度。我们将内核中的网络部分抽出,通过对比 ...
透过现象看本质,从linux源码角度看epoll
对于较多数量的文件描述符的监听无论是select还是poll系统调用都显得捉襟见肘,poll每次都需要将所有的文件描述符复制到内核,内核本身不会对这些文件描述符加以保存,这样的设计就导致了poll的效率的低下。
而epoll则对此做了相应的改进,不是epoll_wait的时候才传入fd,而是通过epoll_ctl把所有fd传入内核,再一起”wait”,这就省掉了不必要的重复拷贝。
其次,在 epoll_wait时,也不是把current轮流的加入fd对应的设备等待队列,而是在设备等待队列醒来时调用一个回调函数(当然,这就需要“唤醒回调”机制),把产生事件的fd归入一个链表,然后返回这个链表上的fd。另外,epoll机制实现了自己特有的文件系统eventpoll filesystem。
epoll初始化当系统启动时,epoll会进行初始化操作
1234567891011121314151617181920static int __init eventpoll_init(void){ mutex_init(&epmutex); /* Initialize t ...
驾驭Linux内部网络实现——关键数据结构 sk_buff
背景在 Linux 的网络栈实现代码中,引用到了一些数据结构。要理解 Linux 内部的网络实现,需要先理清这些数据结构的作用。关键数据结构主要有两个: sk_buff 和 net_device。
struct sk_buff: 是整个网络数据包存储的地方。这个数据结构会被网络协议栈中的各层用来储存它们的协议头、用户数据和其他它们完成工作需要的数据。
struct net_device: 在 Linux 内核中,这个数据结构将用来代表网络设备。它会包含设备的硬件和软件配置信息。
在 Linux 的网络实现中,核心数据结构还有struct sock, 它被用来储存 socket 的信息。但是 Socket 其实是内核为用户态程序提供的一组 Api, 用来访问内核的网络栈实现,所以它不属于内核内部的网络实现,也就不再这里介绍了。
本文将先着重理解 sk_buff 数据结构。
Socket Buffer: sk_buff
sk_buff: 在本文中后面部分也会被称为缓冲区
在 Linux 内核的网络代码中,这或许是最重要的数据结构,用来表示已接收或将要传输的数据。定义在 <inclu ...
Linux 总线、设备、驱动模型的探究
设备驱动模型的需求总线、设备和驱动模型,如果把它们之间的关系比喻成生活中的例子是比较容易理解的。举个例子,充电墙壁插座安静的嵌入在墙面上,无论设备是电脑还是手机,插座都能依然不动的完成它的使命——充电,没有说为了满足各种设备充电而去更换插座的。其实这就是软件工程强调的高内聚、低耦合概念。
所谓高内聚低耦合是模块内各元素联系越紧密就代表内聚性就越高,模块间联系越不紧密就代表耦合性低。所以高内聚、低耦合强调的就是内部要紧紧抱团。设备和驱动就是基于这种模型去实现彼此隔离不相干的。这里,有的读者就要问了,高内聚、低耦合的软件模型理解,可设备和驱动为什么要采用这种模型呢?没错,好问题。下面进入今天的话题——总线、设备和驱动模型的探究。
设想一个叫 GITCHAT 的网卡,它需要接在 CPU 的内部总线上,需要地址总线、数据总线和控制总线,以及中断 pin 脚等。
那么在 GITCHAT 的驱动里需要定义 GITCHAT 的基地址、中断号等信息。假设 GITCHAT 的地址为0x0001,中断号是 2,那么:
1234567891011121314#define GITCHAT_BASE 0x0 ...