
TCP协议优化
文章平均质量分 87
Linux内核网络协议栈中,TCP协议的原理、实现,以及优化。
zhangskd
一路风雨,一路奔跑
展开
-
TCP的发送系列 — 发送缓存的管理(二)
主要内容:从TCP层面判断发送缓存的申请是否合法,进程因缺少发送缓存而进行睡眠等待、因为有发送缓存可写事件而被唤醒。内核版本:3.15.2上一篇blog讲述了单个Socket层面上的发送缓存管理,现在来看下整个TCP层面上的发送缓存管理。原创 2015-09-06 22:48:14 · 9166 阅读 · 7 评论 -
TCP的发送系列 — 发送缓存的管理(一)
主要内容:TCP发送缓存的管理,包括发送缓存的初始化、sock发送缓存的动态调整、sock发送缓存的申请和释放。内核版本:3.15.2。TCP对发送缓存的管理是在两个层面上进行的,一个层面是单个socket的发送缓存管理,另一个层面是整个TCP层的内存管理。先来看下单个socket的发送缓存管理。原创 2015-09-06 22:44:50 · 16590 阅读 · 7 评论 -
TCP的发送系列 — tcp_sendmsg()的实现(二)
主要内容:Socket发送函数在TCP层的实现内核版本:3.15.2我的博客:http://blog.youkuaiyun.com/zhangskd 在上篇blog中分析了tcp_sendmsg()这个主要函数的实现,现在来看下之前略过的一些细节,包括等待连接的建立、tcp_push()的实现、tcp_autocorking和数据的复制。原创 2015-09-06 22:38:36 · 8695 阅读 · 4 评论 -
TCP的发送系列 — tcp_sendmsg()的实现(一)
主要内容:Socket发送函数在TCP层的实现内核版本:3.15.2我的博客:http://blog.youkuaiyun.com/zhangskd上一篇blog讲的是send()、sendto()、sendmsg()和sendmmsg()这些发送函数的系统调用和Socket层实现,现在来看下它们的TCP层实现tcp_sendmsg()。原创 2015-09-06 22:30:13 · 15147 阅读 · 5 评论 -
TCP连接建立系列 — 客户端接收SYNACK和发送ACK
主要内容:客户端接收SYNACK、发送ACK,完成连接的建立。内核版本:3.15.2我的博客:http://blog.youkuaiyun.com/zhangskd 客户端主动建立连接时,发送SYN段后,连接的状态变为SYN_SENT。此时如果收到SYNACK段,处理函数为tcp_rcv_state_process()。原创 2015-08-15 22:47:56 · 13168 阅读 · 5 评论 -
TCP连接建立系列 — 客户端的端口选取和重用
主要内容:connect()时的端口选取和端口重用。内核版本:3.15.2我的博客:http://blog.youkuaiyun.com/zhangskd 端口选取 connect()时本地端口是如何选取的呢? 如果用户已经绑定了端口,就使用绑定的端口。如果用户没有绑定端口,则让系统自动选取,策略如下:1. 获取端口的取值区间,以及区间内端口的个数。2. 根据初始偏移量原创 2015-08-15 22:42:07 · 10400 阅读 · 2 评论 -
TCP连接建立系列 — 客户端发送SYN段
主要内容:客户端调用connect()时的TCP层实现。内核版本:3.15.2 我的博客:http://blog.youkuaiyun.com/zhangskd connect的TCP层实现 SOCK_STREAM类socket的TCP层操作函数集实例为tcp_prot,其中客户端使用tcp_v4_connect()来发送SYN段。struct proto tcp_prot = {原创 2015-08-15 22:35:23 · 6671 阅读 · 2 评论 -
TCP的ACK确认系列 — 延迟确认
主要内容:TCP的延迟确认、延迟确认定时器的实现。内核版本:3.15.2我的博客:http://blog.youkuaiyun.com/zhangskd 延迟确认模式 发送方在发送数据包时,如果发送的数据包有负载,则会检测拥塞窗口是否超时。如果超时,则会使拥塞窗口失效并重新计算拥塞窗口。如果此时距离最近接收到数据包的时间间隔足够短,说明双方处于你来我往的双向数据传输中,就原创 2015-04-19 21:41:38 · 17245 阅读 · 1 评论 -
TCP的ACK确认系列 — 快速确认
主要内容:TCP的快速确认、TCP_QUICKACK选项的实现。内核版本:3.15.2我的博客:http://blog.youkuaiyun.com/zhangskd 快速确认模式 (1) 进入快速确认模式设置快速确认模式标志,设置在快速确认模式中可以发送的ACK数量。static void tcp_enter_quickack_mode (struct sock *sk)原创 2015-04-19 21:36:39 · 16497 阅读 · 1 评论 -
TCP的ACK确认系列 — 发送状态转换机
主要内容:TCP的ACK发送方式,以及ACK发送状态转换机的实现。内核版本:3.15.2我的博客:http://blog.youkuaiyun.com/zhangskd 概述 TCP采用两种方式来发送ACK:快速确认和延迟确认。在快速确认模式中,本端接收到数据包后,会立即发送ACK给对端。在延迟确认模式中,本端接收到数据包后,不会立即发送ACK给对端,而是等待一段时间,如果在此原创 2015-04-19 21:36:07 · 16731 阅读 · 7 评论 -
TCP的定时器系列 — 零窗口探测定时器
主要内容:零窗口探测定时器的实现。内核版本:3.15.2我的博客:http://blog.youkuaiyun.com/zhangskd 出现以下情况时,TCP接收方的接收缓冲区将被塞满数据:发送方的发送速度大于接收方的接收速度。接收方的应用程序未能及时从接收缓冲区中读取数据。 当接收方的接收缓冲区满了以后,会把响应报文中的通告窗口字段置为0,从而阻止发送方的继续发送,这就原创 2015-04-05 22:19:29 · 10912 阅读 · 1 评论 -
TCP的定时器系列 — 保活定时器
主要内容:保活定时器的实现,TCP_USER_TIMEOUT选项的实现。内核版本:3.15.2我的博客:http://blog.youkuaiyun.com/zhangskd 原理 HTTP有Keepalive功能,TCP也有Keepalive功能,虽然都叫Keepalive,但是它们的目的却是不一样的。为了说明这一点,先来看下长连接和短连接的定义。 连接的“长短”是什么?原创 2015-04-05 10:35:06 · 16094 阅读 · 2 评论 -
TCP的定时器系列 — SYNACK定时器
主要内容:SYNACK定时器的实现,TCP_DEFER_ACCPET选项的实现。内核版本:3.15.2Author:zhangskd @ csdn blog 在上一篇博客中,已经连带介绍了SYNACK定时器的创建、激活和删除,所以本文直接从它的超时处理函数写起。 超时处理函数 sk->sk_timer可以同时扮演几个角色:保活定时器,SYNACK定时器,FIN_WA原创 2015-03-30 22:54:01 · 4627 阅读 · 1 评论 -
TCP的定时器系列 — 超时重传定时器
主要内容:TCP定时器开篇,超时重传定时器、ER延迟定时器、PTO定时器的实现。内核版本:3.15.2我的博客:http://blog.youkuaiyun.com/zhangskd Q:一条TCP连接会使用多少个定时器呢?A:目前的答案是9个:超时重传定时器,持续定时器,ER延迟定时器,PTO定时器,ACK延迟定时器,SYNACK定时器,保活定时器,FIN_WAIT2定时器,CL原创 2015-03-30 22:53:28 · 21328 阅读 · 4 评论 -
TCP连接建立系列 — 服务端接收ACK段(二)
本文主要分析:三次握手中最后一个ACK段到达时,服务器端的处理路径。内核版本:3.6Author:zhangskd @ csdn blog 创建新sock 协议族相关的操作函数,我们要看的是TCP/IPv4的实例ipv4_specific。const struct inet_connection_sock_af_ops ipv4_specific = { ..原创 2014-01-07 09:49:08 · 7106 阅读 · 1 评论 -
TCP连接建立系列 — 服务端接收ACK段(一)
本文主要分析:三次握手中最后一个ACK段到达时,服务器端的处理路径。内核版本:3.6Author:zhangskd @ csdn blog 接收入口 1. 状态为ESTABLISHED时,用tcp_rcv_established()接收处理。2. 状态为LISTEN时,说明这个sock处于监听状态,用于被动打开的接收处理,包括SYN和ACK。3. 当状态不为ESTA原创 2014-01-07 09:46:55 · 10923 阅读 · 5 评论 -
TCP连接建立系列 — 服务端发送SYNACK段
tcp_v4_send_synack()用于发送SYNACK段,在tcp_v4_conn_request()中被调用。首先调用tcp_make_synack()构造SYNACK段,主要是构造TCP报头和初始化skb中的一些字段。然后调用ip_build_and_send_pkt()添加IP报头后发送出去。原创 2014-01-06 18:04:36 · 6639 阅读 · 1 评论 -
TCP连接建立系列 — 服务端接收SYN段
状态为ESTABLISHED时,用tcp_rcv_established()接收处理。状态为LISTEN时,说明这个sock处于监听状态,用于被动打开的接收处理,包括SYN和ACK。当状态不为ESTABLISHED或TIME_WAIT时,用tcp_rcv_state_process()处理。经由接收入口后,主要由tcp_v4_conn_request()进行处理。原创 2014-01-06 17:34:03 · 8291 阅读 · 2 评论 -
TCP连接建立系列 — 连接请求块
连接请求块(request_sock)之于TCP三次握手,就如同sk_buff之于网络协议栈,都是核心的数据结构。 存储队列 连接请求块的存储队列,内含全连接队列、半连接队列。/** * @icsk_accept_queue: FIFO of established children */struct inet_connection_sock { ...原创 2014-01-06 17:02:02 · 7136 阅读 · 4 评论 -
TCP连接建立系列 — TCP选项解析
TCP选项解析 清零TCP选项。static inline void tcp_clear_options(struct tcp_options_received *rx_opt){ rx_opt->tstamp_ok = rx_opt->sack_ok = 0; rx_opt->wscale_ok = rx_opt->snd_wscale = 0; r原创 2014-01-06 16:59:40 · 14704 阅读 · 2 评论 -
SYN Cookie的原理和实现
SYN Cookie 判断是否使用SYN Cookie。如果SYN Cookie功能有编译进内核(CONFIG_SYN_COOKIE),且选项tcp_syncookie不为0,那么可使用SYN Cookie。同时设置SYN Flood标志(listen_opt->synflood_warned)。/* Return true if a syncookie should be sen原创 2014-01-06 16:56:15 · 53084 阅读 · 7 评论 -
使用钩子参与到TCP拥塞事件的处理中
TCP定义了几个拥塞事件,当这些事件发生时,我们可以通过TCP的拥塞控制算法,调用自定义的处理函数,来做一些额外的事情的。也就是说,我们可以很简便的参与到TCP对拥塞事件的处理过程中。原创 2013-10-09 10:40:04 · 5103 阅读 · 3 评论 -
TCP校验和的原理和实现
TCP校验和是一个端到端的校验和,由发送端计算,然后由接收端验证。其目的是为了发现TCP首部和数据在发送端到接收端之间发生的任何改动。如果接收方检测到校验和有差错,则TCP段会被悄悄丢弃。TCP校验和覆盖TCP首部和TCP数据,而IP首部中的校验和只覆盖IP的首部,不覆盖IP数据报中的任何数据。TCP的校验和是必需的,而UDP的校验和是可选的。原创 2013-09-24 18:29:58 · 94684 阅读 · 7 评论 -
Windows的TCP协议参数
本文主要介绍Windows的几个TCP协议参数,我们可以自行修改这些参数的值。这些参数为:窗口扩大因子选项、时间戳选项、SACK选项、TcpMaxDupAcks、拥塞控制算法、最大接收窗口和全局最大接收缓存。原创 2013-09-11 22:59:03 · 19729 阅读 · 2 评论 -
Exploring TCP state machine by graphs
In this article, we explore TCP state machine by graphs. TCP includes 11 states, they are:LISTENSYN_SENTSYN_RECVESTABLISHEDFIN_WAIT1CLOSE_WAITFIN_WAIT2LAST_ACKTIME_WAITCLOSEDCLOSING原创 2013-09-06 10:10:28 · 3986 阅读 · 0 评论 -
TCP的核心系列 — SACK和DSACK的实现(七)
我们发送重传包时,重传包也可能丢失,如果没有检查重传包是否丢失的机制,那么只能依靠超时来恢复了。37版本把检查重传包是否丢失的部分独立出来,这就是tcp_mark_lost_retrans()。在处理SACK块的同时,会检测是否有出现乱序,如果有乱序,那么会计算乱序的长度并更新。本文主要内容:检查重传包是否丢失,以及乱序的检测和更新。原创 2013-08-12 16:33:34 · 4611 阅读 · 2 评论 -
TCP的核心系列 — SACK和DSACK的实现(六)
上篇文章中我们主要说明如何skip到一个SACK块对应的开始段,如何walk这个SACK块包含的段,而没有涉及到如何标志一个段的记分牌。37版本把给一个段打标志的内容独立出来,这就是tcp_sacktag_one()。本文主要内容:tcp_sacktag_one(),给一个段打上标志。原创 2013-08-12 16:31:21 · 3994 阅读 · 0 评论 -
TCP的核心系列 — SACK和DSACK的实现(五)
18版本对于每个SACK块,都是从重传队列头开始遍历。37版本则可以选择性的遍历重传队列的某一部分,忽略SACK块间的间隙、或者已经cache过的部分。这主要是通过tcp_sacktag_skip()和tcp_sacktag_walk()完成的。tcp_sacktag_skip()可以直接找到包含某个序号的skb,通常用于定位SACK块的开头。tcp_sacktag_walk()则遍历两个序号之间的skb,通常用于遍历一个SACK块。原创 2013-08-12 16:29:04 · 4107 阅读 · 0 评论 -
TCP的核心系列 — SACK和DSACK的实现(四)
和18版本不同,37版本把DSACK的检测部分独立出来,可读性更好。37版本在DSACK的处理中也做了一些优化,对DSACK的两种情况分别进行处理。本文主要内容:DSACK的检测、DSACK的处理。原创 2013-08-12 16:21:43 · 6017 阅读 · 0 评论 -
TCP的核心系列 — SACK和DSACK的实现(三)
不论是18版,还是37版,一开始都会从TCP的控制块中取出SACK选项的起始地址。SACK选项的起始地址是保存在tcp_skb_cb结构的sacked项中的,那么这是在什么时候做的呢?SACK块并不是总是合法的,非法的SACK块可能会引起处理错误,所以还需要进行SACK块的合法性检查。本文主要内容:TCP首部中SACK选项的解析和地址的获取,SACK块的合法性检查。原创 2013-08-12 16:20:30 · 7160 阅读 · 1 评论 -
TCP的核心系列 — SACK和DSACK的实现(二)
37版SACK和DSACK的实现。和18版本相比,37版本的SACK和DSACK的实现做了很多改进,最明显的就是需要遍历的次数少了,减少了CPU的消耗。37版的性能提升了,代码有大幅度的改动,逻辑也更加复杂了。本文主要内容:37版tcp_sacktag_write_queue()的实现,也即37版SACK和DSACK的实现。原创 2013-08-12 16:18:13 · 5108 阅读 · 2 评论 -
TCP的核心系列 — SACK和DSACK的实现(一)
TCP的实现中比较重要的一部分就是:SACK和DSACK的实现。SACK和DSACK的处理部分由Ilpo Järvinen (ilpo.jarvinen@helsinki.fi) 维护。为了便于理解,笔者先后分析了18版、37版的具体实现。相对而言,18版本的逻辑清晰,但效率较低;37版本的逻辑复杂,但效率较高。原创 2013-08-12 16:16:35 · 11429 阅读 · 1 评论 -
TCP的核心系列 — 重传队列的更新和时延的采样(二)
在tcp_clean_rtx_queue()中,并非对每个ACK都进行时延采样。是否进行时延采样,跟这个ACK是否为重复的ACK、这个ACK是否确认了重传包,以及是否使用时间戳选项都有关系。本文主要内容:tcp_clean_rtx_queue()的一些细节,时延采样的条件。原创 2013-08-12 16:11:31 · 4940 阅读 · 0 评论 -
TCP的核心系列 — 重传队列的更新和时延的采样(一)
重传队列实际上就是发送队列(sk->sk_write_queue),保存着发送且未确认的数据段。当有新的数据段被确认时,需要把这些段从重传队列中删除,同时更新一些变量,包括packets_out、sacked_out、lost_out、retrans_out等。对于非重复的ACK,会进行RTT采样,用于更新srtt和rto等时延信息。本文主要内容:tcp_clean_rtx_queue()的实现。原创 2013-08-12 16:05:55 · 5890 阅读 · 0 评论 -
TCP的核心系列 — ACK的处理(二)
本文主要内容:tcp_ack()中的一些细节,如发送窗口的更新、持续定时器等。原创 2013-08-12 16:04:15 · 9581 阅读 · 0 评论 -
TCP的核心系列 — ACK的处理(一)
TCP发送数据包后,会收到对端的ACK。通过处理ACK,TCP可以进行拥塞控制和流控制,所以ACK的处理是TCP的一个重要内容。tcp_ack()用于处理接收到的ACK。本文主要内容:TCP接收ACK处理,tcp_ack()的实现。原创 2013-08-12 15:58:01 · 16462 阅读 · 7 评论 -
setsockopt的TCP层实现剖析
应用层 NAME setsockopt - set options on socketsSYNOPSIS #include #include int setsockopt (int s, int level, int optname, const void *optval, socklen_t optlen);EXAMPLE 自原创 2013-05-07 10:39:58 · 6200 阅读 · 0 评论 -
Internet Delay Asymmetry
Background Transmission Control Protocol (TCP) estimates the available bandwidth of the unidirectional route fromthe sender to the receiver using the round-trip time as an approximation. If the原创 2013-03-04 18:14:40 · 2099 阅读 · 0 评论 -
TCP拥塞控制算法 — CUBIC的补丁(七)
描述 以下是提交者Stephen Hemminger对这个patch的描述:limit delayed_ack ratio to prevent divide errorTCP Cubic keeps a metirc that estimates the amount of delayed acknowledgements to usein adjusting the win原创 2013-03-02 17:32:05 · 2661 阅读 · 0 评论 -
TCP拥塞控制算法 — CUBIC的补丁(六)
描述 以下是提交者Sangtae Ha对这个patch的描述:HyStart sets the initial exit point of slow start.Suppose that HyStart exits at 0.5BDP in a BDP network and no history exists.If the BDP of a network is large,原创 2013-03-02 17:31:54 · 2177 阅读 · 1 评论