tcp_data_queue_ofo 在新内核的实现中ofo队列实际上是一颗红黑树.在tcp_data_queue_ofo中根据序号,查找到合适位置,合并或者添加到rbtree中.同时设置dsack和sack,准备ack给发送方. //http://abcdxyzk.github.io/blog/2015/04/01/kernel-net-data-queue/ static void tcp_data_queue_ofo(struct sock *sk, struct sk_buff *skb…
大致的处理过程 TCP的接收流程:在tcp_v4_do_rcv中的相关处理(网卡收到报文触发)中,会首先通过tcp_check_urg设置tcp_sock的urg_data为TCP_URG_NOTYET(urgent point指向的可能不是本报文,而是后续报文或者前面收到的乱序报文),并保存最新的urgent data的sequence和对于的1 BYTE urgent data到tcp_sock的urg_data (如果之前的urgent data没有读取,就会被覆盖). 用户接收流程:在t…
概述 tcp握手完成后,收到数据包后,调用路径为tcp_v4_rcv->tcp_v4_do_rcv->tcp_rcv_established在tcp_rcv_established中处理TCP_ESTABLISHED状态的包. 并分为快速路径和慢速路径.快速路径只进行非常少量的处理. 快速路径:用于处理预期的,理想情况下的数据段,在这种情况下,不会对一些边缘情形进行检测,进而达到快速处理的目的: 慢速路径:用于处理那些非预期的,非理想情况下的数据段,即不满足快速路径的情况下数据段的处理: 首部…
概述 快速路径:用于处理预期的,理想情况下的数据段,在这种情况下,不会对一些边缘情形进行检测,进而达到快速处理的目的: 慢速路径:用于处理那些非预期的,非理想情况下的数据段,即不满足快速路径的情况下数据段的处理: 首部预测字段格式:首页预测字段,实际上是与TCP首部中的[头部长度+保留字段+标记字段+窗口值]这个32位值完全对应的:进行快速路径判断的时候,只需要将该预测值与TCP首部中的对应部分进行比对即可,具体见tcp_rcv_established: 源码分析 tcp_fast_path_c…
https://github.com/eltld/serverSpeed https://github.com/c-wind/serverSpeed https://github.com/PeterKnego/LeanEngine-Android…
在这篇文章中我们看一下server端在接收到异常数据系列时的处理,主要目的是通过wireshark示例对这些异常数据系列的处理有一个直观的认识,感兴趣的自行阅读相关代码和协议,这里不再进行详细介绍 在进行下面的测试前,首先如下设置相关的参数,其中window参数指定了到127.0.0.2的tcp连接的最大接收窗口. root@Inspiron:/home/******/tcp12# ip route change local 127.0.0.2 dev lo window 40 一.wiresh…
假设客户端执行主动打开,已经经过第一次握手,即发送SYN包到服务器,状态变为SYN_SENT,服务器收到该包后,回复SYN+ACK包,客户端收到该包,进行主动打开端的第二次握手部分:流程中涉及到的函数和细节非常多,本篇只对主流程予以分析: 在ESTABLISHED和TIME_WAIT以外的状态时接收到包,会调用tcp_rcv_state_process函数来处理,处理部根据不同状态做对应处理,如果处于SYN_SENT状态,则会调用tcp_rcv_synsent_state_process函数进入…
TCP的实现中,SACK和DSACK是比较重要的一部分. SACK和DSACK的处理部分由Ilpo Järvinen (ilpo.jarvinen@helsinki.fi) 维护. tcp_ack()处理接收到的带有ACK标志的数据段时,如果此ACK处于慢速路径,且此ACK的记分牌不为空,则调用 tcp_sacktag_write_queue()来根据SACK选项标记发送队列中skb的记分牌状态. 笔者主要分析18和37这两个版本的实现. 相对而言,18版本的逻辑清晰,但效率较低:37版本的逻辑…
主要内容:TCP的快速确认.TCP_QUICKACK选项的实现. 内核版本:3.15.2 我的博客:http://blog.csdn.net/zhangskd 快速确认模式 (1) 进入快速确认模式 设置快速确认模式标志,设置在快速确认模式中可以发送的ACK数量. static void tcp_enter_quickack_mode (struct sock *sk) { struct inet_connection_sock *icsk = inet_csk(sk); tcp_incr_qu…
不论是18版,还是37版,一开始都会从TCP的控制块中取出SACK选项的起始地址. SACK选项的起始地址是保存在tcp_skb_cb结构的sacked项中的,那么这是在什么时候做的呢? SACK块并不是总是合法的,非法的SACK块可能会引起处理错误,所以还需要进行SACK块的合法性检查. 本文主要内容:TCP首部中SACK选项的解析和地址的获取,SACK块的合法性检查. Author:zhangskd @ csdn SACK选项的地址 TCP_SKB_CB(skb)->sacked is in…