![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Linux网络协议栈
linux协议栈相关
zhenghuaduo
这个作者很懒,什么都没留下…
展开
-
TCP bbr简介
1、背景现有的拥塞控制算法,如cubic,基于丢包检查,问题1)、网络设备buffer大,导致bufferbloat只要不丢包,就会发送,这样就容易把网络设备的buffer填充满,导致延时增加;2)、网络设备buffer小,容易丢包,拥塞算法根据丢包控制发包速率,导致整体带宽吞吐小;2、BBR四个阶段流程start up进入start up有两个时机:1)、初始化bbr_init,先将bbr->mode初始化成BBR_STARTUP;static void bbr原创 2020-12-14 17:06:31 · 2691 阅读 · 0 评论 -
Linux tcp tsq
1、背景TCP发送的数据经过IP层添加IP包头后,会被发送到IP数据栈和网卡之间的队列中,当网卡能够发送数据时会到这个队列中去取skb。当TCP发送数据过快时,或一个带宽很大或者包速率很大的非TCP数据流会把队列里的所有空间占满,造成数据包丢失和延时的问题。更糟的是,这样很可能会使另一个缓存产生,进而产生一个静止队列(standing queue),造成更严重的延时并使TCP的RTT和拥塞窗口的计算出现问题。Linux3.6.0出现后,Linux内核增加了TCP小队列(TCP Small Queu原创 2020-12-14 14:39:49 · 451 阅读 · 0 评论 -
Linux tcp fast open
背景正常的一个tcp连接都需要先完成三次握手才可以发送数据,但存在很多应用,可能会间隔的重复使用同一个tcp流连接发送数据,但服务器这边由于tcp连接超时会将旧的连接信息删除,这样应用每次使用改tcp连接时,服务器都需要重新完成三次握手才能发数据,发送效率低下,fast open就是用来解决这种重复使用旧连接的问题,当开启fast open后,应用程序可以在第一个sync报文里携带用户数据,减少了不必要的三次握手。连接首次建立客户端流程使能方法:echo 1 >/proc/sys/原创 2020-12-05 21:12:14 · 907 阅读 · 0 评论 -
Linux tcp 慢启动重启
背景在Linux内核实现了,tcp发送端在连接建立开始时,会通过慢启动流程来避免一次性发送太多的数据到网络,引起网络拥塞丢包,如果tcp连接建立好了之后,发送端正常发送数据,并且已经完成慢启动流程了,这时候发送端没有数据发送,进入idle空闲期,然后过了一段时间才继续发送,因为当前的tcp拥塞状态已经不处于慢启动阶段了,可能拥塞窗口值是比较大的,但是现在的网络环境可能也已经发生变化了,如果按当前的拥塞窗口直接发送数据,有可能会造成拥塞丢包,因此内核提供了sysctl_tcp_slow_start_aft原创 2020-11-29 18:12:00 · 841 阅读 · 0 评论 -
Linux tcp拥塞控制
1、滑动窗口滑动窗口是发送方根据接收方的接收窗口来控制发送速率的手段,接收发的滑动窗口可分成以下四个部分,最左边的紫色表示发送方已发送并且接收发已经确认的序列号,蓝色部分表示发送方已经发送但接收方还未确认的序列号,绿色部门表示发送方可发送但未发送的序列号(也表示接收方通知的接收窗口),蓝色和绿色两部分之和即为接收端通知的接收窗口,对应发送端的snd_wnd字段,最右边表示发送方不能发送的序列号。紫色区域最右边的值对应tcp的snd_una,蓝色最左侧对应tcp的snd_next;在数据包传输过程中,sn原创 2020-11-27 22:20:18 · 1659 阅读 · 0 评论 -
Linux tcp xmit 定时器
在tcp socket初始化的时候,会初始化设置三个定时器,isck_retransmit_timer、isck_delack_timer、sk_timer,本文主要描述下这三种tcp定时器。void inet_csk_init_xmit_timers(struct sock *sk, void (*retransmit_handler)(unsigned long), void (*delack_handler)(unsigned long),原创 2020-11-27 21:15:34 · 917 阅读 · 0 评论 -
socket的sk_wmem_alloc
在socket的结构体里有一个sk_wmem_alloc字段,该字段表示已经提交到ip层,但还没有从本机发送出去的skb占用空间大小。分配时机 当tcp层封装好skb数据后,会调用tcp_transmit_skb,在该函数会根据skb的长度相应增加sk_wmem_alloc的值,然后发送给ip层。static int tcp_transmit_skb(struct sock *sk, struct sk_buff *skb, int clone_it, gfp_t ...原创 2020-10-08 18:10:46 · 955 阅读 · 0 评论 -
TCP四次挥手过程分析
1、tcp四次挥手过程状态迁移如下所示:1)、客户端通过close系统调用向服务端发起第一次挥手请求,此时客户端将自己状态置为TCP_FIN_WAIT1状态;2)、服务端收到fin请求后,将状态置为TCP_CLOSE_WAIT,并设置延时ack,然后通知服务端应用程序;3)、服务端应用程序通过close系统调用向客户端发起fin请求,同时回复之前客户端fin的ack,此时服务端将状态置为TCP_LAST_ACK状态;4)、客户端收到fin+ack后,先将状态迁移至TCP_FIN_WAIT2,原创 2020-09-19 16:38:26 · 1306 阅读 · 0 评论 -
Linux tcp sack_reneging分析
sack_reneging表示发送端之前收到的sack为虚假sack,也就是说发送端之前标记的sack,可能又被接收端丢弃了。 接收端收到乱序包后会先存放在out_of_order_queue队列里,然后等后续每次收到正常数据包后再检查乱序队列里是否有可以合并到sk_receive_queue的乱序包,当socket接收队列分配的内存(sk_rmem_alloc)超出设定的阈值(rmem_default)时,tcp会将乱序队列的数据包清空,这种场景下就需要发送端再次重传已经sack过的数据...原创 2020-08-29 22:38:04 · 688 阅读 · 0 评论 -
Linux TCP之sack(二)
上一章主要描述了sack协商过程以及接收端接收到乱序数据包后回复sack的过程,本章主要描述发送端在收到接收端回复的sack信息后的处理流程。原创 2020-08-29 17:03:42 · 737 阅读 · 0 评论 -
Linux TCP之sack(一)
SACK是接收方用来向发送方通知已经接收到哪些序列号段的一种机制,这样发送方在重传时就只需要重传接收方真正未收到的部分即可。初始化 sack提供了proc接口用来控制是否支持sack能力(/proc/sys/net/ipv4/tcp_sack),该选项默认为1,是能sack能力。 1)、发送端发送sync报文时,判断本地是否开启sack选项,如果开启,则options选项置上SACK_ADVERTISE标志 if (likely(sysctl_tcp_sack)) {...原创 2020-08-24 19:29:16 · 1319 阅读 · 0 评论 -
Linux GRO流程分析
1、概述GRO是针对报文接收方向的,是指设备链路层在接收报文处理的时候,将多个小包合并成一个大包一起上送协议栈,减少数据包在协议栈间交互的机制。可以通过ethtool -K eth0 gro on/off来打开或关闭GRO功能,GRO虽然可以提升吞吐,但同时也会带来一定是时延增加。...原创 2020-06-29 19:31:30 · 3345 阅读 · 0 评论 -
一个ixgbe空指针访问导致宿主机宕机的未知问题
1、在某个机器上出现机器宕机,通过kdump日志,初步看是因为ixgbe里有控制针访问2、使用crash分析空指针访问原因1)、安装kernel debug包(包含debug调试信息的vmlinux);2)、使用crash打开vmcore(crash /usr/lib/debug/usr/lib/modules/3.10.0-327/vmlinux /home/vmcore),先用dis命令看下RIP地址的汇编信息;从汇编指令看此时正在访问rbx寄存器;3)、从bt里看下现场信息..原创 2020-05-17 16:47:03 · 829 阅读 · 0 评论 -
Linux NAPI机制分析
1、概述在NAPI之前,网卡每收到一个包就会触发一个中断通知cpu读取数据包,当数据包比较多时,中断数过多势必影响cpu性能,因此Linux引入NAPI机制,NAPI就是在收到中断后,先将网卡收包模式切换成poll模式,等收包完成后重新进入中断模式,本节主要分析Linux的NAPI实现机制。NAPI的主要流程如下图,物理网卡收到包后触发irq中断通知cpu(触发中断后,默认disable该中断),中断上半部处理里将网卡设备的napi->poll_list加入到softnet_data->原创 2020-06-25 10:40:14 · 5120 阅读 · 0 评论 -
Linux TSO流程分析
1、TSO(transimit segment offload)是针对tcp而言的,是指协议栈可以将tcp 分段的操作offload到硬件的能力,本身需要硬件的支持。当网卡具有TSO能力时,上层协议栈可以直接下发一个超过MTU数据包,而把数据包拆分的动作交给硬件去做,节省cpu资源。除了TSO,内核还有一个GSO,GSO不区分协议类型,GSO默认是开启的,GSO是在软件上实现的一种延迟分段的技术,相比TSO,GSO最终还是需要协议栈自己完成分段的处理。即使网卡没有TSO能力,传输层依然可以封装一个超过M原创 2020-06-20 12:27:48 · 4297 阅读 · 2 评论 -
Linux tcp之sync cookie
1、常规的tcp连接里,server在收到client的sync报文后就会分配request_sock,并将其放到半连接队列里;如果server受到恶意攻击,攻击方不断的发sync包,发完就退出,这样server端的半连接队列很快就会被填满,导致无法进行正常的tcp sync请求,这也是常见的sync flood攻击。针对这种问题,新增了sync cookie功能,为了支持该功能,内核新增了一个tcp_syncookies参数,先看下内核文档对该参数的描述:tcp_syncookies - BOO原创 2020-05-17 10:58:26 · 2288 阅读 · 1 评论 -
Linux tcp连接状态之SYNC_RECV
1、按tcp/ip协议的描述,tcp三次握手过程,tcp的状态迁移如下所示:1)、客户端通过connect系统调用向处于LISTEN状态的服务端发送sync请求,客户端进入SYNC_SEND状态;2)、服务端收到sync报文后,向客户端发送sync+ack报文,服务端进入SYNC_RECV状态;3)、客户端收到sync+ack后,进入ESTABLISHED状态,并向服务端发送ack,服务端接收到ack后,进入ESTABLISHED状态。 (sys_connect)原创 2020-05-17 10:41:36 · 4832 阅读 · 0 评论 -
softnet_stat参数含义
[root@~]# cat /proc/net/softnet_stat00b231b3 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 0000000000b0375e 00000000 00000000 00000000 00000000 00000000 00000000 00000000 ...原创 2020-02-19 13:00:45 · 5396 阅读 · 0 评论 -
snat分析
1、target注册net/netfilter/xt_nat.cstatic struct xt_target xt_nat_target_reg[] __read_mostly = { { .name = "SNAT", .revision = 0, .checkentry = xt_nat_checken...原创 2020-02-09 19:20:40 · 687 阅读 · 0 评论 -
协议发送流程
tcp_sendmsg tcp_write_xmit tcp_mtu_probe(palyload checksum) tcp_transmit_skb ip_queue_xmit __sk_dst_check ipv4_dst_c...原创 2020-02-09 19:12:22 · 678 阅读 · 0 评论 -
ixgbevf驱动
ixgbevf主要数据结构 1)struct ixgbevf_adapter 描述一个vf设备对象,主要包括qvetor、tx_ring、rx_ring以及记录io地址空间、netdev等信息;struct ixgbevf_adapter { struct ixgbevf_q_vector *q_vector[MAX_MSIX_Q_VE...原创 2019-12-03 18:24:12 · 1382 阅读 · 0 评论 -
Linux netfilter
FROM: http://blog.csdn.net/beginning1126/article/details/15815339原文链接:http://www.2cto.com/Article/201206/136644.htmlhttp://www.2cto.com/Article/201206/136645.htmlhttp://os.51cto.com/ar转载 2017-12-13 19:02:32 · 313 阅读 · 0 评论 -
Linux Bridge实现
FROM https://www.cnblogs.com/zmkeil/archive/2013/04/21/3034733.html Linux下的Bridge也是一种虚拟设备,这多少和vlan有点相似,它依赖于一个或多个从设备。与VLAN不同的是,它不是虚拟出和从设备同一层次的镜像设备,而是虚拟出一个高一层次的设备,并把从设备虚拟化为端口port,且同时处转载 2017-11-15 14:54:48 · 6559 阅读 · 0 评论