摘要: 具体每种重传类型的wireshark示例解说参考前文 来自为知笔记(Wiz) 阅读全文
posted @ 2016-11-07 14:54 lshs 阅读(2586) 评论(3) 推荐(0)
摘要: 目前已经有了英文版第二版的TCPIP详解,中文版暂时还没有,但是英文版还是有好几处错误,作者和官方竟然没有维护一个勘误表。 个人阅读过程中针对TCP部分可能有问题的地方简单勘误一下 P596:示意图中最后一条TCP消息,Seq=K+1,作者写成了Seq=K。 P600:TCP同关示意图中最后一条TC 阅读全文
posted @ 2016-11-07 14:52 lshs 阅读(2094) 评论(0) 推荐(0)
摘要: 一、epoll_create & epoll_create1 SYSCALL_DEFINE1(epoll_create, int, size) sys_epoll_create->sys_epoll_create1 SYSCALL_DEFINE1(epoll_create1, int, flags) 阅读全文
posted @ 2016-11-07 14:50 lshs 阅读(2973) 评论(0) 推荐(1)
摘要: 前面我们演示分析了100+个wireshark TCP实例,拥塞控制部分也介绍常见的拥塞处理场景以及4种拥塞撤销机制,但是我们一直使用的都是reno拥塞控制算法。实际上拥塞控制发展到今天已经有了各种各样的拥塞控制算法,而且普遍认为单纯基于丢包的reno拥塞控制算法已经不适应当前internet网络了,最近谷歌又折腾出了一个BBR拥塞控制算法,对比国内,还没有一个在TCP领域有突出贡献的公司,谷歌在... 阅读全文
posted @ 2016-11-07 14:40 lshs 阅读(5303) 评论(0) 推荐(0)
摘要: 一、概述 ECN的相关内容是在RFC3168中定义的,这里我简单描述一下RFC3168涉及的主要内容。 1、AQM和RED 目前TCP中多数的拥塞控制算法都是通过缓慢增加拥塞窗口直到检测到丢包来进行慢启动的,这就会导致数据包在路由器缓存队列堆积,当路由器没有复杂的调度和缓存管理策略的时候,路由器一般 阅读全文
posted @ 2016-11-07 14:40 lshs 阅读(10373) 评论(0) 推荐(0)
摘要: 一、概述我们之前介绍过rtt、ssthresh等变量,这些变量一般在TCP连接建立的时候有个初始值,然后随着TCP的数据交互逐渐调整到适应对应的网络状态的值。但是如果每次TCP建立连接都依靠默认初始值逐渐调整,那么可能需要一段时间才能调整到合适值,这显然会降低TCP性能,对于这种场景一种优化方案就是destination metrics。RFC2140中描述,如果新建立的连接从已经关闭的连接缓存的... 阅读全文
posted @ 2016-11-07 14:37 lshs 阅读(2538) 评论(0) 推荐(0)
摘要: 利用crash工具,我们可以很方便的查看正在运行内核的一些全局变量的数据结构,如TCP的ehash、bhash哈希桶,全局变量的查看比较简单。Crash工具还允许我们查看调用堆栈内部的局部变量,下面示例查看一个进程的listen sock结构(实际上从file->private_data中查看更为方 阅读全文
posted @ 2016-11-07 14:36 lshs 阅读(1995) 评论(0) 推荐(0)
摘要: 一、概述这里主要简单分析一个丢包重传并恢复的场景,通过不同的设置让这个相同的场景分别触发RACK重传和前向重传,通过对比说明以下问题:Forward Retransmit可以产生只有重传标记的数据包,也可以产生同时具有重传标记和SACK标记的数据包,注意这里说的这些数据包是没有Lost标记的,这是前向重传与之前介绍的快速重传及其变种的差异,进而会对in_flight的统计产生影响。Recovery... 阅读全文
posted @ 2016-11-07 14:36 lshs 阅读(2647) 评论(0) 推荐(0)
摘要: 一、概述这里的重点是介绍TLP、ER与拥塞控制并不是介绍TLP和ER本身,因此TLP和ER的详细内容请翻前文。在TLP与拥塞控制的交互中有几个点需要注意1、TLP触发的重传后,TCP仍然处于Open状态,TLP重传也不会更新lost_out等状态变量,TLP重传发出的是探测报文并不是因为当前确定丢包而重传。2、TLP与ER/FACK是相互组合的,TLP触发的FACK重传与之前介绍的FACK下快速恢... 阅读全文
posted @ 2016-11-07 14:35 lshs 阅读(2371) 评论(0) 推荐(0)
摘要: 一、概述我们之前在SACK关闭场景下的拥塞撤销那篇文章中提到过Eifel探测算法(Eifel Detection Algorithm),最早在介绍DSACK和FRTO的时候我们就有提到过Eifel探测算法。Eifel探测算法是基于TSopt选项中TSV的单调非减特性设计的。简单介绍一下Linux中Eifel探测算法的实现,Linux会在TCP进行第一次重传的时候把重传数据包的TSV记录在状态变量r... 阅读全文
posted @ 2016-11-07 14:34 lshs 阅读(1744) 评论(0) 推荐(0)
摘要: 一、概述DSACK下的虚假重传的检测我们之前重传部分的文章已经介绍过了,这里简单说一下拥塞控制部分的实现。linux内部会维护一个undo_retrans状态变量,其值为已经重传的次数减掉被DSACK检测到的虚假重传的次数,例如当前总共重传了5个数据包,DSACK检测到3个虚假重传,那么undo_retrans即为2。undo_retrans初始化为-1,当发生重传的时候,如果undo_retra... 阅读全文
posted @ 2016-11-07 14:33 lshs 阅读(1811) 评论(0) 推荐(0)
摘要: 一、概述FRTO虚假超时重传检测我们之前重传章节的文章已经介绍过了,这里不再重复介绍,针对后面的示例在说明两点1、FRTO只能用于虚假超时重传的探测,不能用于虚假快速重传的探测。2、延迟ER重传触发的进入Recovery状态时候,并不会立即更新cwnd。本篇在演示FRTO的同时,还会涉及到ER超时重传、TLP探测、SACK关闭场景下的拥塞撤销,后面或者前面都会有针对这些场景的专门介绍文章。一、wi... 阅读全文
posted @ 2016-11-07 14:32 lshs 阅读(1841) 评论(0) 推荐(0)
摘要: 一、概述FACK下的重传我们在之前的重传部分已经进行了介绍,这里简单介绍一下随着FACK提出的拥塞控制算法的改进及随后的进一步改进。从我们之前介绍的RFC2582和RFC5681中可以看到,快速恢复下当探测到丢包的时候,会设置ssthresh = max (FlightSize / 2, 2*MSS)、 cwnd=ssthresh+3*MSS,随后发送端收到dup ACK的时候进行cwnd的inf... 阅读全文
posted @ 2016-11-07 14:31 lshs 阅读(4304) 评论(2) 推荐(0)
摘要: 一、概述 1、SACK下的特殊处理过程 SACK下的拥塞控制处理是linux中拥塞控制的实现依据,再次强调一遍RFC6675的重要性,linux中拥塞控制主体框架的实现是与RFC6675一致的,所以如果要理解linux中拥塞控制的实现,强烈建议看一下RFC6675。我这里给出RFC6675中SACK 阅读全文
posted @ 2016-11-07 14:31 lshs 阅读(1847) 评论(2) 推荐(0)
摘要: 一、概述这篇文章介绍一下TCP从Recovery状态恢复到Open状态的时候cwnd的更新。我们在tcp重传部分的文章中曾经介绍过虚假重传的概念,Linux在探测到虚假重传的时候就会执行拥塞撤销操作。所谓的拥塞撤销是指撤销虚假的快速重传或者RTO超时重传对拥塞窗口的影响。有多种方法可能会触发拥塞撤销如前面介绍的DSACK和FRTO以及后面要介绍的Eifel算法以及本文介绍的SACK关闭场景下的拥塞... 阅读全文
posted @ 2016-11-07 14:30 lshs 阅读(3095) 评论(0) 推荐(0)
摘要: 修改linux内核代码或者内核模块的时候,搞不好就会造成linux死机崩溃,crash死机后/var/log/kern.log里面不会有任何异常信息记录。这时候kdump就会派上用场了,网上kdump的中英文介绍资料很多,但是很多都是基于系统自带的linux进行说明的,这里记录一下在新编译的内核上使 阅读全文
posted @ 2016-11-07 14:30 lshs 阅读(6779) 评论(0) 推荐(0)
摘要: 一、概述我们之前介绍过Tahoe版本中,无论是快速重传还是RTO超时重传,都会触发乘法减小,将cwnd置为1,然后重新开始慢启动过程。在reno版本中引入快速回复,当发生快速重传的时候,就会触发快速恢复过程,但是reno中的快速恢复过程在收到partial ACK的时候就会退出。在new reno中对快速恢复进行了改进,只有当收到的ack number越过recovery point的时候,才会退... 阅读全文
posted @ 2016-11-07 14:28 lshs 阅读(5020) 评论(0) 推荐(0)
摘要: 一、概述在RFC2861中,区分了TCP连接数据传输的三种状态network-limited:TCP的数据传输受限于拥塞窗口而不能发送更多的数据application-limited:TCP的数据传输速率受限与应用层的数据写入速率,并没有到达拥塞窗口上限,有些文档也称呼这种场景为data-limitedidle:发送端没有额外的数据等待发送,当数据发送间隔超过一个RTO的时候就认为是ilde态。之... 阅读全文
posted @ 2016-11-07 14:26 lshs 阅读(3744) 评论(4) 推荐(0)
摘要: 在本篇中我们继续上一篇文章wireshark的示例讲解,上一篇介绍了一个综合示例后,本篇介绍一些简单的示例,在读本篇前建议先把上一篇读完,为了节省篇幅,本篇只针对一些特殊的场景点报文进行讲解,不会像上一篇一样对每个报文都进行讲解并随报文更新相关状态变量的值了。一、wireshark示例本篇示例的TCP测试仍然设置初始拥塞窗口为3,并关闭TSO、GSO等功能。同时设置wireshark使其不在inf... 阅读全文
posted @ 2016-11-07 14:24 lshs 阅读(2868) 评论(5) 推荐(0)
摘要: 一、Linux中的慢启动和拥塞避免 Linux中采用了Google论文的建议把IW初始化成了10了。在linux中一般有三种场景会触发慢启动过程1、连接初始建立发送数据的时候,此时cwnd初始化为10,ssthresh初始化为0x7fffffff,因此会触发慢启动。但是当路由表中有对应的设置的时候,cwnd和ssthresh会被路由表中的设置的值覆盖,有可能连接建立后直接进入拥塞避免阶... 阅读全文
posted @ 2016-11-07 14:22 lshs 阅读(4646) 评论(0) 推荐(0)
摘要: 本篇中先介绍一下慢启动和拥塞避免的大概过程,下一篇中将会给出多个linux下reno拥塞控制算法的wireshark示例,并详细解释慢启动和拥塞避免的过程。一、慢启动(slow start) 一个TCP连接启动的时候并不知道cwnd应该取多大的值适合当前的网络状况,因此TCP发送方会从一个较小的初始值指数抬升cwnd到某一个值,这个cwnd抬升的过程就叫做慢启动。除了初始建立tcp连... 阅读全文
posted @ 2016-11-07 14:21 lshs 阅读(12551) 评论(4) 推荐(1)
摘要: 一、拥塞控制的相关算法 早期的TCP协议只有基于窗口的流控(flow control)机制而没有拥塞控制机制,因而易导致网络拥塞。1988年Jacobson针对TCP在网络拥塞控制方面的不足,提出了“慢启动(Slow Start)”和“拥塞避免(Congestion Avoidance)”算法。1990年Jacobson又做了两个修正。在这二十来年的发展过程中,与拥塞控制相关的有四个... 阅读全文
posted @ 2016-11-07 14:18 lshs 阅读(5611) 评论(0) 推荐(0)
摘要: 一、拥塞控制(Congestion Control)背景 TCP协议一开始是没有拥塞控制的,但是在1986年10月,美国的NSFnet骨干网的速率由于负载过重(拥塞)导致实际速率下降为预期速率的千分之一,严重降低了网络性能。NSFnet是当时Internet的重要组成部分,为了避免拥塞或者有效的减轻 阅读全文
posted @ 2016-11-07 14:15 lshs 阅读(2714) 评论(0) 推荐(0)
摘要: linux内核源码Documentation目录下存在kprobe介绍文档如下 Kprobes allows multiple probes at the same address. Currently, however, there cannot be multiple jprobes on th 阅读全文
posted @ 2016-11-07 14:14 lshs 阅读(1139) 评论(0) 推荐(0)
摘要: 一、TCP存活(keepalive)检测的背景 对于TCP设计来说,如果一个客户端和服务器端建立连接后,不在进行数据传输,那么这个连接将会一直存在下去,理论上即使中间的路由器崩溃重启、或者中间的网络线路拔掉在插上等等,只要客户端和服务器端的主机没有发生异常,这个TCP连接仍然是处于连接状态的。这样会有两个问题1、服务器端可能需要内存等资源保存每个连接的状态信息,即使这个连接在实际上已... 阅读全文
posted @ 2016-11-07 14:10 lshs 阅读(4881) 评论(0) 推荐(1)
摘要: 在这篇文章中我们看一下server端在接收到异常数据系列时的处理,主要目的是通过wireshark示例对这些异常数据系列的处理有一个直观的认识,感兴趣的自行阅读相关代码和协议,这里不再进行详细介绍在进行下面的测试前,首先如下设置相关的参数,其中window参数指定了到127.0.0.2的tcp连接的最大接收窗口。root@Inspiron:/home/******/tcp12# ip route ... 阅读全文
posted @ 2016-11-07 14:09 lshs 阅读(1578) 评论(0) 推荐(0)
摘要: 一、概述 我们在最开始介绍TCP头结构的时候,里面有个URG的标志位,还有一个Urgent Pointer的16bits字段。当URG标志位有效的时候,Urgent Poinert用来指示紧急数据的相对于TCP头中系列号Seq的位置,系列号和紧急指针值的和我们称呼为退出点(exit point)。应用程序写入数据的时候可以通过MSG_OOB的socket选项来指定紧急数据。实际上因为... 阅读全文
posted @ 2016-11-07 14:08 lshs 阅读(1706) 评论(0) 推荐(0)
摘要: 1、第一个终端运行nesttest,nesttest首先fork一个子进程,然后父进程退出,子进程首先打开一个txt普通文件对应fd为3,然后创建一个epfd,对应fd为4 lybxin@Inspiron:~/MyRes/LNP/tcp/epolltest$./nesttest& [1]29274 阅读全文
posted @ 2016-11-07 14:08 lshs 阅读(407) 评论(0) 推荐(0)
摘要: 一、概述我们之前介绍过一种具有大的带宽时延乘积(band-delay product、BDP)的网络,这种网络称为长肥网络(LongFatNetwork,即LFN)。我们想象一种简单的场景,假设发送端的发送窗口为5000bytes,网络的RTT为200ms,那么每秒的最大速率则为5000*(1000/200)=25000bytes/s,这大约为24kb/s,可以看到这个速率是非常低的,这就是TCP... 阅读全文
posted @ 2016-11-07 14:07 lshs 阅读(2641) 评论(0) 推荐(0)
摘要: 一、SWS介绍 前面我们已经通过示例看到如果接收端的应用层一直没有读取数据,那么window size就会慢慢变小最终可能变为0,此时我们假设一种场景,如果应用层读取少量数据(比如十几bytes),接收端TCP有了少量的新的接收缓存后如果立即进行window update把新的window size通告发送端的话,发送端如果立即发送数据,那么接收端缓存可能又会立即耗尽,window ... 阅读全文
posted @ 2016-11-07 14:06 lshs 阅读(2559) 评论(0) 推荐(0)
摘要: 一、简介 我们之前介绍过,TCP报文中的window size表示发出这个报文的一端准备多少bytes的数据,当TCP的一端一直接收数据,但是应用层没有及时读取的话,数据一直在TCP模块中缓存,最终受限于接收缓存的大小,window size会变为0,此时我们称呼这个接收窗口为零窗(zero window),对端也不能在发送更多的数据。如果随后本端应用层从TCP接收缓存中读取了足够数... 阅读全文
posted @ 2016-11-07 14:05 lshs 阅读(14801) 评论(3) 推荐(4)
摘要: 一、TCP流控 之前我们介绍过TCP是基于窗口的流量控制,在TCP的发送端会维持一个发送窗口,我们假设发送窗口的大小为N比特,网络环回时延为RTT,那么在网络状况良好没有发生拥塞的情况下,发送端每个RTT就可以发送N比特的数据,发送端的速率应该与N/RTT成正比,因此通过改变发送窗口的大小就可以控制 阅读全文
posted @ 2016-11-07 14:05 lshs 阅读(4258) 评论(0) 推荐(0)
摘要: 一、Cork算法概述Cork算法与Nagle算法类似,也有人把Cork算法称呼为super-Nagle。Nagle算法提出的背景是网络因为大量小包小包而导致利用率低下产生网络拥塞,网络发生拥塞的时候性能还会进一步下降,因此Nagle算法通过ACK确认包来触发新数据包的发送(ACK确认包意味着对端已经接收到了一个数据包,即有一个数据包已经离开中间网络,此时可以在向中间网络注入一个数据包块,这称呼为s... 阅读全文
posted @ 2016-11-07 14:04 lshs 阅读(2270) 评论(0) 推荐(0)
摘要: 一、Nagle算法概述之前我们介绍过,有一些交互式应用会传递大量的小包(称呼为tinygrams),这些小包的负载可能只有几个bytes,但是TCP和IP的基本头就有40bytes,如果大量传递这种小包,会严重降低网络利用率,还可能造成网络拥塞。福特公司就曾经遇到过这种问题,John Nagle提出了一种通过ACK报文控制TCP发包的方法解决了这种问题,这种方法也就以Nagle名字命名,称为Nag... 阅读全文
posted @ 2016-11-07 14:03 lshs 阅读(3543) 评论(1) 推荐(0)
摘要: 一、简介之前的内容中我们多次提到延迟ACK(Delayed Ack),延迟ACK是在RFC1122协议中定义的,协议指出,一个TCP实现应该实现延迟ACK,但是ACK不能被过度延迟,协议给出延迟ACK的最大时间为0.5s。如果发送端连续发送最大的数据报文,那么没两个数据报文就需要回复一次ACK。延迟ACK主要目的是等待接收者应用层接收到数据处理后有可能会发送一个响应,这样ACK报文就可以和这个响应... 阅读全文
posted @ 2016-11-07 14:02 lshs 阅读(5418) 评论(2) 推荐(2)
摘要: 在前面的内容中我们依次介绍了TCP的连接建立和终止过程和TCP的各种重传方式。接着我们在这部分首先关注交互式应用TCP连接相关内容如延迟ACK、Nagle算法、Cork算法等,接着我们引入流控机制(flow control)和关联的窗口管理(window management)过程。在开篇之前我们先介绍几个相关的概念。交互式TCP连接(interactive TCP connection):交互式... 阅读全文
posted @ 2016-11-07 14:01 lshs 阅读(1781) 评论(0) 推荐(0)
摘要: nstat TcpExtIPReversePathFilter for i in /proc/sys/net/ipv4/conf/*/rp_filter ; do > echo 0 > $i > done 来自为知笔记(Wiz) 阅读全文
posted @ 2016-11-07 14:01 lshs 阅读(516) 评论(0) 推荐(0)
摘要: 一、介绍在TCP重传的时候,并没有限制TCP只能重传与初传完全相同的报文段大小,TCP允许执行重组包(repacketization),发送一个更大的TCP报文段,进而增加性能。TCP在重传时候允许重组包同时提供了一种判别虚假重传的方法。在linux中参数/proc/sys/net/ipv4/tcp_retrans_collapse为非0值的时候打开重传重组包功能,为0的时候关闭重传重组包功能。二... 阅读全文
posted @ 2016-11-07 14:00 lshs 阅读(3225) 评论(0) 推荐(0)
摘要: 一、DSACK介绍RFC2883通过指定使用SACK来指示接收端的重复包(duplicate packet)扩展了RFC2018对SACK选项的定义(SACK选项的介绍和示例参考前面内容)。RFC2883建议在收到重复报文的时候,SACK选项的第一个块(这个块也叫做DSACK块)可以用来传递触发这个ACK确认包的系列号,这个就是DSACK(duplicate-SACK)功能。这样允许TCP发送端根... 阅读全文
posted @ 2016-11-07 13:59 lshs 阅读(4724) 评论(0) 推荐(2)
摘要: 一、虚假重传在一些情况下,TCP可能会在没有数据丢失的情况下初始化一个重传,这种重传就叫做虚假重传(Spurious retransmission)。发生虚假重传的原因可能是包传输中重排序、传输中发生包复制、ACK确认包传输中丢失等等。如果由于链路时延变化或者负载变化等因素导致RTT突然变大等原因,TCP的发送端可能还没收到ACK确认包就已经RTO超时而触发重传,这种重传就叫做虚假超时重传(Spu... 阅读全文
posted @ 2016-11-07 13:58 lshs 阅读(9736) 评论(2) 推荐(0)
摘要: 一、概述 forward retransmit相关的内容在RFC6675中有描述,可以参考RFC6675 section 4中NextSeg ()的定义。forward retransmit中文名可以叫做前向重传,我这里简单说一下linux实现上的前向重传 在快速重传(包括快速重传的各种变种)到达R 阅读全文
posted @ 2016-11-07 13:56 lshs 阅读(2136) 评论(0) 推荐(1)
摘要: 一、RACK概述RACK(Recent ACKnowledgment)是一种新的基于时间的丢包探测算法,RACK的目的是取代传统的基于dupthresh门限的各种快速重传及其变种。前面介绍的各种基于dup ACK的快速重传算法及其变种通过修改dupthresh门限等手段,有些可以迅速的探测到丢包,有些可以精确的探测丢包,但是没有能同时达到迅速和精确两个目标的算法。RACK基本思想:如果发送端收到的... 阅读全文
posted @ 2016-11-07 13:56 lshs 阅读(6940) 评论(0) 推荐(0)
摘要: 一、介绍Tail Loss Probe (TLP)是同样是一个发送端算法,主要目的是使用快速重传取代RTO超时重传来处理尾包丢失场景。在一些WEB业务中,如果TCP尾包丢失,如果依靠RTO超时进行重传会带来比较大的延迟,进而影响用户体验。如果一个TCP连接没有在一段时间内没有收到ACK报文,TLP会强制传输还没有收到ACK确认的报文里面的最后一个报文或者未发送的新报文(传输的这个报文就叫做loss... 阅读全文
posted @ 2016-11-07 13:55 lshs 阅读(5882) 评论(0) 推荐(0)
摘要: 一、介绍在前面介绍thin stream时候我们介绍过有两种场景下可能不会产生足够的dup ACK来触发快速重传,一种是游戏类响应交互式tcp传输,另外一种是传输受到拥塞控制的限制,只能发送少量TCP报文.针对这种场景提出了一个快速重传的改进算法即早期重传(early retransmit,简称ER)。按照RFC5827,ER有两种形式一种是基于字节的,一种是基于包的,基于包的ER精度要高于基于字... 阅读全文
posted @ 2016-11-07 13:54 lshs 阅读(5371) 评论(0) 推荐(1)
摘要: 一、介绍当TCP连续大量的发送数据的时候,当出现丢包的时候可以有足够的dup ACK来触发快速重传。但是internet上还有大量的交互式服务,这类服务一般都是由小包组成,而且一次操作中需要传输的数据包一般比较少,比如在线游戏、股票交易等,这一类数据流我们就称呼为thin stream。在一次交互式操作触发一次TCP传输的时候,如果传输的这个数据包发生丢包,很可能后面没有足够的dup ACK来触发... 阅读全文
posted @ 2016-11-07 13:53 lshs 阅读(3549) 评论(0) 推荐(2)
摘要: 一、介绍 FACK的全称是forward acknowledgement,FACK通过记录SACK块中系列号最大(forward-most)的SACK块来推测丢包信息,在linux中使用fackets_out这个状态变量来记录FACK信息。我们之前介绍SACK重传时候说过在SACK下需要3个dup 阅读全文
posted @ 2016-11-07 13:53 lshs 阅读(7105) 评论(0) 推荐(1)
摘要: 我们之前介绍SACK选项的时候说过,SACK可以把接收端系列号空间的洞反映给发送端,因此发送端可以更充分的理解接收端的情况,而进行更好的重传恢复过程。这种过程有时候也叫做advanced loss recovery。 一、数据接收端SACK行为 我们通过一个wireshark示例来说明接收端的SAC 阅读全文
posted @ 2016-11-07 13:51 lshs 阅读(11098) 评论(20) 推荐(6)
摘要: 一、快速重传介绍 按照TCP协议,RTO超时重传是一个非常重要的事件,当RTO超时的时候,TCP会同时通过两种方式非常谨慎的降低发送数据包的速率,一种是基于拥塞控制削减发送窗口的大小,另外一个是通过指数回退增加每次RTO超时的时间(即karn算法的第二部分)。所以RTO超时后有可能会导致网络容量的利 阅读全文
posted @ 2016-11-07 13:51 lshs 阅读(14204) 评论(0) 推荐(1)
摘要: 之前我们介绍的都是协议中给出的RTO计算方法,下面我们看一下linux实现中RTO的计算方法。在linux中维护了srtt、mdev、mdev_max、rttvar、rtt_seq几个状态变量用来计算RTO,其中linux实现中的mdev变量相当于协议中的RTTVAR变量。rtt_seq状态变量用来控制一个RTT时间窗,linux在一个RTT时间窗内部更新状态变量的方式与RTT时间窗结束更新状态变... 阅读全文
posted @ 2016-11-07 13:50 lshs 阅读(4729) 评论(2) 推荐(0)
摘要: 1、查看是否打开了coredump lybxin@Inspiron:~/MyRes/miscellany/test/01_coredump$ulimit -c #这里可以看到ulimit限制coredump的产生 0 lybxin@Inspiron:~/MyRes/miscellany/test/0 阅读全文
posted @ 2016-11-07 13:50 lshs 阅读(2516) 评论(0) 推荐(0)
摘要: 一、Karn算法 在RTT采样测量过程中,如果一个数据包初传后,RTO超时重传,接着收到这个数据包的ACK报文,那么这个ACK报文是对应初传TCP报文还是对应重传TCP报文呢?这个问题就是retransmission ambiguity problem。当没有使用TSOPT选项,单纯的ACK报文并不 阅读全文
posted @ 2016-11-07 13:48 lshs 阅读(5719) 评论(4) 推荐(1)
摘要: 从上一篇示例中我们可以看到在TCP中有一个重要的过程就是决定何时进行超时重传,也就是RTO的计算更新。由于网络状况可能会受到路由变化、网络负载等因素的影响,因此RTO也必须跟随网络状况动态更新。如果TCP过早重传,则可能会向网络中注入很多重复报文,如果过晚重传,则在丢包时候则会影响滑窗前行可能会降低 阅读全文
posted @ 2016-11-07 13:48 lshs 阅读(8289) 评论(1) 推荐(1)
摘要: 在前面我们概述了TCP的超时重传之后我们简单的看一下tcp超时重传的示例。首先简单的描述一下测试过程1、设置/proc/sys/net/ipv4/tcp_early_retrans为2,关掉TLP功能(后面内容介绍TLP)。设置/proc/sys/net/ipv4/tcp_retries2为8,减少重传次数,这样方便wireshark抓包演示。同时设置/proc/sys/net/i... 阅读全文
posted @ 2016-11-07 13:47 lshs 阅读(11164) 评论(4) 推荐(0)
摘要: 在最开始介绍TCP的时候,我们就介绍了TCP的三个特点,分别是面向连接、可靠、字节流式。前面内容我们已经介绍过了TCP的连接管理,接下来的这部分内容将会介绍与TCP可靠性强关联的TCP重传。 很多网络协议都提供了checksum或者CRC手段来检测收到的数据包是否发生错误,但是检测到数据包错误后很多协议都不会进行重传等操作来可靠的修复错误。例如常见的IP和UDP协议完... 阅读全文
posted @ 2016-11-07 13:45 lshs 阅读(5893) 评论(1) 推荐(1)
摘要: 这部分内容涉及较多linux实现,可以跳过。一、listen系统调用对backlog的处理当socket处于LISTEN或者CLOSED状态时,fastopen队列的长度可以通过TCP_FASTOPEN选项进行设置。对于listen的入参backlog,内核会限制backlog=min(backlog,/proc/sys/net/core/somaxconn)如果当前打开了TFO的server端开... 阅读全文
posted @ 2016-11-07 13:44 lshs 阅读(3430) 评论(2) 推荐(0)
摘要: 整理自man 8 crash 1、简介 Crash工具可以用来分析一个正在运行的内核,也可以用来分析一个内核的crash dump文件,这里说的是内核代码异常产生的crash dump文件,不是应用层程序运行异常产生的core dump文件,它支持分析由netdump, diskdump, LKCD 阅读全文
posted @ 2016-11-07 13:43 lshs 阅读(6241) 评论(0) 推荐(0)
摘要: 我们在介绍TCP头的时候,提到过其中有个RST标志位。当一个TCP报文中这个标志位打开的时候,我们叫做reset包(严格的说应该叫做reset段,但是很多时候段包帧并不加以区分)或者简单称呼为reset、RST。通常reset的产生是由于一个异常包导致,reset一般会导致TCP连接的快速断开。产生reset的几种常见的情形如下向一个未打开的端口发送连接请求应用程序主动终止一个连接... 阅读全文
posted @ 2016-11-07 13:42 lshs 阅读(6813) 评论(3) 推荐(2)
摘要: 一、TCP选项概述 在前面介绍TCP头的时候,我们说过tcp基本头下面可以带有tcp选项,其中有些选项只能在连接过程中随着SYN包发送,有些可以延后。下表汇总了一些tcp选项其中我标记为红色的部分是常见的TCP选项,我们仅针对这些红色的TCP选项进行介绍(主要是非红色的我也不太了解~~~),另外RFC1323已经被RFC7323取代,这里给出的是TCP选项原始定义的RFC ... 阅读全文
posted @ 2016-11-07 13:41 lshs 阅读(13869) 评论(3) 推荐(3)
摘要: 经过前面对TCP连接管理的介绍,我们本小节通过TCP连接管理的状态机来总结一下看看TCP连接的状态变化一、TCP状态机整体状态转换图(截取自第二版TCPIP详解)二、TCP连接建立和终止过程中状态迁移总结下面我们总结一下前面介绍过的连接建立方式和终止过程中client端和server端的状态切换1、三次握手client:CLOSED -> SYN_SENT -> ESTABLISH... 阅读全文
posted @ 2016-11-07 13:40 lshs 阅读(2589) 评论(0) 推荐(0)
摘要: 一、TFO背景 当前web和web-like应用中一般都是在三次握手后开始数据传输,相比于UDP,多了一个RTT的时延,即使当前很多应用使用长连接来处理这种情况,但是仍然由一定比例的短连接,这额外多出的一个RTT仍然对应用的时延有非常大的影响。TFO就是在这种背景下面提出来的。 TFO(TCP fast open)是TCP协议的experimental update,它... 阅读全文
posted @ 2016-11-07 13:39 lshs 阅读(6907) 评论(2) 推荐(0)
摘要: 一、TCP连接的ISN 之前我们说过初始建立TCP连接的时候的系列号(ISN)是随机选择的,那么这个系列号为什么不采用一个固定的值呢?主要有两方面的原因防止同一个连接的不同实例(different instantiations/incarnations of the same connection)的数据包混淆。同一个连接的不同实例是怎么回事呢?之前我们说过(源IP、源端口号、目的地... 阅读全文
posted @ 2016-11-07 13:35 lshs 阅读(4770) 评论(0) 推荐(0)
摘要: 在前面部分我们我们分别介绍了三次握手、四次挥手、同时打开和同时关闭,TCP连接还有两种场景分别是半打开(Half-Open)连接和半关闭(Half-Close)连接。TCP是一个全双工(Full-Duplex)协议,因此这里的半连接"半"字就是相对于全双工的"全"来说的。一、半开连接 从协议定义的角度来说,TCP的半开连接是指TCP连接的一端异常崩溃,或者在未通知对端... 阅读全文
posted @ 2016-11-07 13:34 lshs 阅读(7488) 评论(0) 推荐(0)
摘要: 在前面的内容中我们介绍了TCP连接管理中最常见的三次握手方式和四次挥手的方式。但是有可能A和B两端同时执行主动打开并连接对方或者同时执行主动关闭连接(尽管发生这种情况的可能性比较低低),这个时候的流程就略有不同了。下面我们分别对同时打开(simultaneous open)连接和同时关闭(simultaneous)连接这两种情况分别进行介绍。一、同时打开连接 同时打开... 阅读全文
posted @ 2016-11-07 13:33 lshs 阅读(5871) 评论(15) 推荐(0)
摘要: 1、socket SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol) sys_socket->sock_create->__sock_create(入参有效性校验)->sock_alloc(申请分配新的inode,初始化ino 阅读全文
posted @ 2016-11-07 13:32 lshs 阅读(3038) 评论(0) 推荐(1)
摘要: 一、SYN报文处理: 公共部分:tcp_v4_rcv->tcp_v4_do_rcv->tcp_v4_cookie_check(无处理动作)->tcp_rcv_state_process->tcp_v4_conn_request[conn_request]->tcp_conn_request(传入两个 阅读全文
posted @ 2016-11-07 13:31 lshs 阅读(3848) 评论(1) 推荐(0)
摘要: 一、TCP连接管理概述 正如我们在之前所说TCP是一个面向连接的通信协议,因此在进行数据传输前一般需要先建立连接(TFO除外),因此我们首先来介绍TCP的连接管理。 通常一次完整的TCP数据传输一般包含三个阶段,分别是连接建立(setup)、数据传输(established)和连接释放(teardo 阅读全文
posted @ 2016-11-07 13:29 lshs 阅读(3637) 评论(0) 推荐(0)
摘要: 一、TCP简单介绍 我们经常听人说TCP是一个面向连接的(connection-oriented)、可靠的(reliable)、字节流式(byte stream)传输协议, TCP的这三个特性该怎么理解呢? <!--more--> 面向连接:在应用TCP协议进行通信之前双方通常需要通过三次握手来建立 阅读全文
posted @ 2016-11-07 13:28 lshs 阅读(29770) 评论(10) 推荐(2)