【linux关于tcp协议ack以及乱序报文暂存的实现--立即ack/延迟ack/捎带ack】教程文章相关的互联网学习教程文章

linux内核-网络报文发送流程【代码】

报文的发送是由网络协议栈的上层发起的。网络协议栈上层构造一个需要发送的skb结构后(该skb已经包含了数据链路层的报头),调用dev_queue_xmit函数进行发送;dev_queue_xmit(skb);该函数先会处理一些缓冲区重组、计算校验和之类的杂事,然后开始处理报文的发送。发送报文有两种策略,有队列或无队列。这是由网络设备驱动程序在定义其对应的dev结构时指定的,一般的设备都会使用队列。dev->qdisc指向一个队列的实例,里面包含了队列...

Linux数据报文接收发送总结5【代码】【图】

2.2 网络子系统初始化 linux内核通过调用subsys_initcall来初始化各个子系统,在源代码目录里你可以grep出许多对这个函数的调用。这里我们要说的是网络子系统的初始化,会执行到net_dev_init函数。 /** Initialize the DEV module. At boot time this walks the device list and* unhooks any devices that fail to initialise (normally hardware not* present) and leaves us with a valid list of present and active devices...

Linux原始套接字抓取底层报文【代码】

1.原始套接字使用场景 我们平常所用到的网络编程都是在应用层收发数据,每个程序只能收到发给自己的数据,即每个程序只能收到来自该程序绑定的端口的数据。收到的数据往往只包括应用层数据,原有的头部信息在传递过程中被隐藏了。某些情况下我们需要执行更底层的操作,比如监听所有本机收发的数据、修改报头等,而像SOCK_STREAM、SOCK_DGRAMZ则通常用于应用层,并不能满足该需求。 通过原始套接字,我们可以抓取所有...

Linux数据报文接收发送总结4【代码】【图】

二、系统初始化 Linux驱动,内核协议栈等等模块在具备接收网卡数据包之前,要做很多的准备工作才行。比如要提前创建好ksoftirqd内核线程,要注册好各个协议对应的处理函数,网络设备子系统要提前初始化好,网卡要启动好。只有这些都Ready之后,我们才能真正开始接收数据包。那么我们现在来看看这些准备工作都是怎么做的。 Linux的子系统、模块均定义了一定的启动级别,在start_kernel函数中,按顺序启动 /* initcalls are now ...

Linux网络报文捕获/抓包技术对比:napi、libpcap、afpacket、PF_RING、PACKET_MMAP、DPDK、XDP(eXpress Data Path)【图】

Table of Contents 1.传统linux网络协议栈流程和性能分析 协议栈的主要问题 针对单个数据包级别的资源分配和释放 流量的串行访问 从驱动到用户态的数据拷贝 内核到用户空间的上下文切换 跨内存访问 2. 提高捕获效率的技术 预分配和重用内存资源 数据包采用并行直接通道传递. 内存映射. 数据包的批处理. 亲和性与预取. 3. 典型收包引擎 3.1 libpcap 3.2 libpcap-mmap 3.3 PF_RING 3.4 PACKET_MMAP PACKET_MMAP的实现原理 PACKET_MMA...

linux系统异常关机导致报文件系统只读Read-only file system的解决方法【代码】【图】

1.错误现象 有一天在公司正常上班的时候,突然有一台centos6系统的服务器连接不上了,然后通过ping发现服务器ping不通,当时以为只是普通的服务器宕机了,然后找到这台虚拟机,把重启了,重启之后发现,地址突然没了,然后把网卡重启了一遍,重启之后,外部可以ping的通了,但是通过xshell连的时候发现连不上,这个时候按网上的方法重启sshd服务。发现报下面的提示。 这个当时一整懵,后面发现不止sshd的服务报这样的提示,你执行...

linux关于tcp协议ack以及乱序报文暂存的实现--立即ack/延迟ack/捎带ack

tcp需要ack,可是为了效率,并不是每发送一个数据都要等待ack,而是尽可能利用窗口机制,积累发送ack的,当然在某些特殊情况下还是需要马上发送ack的,比如接收到乱序的数据,这种情况下,虽然接收端可以将乱序的数据包暂存,但是接收方必须发送一个ack号为按序的期望的序列号的ack给发送端,另外就是接收窗口需要调整,此时就要立刻发送ack,否则则可以延迟发送ack,看一下linux的这方面的代码: static void __tcp_ack_snd_check...