Recent Posts
-
2019-09-14
IPsec与NAT Traversal(NAT-T)
背景IPsec在两个通信实体之间建立安全的数据传输通道, 但它却与网络中广泛存在的NAT设备(以及PAT)有天生的不兼容性(incompatible)。我们以一个TCP报文为例来看看在不同IPsec的不同模式(Transport和Tunnel)和协议(AH和ESP)下,这种不兼容是如何发生的。先来看Transport模式对AH协议,由于其Authenticate范围是整个IP报文,所以如果两个IPsec之间存在NAT设备,修改了报文IP Header中的地址,就会导致接收方的Authent...
-
2019-08-29
FIB nexthop Exception是什么
理论3.6版本内核移除了FIB查询前的路由缓存,取而代之的是下一跳缓存,这在路由缓存的前世今生 中已经说过了。本文要说的是在该版本中引入的另一个概念:FIB Nexthop Exception,用于记录下一跳的例外情形。它有什么用呢?我们知道,FIB表项来源于路由配置(用户手动或者路由进程计算),说到底,它们都来源于用户空间的设置。这些表项基本是稳定的。但内核实际发包时,还有两个情况需要考虑 收到过ICMP REDIRECT报文,表示之前发送的报文绕路了,之后的报文应该修改报文的下一跳。...
-
2019-08-28
TCP的重传退避与公平
TCP在发送报文后,如果没有收到对端应答,那么在重传定时器超时后会触发重传,超时时间遵循二进制退避原则,也就是{1,2,4,8,16}这样成倍地扩大超时时间。退避是因为TCP认为丢包意味着网络有拥塞,为了不加重网络的拥塞,TCP选择等待更长的时间再进行重传。这和CSMA/CD中的二进制退避算法如出一辙。在TCP拥塞基础曾经提到过网络拥塞的来历,网络中的网络设备(路由器、交换机)在收到了超过队列限制的报文后,后续的报文会被丢弃。从TCP采用的二进制退避算来看,TCP绝对算得上是网络里的谦谦君...
-
2019-08-25
Linux 路由缓存的前世今生
3.6版本一定算得上是Linux网络子系统中一个特别的版本, 这个版本(补丁patch)移除了查找FIB之前的缓存查找。本文就来谈谈路由缓存的前世今生。几个基本概念为了让本文的阅读曲线更加平缓我决定还是将本文涉及的一些术语作个说明。路由:将skb按照规则送到该去的地方,这个地方可能是本机,也可能是局域网中的其他主机,或者更远的主机。从这个角度来说,它一个动词。那么路由发生在哪个时候呢? 我们知道路由是网络层(L3)的概念,接收方向,它需要决定收到的skb是应该上送本机还是转发,发送方向,它...
-
2019-08-17
如何学习 Linux 内核网络协议栈
部门来了新的小伙伴,领导说要让我做一个关于 Linux 内核网络协议栈的 Presentation,于是有了此文。为什么是文字而不是 PPT 呢 ? 因为我真的不喜欢 PPT !准备工作对于没有学习过 Linux 内核网络的人来说,可能会对这个它产生向往,也有可能产生恐惧。但当你深入理解并且验证后得到正反馈时,那种豁然开朗的感觉,会让你感到满足,信可乐也。回想当初自己进入这个主题时,我产生过以下疑问: Q1:内核网络子系统这么大,我应该从何处开始?会不会栽到里面就晕了? Q2:内核网络...