- 博客(12)
- 收藏
- 关注
原创 胡思乱想
我们知道机器CPU的温度过高时,机器就会运行缓慢。而我惊奇的发现,当我思维激荡时,脑袋也会开始升温,接着思维开始紊乱,必须要冷静下才能继续正常思考。 我们知道机器的虚拟存储器VM是按需调度的,当CPU需要某些虚拟页时,VM会把它们调入内存,当CPU不再需要它们的时候,VM又会把它们调出内存。这和我们的记忆何其相似?我们平时学习新知识的时候,相当于创建了若干虚拟页。当我们要用到相
2013-08-14 10:51:51 1689 1
原创 TCP的核心系列 — SACK和DSACK的实现(七)
我们发送重传包时,重传包也可能丢失,如果没有检查重传包是否丢失的机制,那么只能依靠超时来恢复了。37版本把检查重传包是否丢失的部分独立出来,这就是tcp_mark_lost_retrans()。在处理SACK块的同时,会检测是否有出现乱序,如果有乱序,那么会计算乱序的长度并更新。本文主要内容:检查重传包是否丢失,以及乱序的检测和更新。
2013-08-12 16:33:34 4540 2
原创 TCP的核心系列 — SACK和DSACK的实现(六)
上篇文章中我们主要说明如何skip到一个SACK块对应的开始段,如何walk这个SACK块包含的段,而没有涉及到如何标志一个段的记分牌。37版本把给一个段打标志的内容独立出来,这就是tcp_sacktag_one()。本文主要内容:tcp_sacktag_one(),给一个段打上标志。
2013-08-12 16:31:21 3906
原创 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 3993
原创 TCP的核心系列 — SACK和DSACK的实现(四)
和18版本不同,37版本把DSACK的检测部分独立出来,可读性更好。37版本在DSACK的处理中也做了一些优化,对DSACK的两种情况分别进行处理。本文主要内容:DSACK的检测、DSACK的处理。
2013-08-12 16:21:43 5846
原创 TCP的核心系列 — SACK和DSACK的实现(三)
不论是18版,还是37版,一开始都会从TCP的控制块中取出SACK选项的起始地址。SACK选项的起始地址是保存在tcp_skb_cb结构的sacked项中的,那么这是在什么时候做的呢?SACK块并不是总是合法的,非法的SACK块可能会引起处理错误,所以还需要进行SACK块的合法性检查。本文主要内容:TCP首部中SACK选项的解析和地址的获取,SACK块的合法性检查。
2013-08-12 16:20:30 7055 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 4982 2
原创 TCP的核心系列 — SACK和DSACK的实现(一)
TCP的实现中比较重要的一部分就是:SACK和DSACK的实现。SACK和DSACK的处理部分由Ilpo Järvinen ([email protected]) 维护。为了便于理解,笔者先后分析了18版、37版的具体实现。相对而言,18版本的逻辑清晰,但效率较低;37版本的逻辑复杂,但效率较高。
2013-08-12 16:16:35 11136 1
原创 TCP的核心系列 — 重传队列的更新和时延的采样(二)
在tcp_clean_rtx_queue()中,并非对每个ACK都进行时延采样。是否进行时延采样,跟这个ACK是否为重复的ACK、这个ACK是否确认了重传包,以及是否使用时间戳选项都有关系。本文主要内容:tcp_clean_rtx_queue()的一些细节,时延采样的条件。
2013-08-12 16:11:31 4842
原创 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 5715
原创 TCP的核心系列 — ACK的处理(一)
TCP发送数据包后,会收到对端的ACK。通过处理ACK,TCP可以进行拥塞控制和流控制,所以ACK的处理是TCP的一个重要内容。tcp_ack()用于处理接收到的ACK。本文主要内容:TCP接收ACK处理,tcp_ack()的实现。
2013-08-12 15:58:01 16126 7
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人