TCP协议栈
187J3X1
这个作者很懒,什么都没留下…
展开
-
mTCP:一款面向多核系统的用户态网络协议栈
mTCP 是一款面向多核系统的用户态网络协议栈内核态协议栈的缺陷互联网的发展,使得用户对网络应用的性能需求越来越高。人们不断挖掘CPU处理能力加强,添加核的数量,但这并没有使得网络设备的吞吐率线性增加,其中一个原因是内核协议栈成为了限制网络性能提升的瓶颈。互斥上锁引起的开销互斥上锁是多核平台性能的第一杀手。现在的服务器端应用为了尽可能的实现高并发,通常都是采用多线程的方式监听客户端对服...原创 2019-05-26 10:35:10 · 1795 阅读 · 1 评论 -
TCP的重传退避与公平
TCP在发送报文后,如果没有收到对端应答,那么在重传定时器超时后会触发重传,超时时间遵循二进制退避原则,也就是**{1,2,4,8,16}这样成倍地扩大超时时间。退避是因为TCP认为丢包意味着网络有拥塞,为了不加重网络的拥塞,TCP选择等待更长的时间再进行重传。这和CSMA/CD**中的二进制退避算法如出一辙。在链接曾经提到过网络拥塞的来历,网络中的网络设备(路由器、交换机)在收到了超过队列限...原创 2019-09-30 21:28:11 · 1371 阅读 · 0 评论 -
IPsec与NAT Traversal(NAT-T)
背景IPsec在两个通信实体之间建立安全的数据传输通道, 但它却与网络中广泛存在的NAT设备(以及PAT)有天生的不兼容性(incompatible)。我们以一个TCP报文为例来看看在不同IPsec的不同模式(Transport和Tunnel)和协议(AH和ESP)下,这种不兼容是如何发生的。先来看Transport模式对AH协议,由于其Authenticate范围是整个IP报文,所以...原创 2019-09-30 21:37:50 · 2890 阅读 · 0 评论 -
XFRM -- IPsec协议的内核实现框架
IPsec协议帮助IP层建立安全可信的数据包传输通道。当前已经有了如StrongSwan、OpenSwan等比较成熟的解决方案,而它们都使用了Linux内核中的XFRM框架进行报文接收发送。XFRM的正确读音是transform(转换), 这表示内核协议栈收到的IPsec报文需要经过转换才能还原为原始报文;同样地,要发送的原始报文也需要转换为IPsec报文才能发送出去。OverviewX...原创 2019-09-30 21:39:14 · 3376 阅读 · 0 评论 -
隧道而言, TCP-In-TCP会发生什么
上周晚上在家中,当我搭起熟悉的ss梯子时, 发现不可用了T.T。登陆到控制台查看,发现国内的IP被Block了。昨天瞎逛,看到一个开源项目:udp2raw-tunnel,他实现的是将一个IP报文伪装成TCP报文,目的是穿过网络中UDP防火墙.哈?!这难道是TCP-In-TCP? 这玩意儿不是不可用吗?很早以前就有人说过了:Why TCP Over TCP Is A Bad Idea为了...原创 2019-09-30 21:41:33 · 644 阅读 · 0 评论 -
Linux内核中的udp隧道框架
起源TCP虽然能保证传输的可靠性,但其繁琐的状态机以及复杂的拥塞控制机制让它难以作为隧道报文的外层封装,详见TCP-in-TCP。相对而言,UDP就没这个困扰了,丢包的事情交给应用层处理就行。因而,不少隧道协议都是将UDP作为外层报文的方案。自然而然,与网络发展联系紧密的Linux内核也开始支持这些隧道协议,较新的内核已经支持fou、l2tp、vxlan、tipc、geneve等UDP隧道协议...原创 2019-09-30 21:42:01 · 1110 阅读 · 0 评论 -
Linux内核TCP Metrics框架
TCP是一个复杂的协议,这种复杂来源于对报文传输的可靠性承诺。对每条TCP连接来说,除了有独立的状态机、定时器之外,还有拥塞控制相关的一些运行变量,比如RTT、CWND、SSTHRESH等,这些运行参数同样也是每连接(Per-Connection)的Per-Connection意味着每条连接的这些参数互不影响,这是理所应当的!但是,想想这个情景:A与B之间已经建立了一条稳定的TCP连接,此时若新...原创 2019-09-30 21:42:38 · 668 阅读 · 0 评论 -
TCP Metrics--remove per-destination timestamp cache
2017年3月,内核主线将TCP Metrics表项中的时间戳缓存,补丁详见patch—tcp: remove per-destination timestamp cache struct tcp_metrics_block { struct inetpeer_addr tcpm_saddr; struct inetpeer_addr tcpm_daddr; unsigned l...原创 2019-09-30 21:43:17 · 311 阅读 · 0 评论 -
Linux内核中reuseport的演进
SO_REUSEPORT选项在Linux 3.9被引入内核,在这之前也有一个很像的选项SO_REUSEADDR。如果你不太清楚这两者的区别和联系,建议阅读How do SO_REUSEADDR and SO_REUSEPORT differ?。如果不想读,那么下面这一节算是为懒人准备的。SO_REUSEADDR 与 SO_REUSEPORT 是什么?TCP/UDP用五元组唯一标识一个连接。任...原创 2019-09-30 21:44:20 · 1242 阅读 · 0 评论 -
Linux 路由缓存的前世今生
3.6版本一定算得上是Linux网络子系统中一个特别的版本, 这个版本(补丁patch)移除了查找FIB之前的缓存查找。本文就来谈谈路由缓存的前世今生。几个基本概念为了让本文的阅读曲线更加平缓我决定还是将本文涉及的一些术语作个说明。路由:将skb按照规则送到该去的地方,这个地方可能是本机,也可能是局域网中的其他主机,或者更远的主机。从这个角度来说,它一个动词。那么路由发生在哪个时候呢? 我...原创 2019-09-30 21:26:18 · 489 阅读 · 0 评论 -
inet socket 与 packet socket
[外链图片转存失败(img-jGyWSBRz-1569142979995)(https://s2.ax1x.com/2019/08/17/muuRUg.png)]调试过网络程序的人大多使用过tcpdump,但你知道tcpdump是如何工作的吗?tcpdump这类工具也被称为Sniffer,它可以在不影响应用程序正常报文的情况下,将流经网卡的报文呈现给用户。本文不分析tcpdump的具体实现,...原创 2019-09-22 17:03:27 · 1136 阅读 · 0 评论 -
TCP拥塞控制基础
TCP要点有四,一曰有连接,二曰可靠传输,三曰数据按照到达,四曰端到端流量控制。注意,TCP被设计时只保证这四点,此时它虽然也有些问题,然而很简单,然而更大的问题很快呈现出来,使之不得不考虑和IP网络相关的东西,比如公平性,效率,因此增加了拥塞控制,这样TCP就成了现在这个样子。为什么要进行拥塞控制要回答这个问题,首先必须知道什么时候TCP会出现拥塞。TCP作为一个端到端的传输层协议,它并...原创 2019-05-26 10:42:55 · 351 阅读 · 0 评论 -
packetdrill:测试TCP协议栈行为的利器
`packetdrill`是一个非常有用的用于测试网络协议栈的工具,由`Google`开发,它常用于对网络协议栈进行回归测试,确保新的功能不会影响原有功能。本文主要介绍其基本原理、安装、入门、测试脚本的编写方法。原创 2019-05-26 10:45:34 · 1099 阅读 · 0 评论 -
神奇的backlog参数对TCP连接建立的影响
曾经有人问我套接字编程中listen的第二个参数backlog是什么意思?多大的值合适?我不假思索地回答它表示服务器可以接受的并发请求的最大值。然而事实真的是这样的吗?TCP通过三次握手建立连接的过程应该都不陌生了。从服务器的角度看,它分为以下几步将TCP状态设置为LISTEN状态,开启监听客户端的连接请求收到客户端发送的SYN报文后,TCP状态切换为SYN RECEIVED,并发送...原创 2019-05-26 10:49:17 · 1061 阅读 · 0 评论 -
深入浅出TCP中的SYN-Cookies
本文渐进地介绍TCP中的syn-cookie技术,包括其由来、原理、实例测试。SYN Flood 攻击TCP连接建立时,客户端通过发送SYN报文发起向处于监听状态的服务器发起连接,服务器为该连接分配一定的资源,并发送SYN+ACK报文。对服务器来说,此时该连接的状态称为半连接(Half-Open),而当其之后收到客户端回复的ACK报文后,连接才算建立完成。在这个过程中,如果服务器一直没有...原创 2019-05-26 10:54:16 · 3954 阅读 · 0 评论 -
通俗理解IP路由
日常工作环境中,我们习惯于使用ping去测试网络的连通性。如果ping不通,我们往往会去怀疑是不是路由配置错了。路由是什么我们知道,IP地址是网络世界里的门牌号。你可以通过IP地址访问远在天边的网站,那么数据是如何到达网站的呢?靠的就是路径上每个节点的路由。路由,简单的说就是指导IP报文该去哪的指示牌。一般说来,主机会在以下两个时机进行路由查询收到报文时,查询路由决定是上送本机...原创 2019-09-22 16:53:17 · 1754 阅读 · 0 评论 -
TAILQ 之一二事
TAILQ队列是FreeBSD内核中的一种队列数据结构,在一些著名的开源库中(如DPDK,libevent)有广泛的应用。TAILQ队列的定义TAILQ队列有HEAD和ENTRY两种基本的数据结构#define TAILQ_HEAD(name, type) \struct name { \ struct type *tqh_first; /* first e...原创 2019-09-22 17:00:58 · 298 阅读 · 0 评论 -
锁与无锁
当我们在编写多线程程序时,常常会涉及到多个线程对共享数据的访问。如果不对这种访问加以限制,往往会导致程序运行结果与预期不符锁编写代码时,我们以及习惯了用锁去保护数据。那么,这里的锁是什么?为什么它能满足我们的要求?它存在于哪里?让我们从一个最简单的例子出发—多个线程并发修改一个全局变量:/* 全局变量 */int g_sum = 0;/* 每个线程入口 */void *thr...原创 2019-09-22 17:02:13 · 284 阅读 · 0 评论 -
IP地址是主机的还是网卡的 ?
读大学时,宿舍每个人都买了电脑,为了节约网费,整个宿舍又从二手市场淘了台TP-LINK路由器。这样每个人的电脑就通过路由器连接到学校网管中心,再连接到外网。从路由器后台界面可以看到,路由器为每个人的电脑分配了一个IP地址。这看上去IP是属于主机的.进入职场以后,公司的电脑都安装了两个物理网卡,通过两根网线分别接入了两个网络(10.X.X.X/8 和 192.X.X.X/24).从适配器管理...原创 2019-09-22 17:02:53 · 8517 阅读 · 1 评论 -
Linux中TCP listen套接字的查找的变化
内核TCP在收到SYN报文时,会根据报文的目的IP和Port,在本地匹配处于LISTEN状态的套接字进行握手过程。4.17版本以前的listen套接字查找The current listener hashtable is hashed by port only. When a process is listening at many IP addresses with the same po...原创 2019-09-30 21:44:53 · 680 阅读 · 0 评论