一个 TCP 接收缓冲区问题的解析

2020-01-04
阅读 16 分钟
9.8k
Clinet 与 Server 之间建立一条 TCP 连接,Server 通过 SO_RCVBUF 选项设置连接的接收缓冲区为 2048 字节。Clinet 每隔 100 ms 通过 send() 一个载荷长度很小(2 字节)的 TCP 报文,但 Server 端不调用 recv(),这意味着 Server 收到的 TCP 报文都会存放在接收缓冲区,而当接收缓冲区满时,便应该向 Client 通告零窗口(Ze...

一个 TCP 发送缓冲区问题的解析

2020-01-04
阅读 6 分钟
13k
Client 创建一个 TCP 的 socket,并通过 SO_SNDBUF 选项设置它的发送缓冲区大小为 4096 字节,连接到 Server 后,每 1 秒发送一个 TCP 数据段长度为 1024 的报文。Server 端不调用 recv()。预期的结果分为以下几个阶段:

如何学习 Linux 内核网络协议栈

2019-12-08
阅读 5 分钟
16.5k
部门来了新的小伙伴,领导说要让我做一个关于 Linux 内核网络协议栈的 Presentation,于是有了此文。为什么是文字而不是 PPT 呢 ? 因为我真的不喜欢 PPT !

Linux中TCP listen套接字的查找的变化

2019-09-29
阅读 6 分钟
2.5k
The current listener hashtable is hashed by port only. When a process is listening at many IP addresses with the same port (e.g.[IP1]:443, [IP2]:443... [IPN]:443), the inet[6]_lookup_listener() performance is degraded to a link list. It is prone to syn attack.

Linux内核中reuseport的演进

2019-09-28
阅读 8 分钟
13.1k
SO_REUSEPORT选项在Linux 3.9被引入内核,在这之前也有一个很像的选项SO_REUSEADDR。如果你不太清楚这两者的区别和联系,建议阅读How do SO_REUSEADDR and SO_REUSEPORT differ?。如果不想读,那么下面这一节算是为懒人准备的。

内核TCP: remove per-destination timestamp cache

2019-09-25
阅读 2 分钟
2k
与之一起修改的,还有tcp: remove tcp_tw_recycle。tcp_tw_recycle机制是用于内核快速回收TIME_WAIT状态的套接字。但是当网络中存在NAT设备时,该机制反而可能会导致NAT设备背后的客户端难以连接上服务器。

Linux内核TCP Metrics框架

2019-09-23
阅读 1 分钟
3.5k
TCP是一个复杂的协议,这种复杂来源于对报文传输的可靠性承诺。对每条TCP连接来说,除了有独立的状态机、定时器之外,还有拥塞控制相关的一些运行变量,比如RTT、CWND、SSTHRESH等,这些运行参数同样也是每连接(Per-Connection)的

Linux内核UDP隧道框架

2019-09-22
阅读 2 分钟
4.3k
相对而言,UDP就没这个困扰了,丢包的事情交给应用层处理就行。因而,不少隧道协议都是将UDP作为外层报文的方案。自然而然,与网络发展联系紧密的Linux内核也开始支持这些隧道协议,较新的内核已经支持fou、l2tp、vxlan、tipc、geneve等UDP隧道协议。

隧道而言,TCP-In-TCP为什么不好

2019-09-19
阅读 2 分钟
3.1k
前天晚上在家中,当我搭起熟悉的ss梯子时, 发现不可用了T.T。登陆到控制台查看,发现国内的IP被Block了。问问身边朋友,也是一样的现象,听说是因为网络安全周?!看来只能寄希望于一周后能恢复吧....

XFRM -- IPsec协议的内核实现框架

2019-09-17
阅读 5 分钟
17.3k
IPsec协议帮助IP层建立安全可信的数据包传输通道。当前已经有了如StrongSwan、OpenSwan等比较成熟的解决方案,而它们都使用了Linux内核中的XFRM框架进行报文接收发送。

IPsec与NAT Traversal(NAT-T)

2019-09-15
阅读 4 分钟
6.7k
IPsec在两个通信实体之间建立安全的数据传输通道, 但它却与网络中广泛存在的NAT设备(以及PAT)有天生的不兼容性(incompatible)。

聊聊TCP的重传退避与公平

2019-08-28
阅读 2 分钟
5.3k
TCP在发送报文后,如果没有收到对端应答,那么在重传定时器超时后会触发重传,超时时间遵循二进制退避原则,也就是{1,2,4,8,16}这样成倍地扩大超时时间。退避是因为TCP认为丢包意味着网络有拥塞,为了不加重网络的拥塞,TCP选择等待更长的时间再进行重传。这和CSMA/CD中的二进制退避算法如出一辙。

Linux路由缓存的前世今生

2019-08-26
阅读 4 分钟
7.4k
3.6版本一定算得上是Linux网络子系统中一个特别的版本, 这个版本(补丁patch)移除了查找FIB之前的缓存查找。本文就来谈谈路由缓存的前世今生。

inet socket 与 packet socket

2019-08-17
阅读 5 分钟
8.8k
调试过网络程序的人大多使用过tcpdump,那你知道tcpdump是如何工作的吗? tcpdump这类工具也被称为Sniffer,它可以在不影响应用程序正常报文的情况下,将流经网卡的报文复制一份给Sniffer,然后经过加工过滤,最后呈现给用户。

IP地址是主机的还是网卡的 ?

2019-08-10
阅读 3 分钟
10.7k
读大学时,宿舍每个人都买了电脑,为了节约网费,整个宿舍又从二手市场淘了台TP-LINK路由器。这样每个人的电脑就通过路由器连接到学校网管中心,再连接到外网。从路由器后台界面可以看到,路由器为每个人的电脑分配了一个IP地址。这看上去IP是属于主机的.

锁和无锁

2019-08-02
阅读 8 分钟
2.3k
当我们在编写多线程程序时,常常会涉及到多个线程对共享数据的访问。如果不对这种访问加以限制,往往会导致程序运行结果与预期不符 锁 编写代码时,我们以及习惯了用锁去保护数据。那么,这里的锁是什么?为什么它能满足我们的要求?它存在于哪里? 让我们从一个最简单的例子出发---多个线程并发修改一个全局变量: {代...

Netfilter 是如何工作的(五):初识连接跟踪(connection track)

2019-06-28
阅读 2 分钟
5.7k
报文过滤和连接跟踪可以说是Netfilter提供的两大基本功能。前者被大多数人熟知,因为我们对防火墙的第一印象就是可以阻止有害的报文伤害计算机;而后者就没这么有名了,很多人甚至不知道Netfilter有这项功能。

Netfilter 是如何工作的(四):动作(target)

2019-06-20
阅读 2 分钟
3.1k
每一条iptables配置的规则(rule)都包含了匹配条件(match)部分和动作(target)。当报文途径HOOK点时,Netfilter会逐个遍历挂在该钩子点上的表的rule,若报文满足rule的匹配条件,内核就会执行动作(target)。

TAILQ 队列之一二事

2019-06-19
阅读 9 分钟
11.1k
注意:数据结构中的filed都是type类型的指针(或者是二级指针),这里的type是用户的队列元素类型,,将ENTRY结构内嵌到用户的QUEUE_ITEM结构中:

面试必备进程同步机制--内核自旋锁

2019-06-17
阅读 7 分钟
5.8k
进程(线程)间的同步机制是面试时的常见问题,所以准备用一个系列来好好整理下用户态与内核态的各种同步机制。本文就以内核空间的一种基础同步机制---自旋锁开始好了

Netfilter 是如何工作的(三):扩展匹配条件(match)

2019-06-13
阅读 2 分钟
4.8k
每一条iptables配置的rule都包含了匹配条件(match)部分和动作(target)。当报文途径HOOK点时,Netfilter会逐个遍历挂在该钩子点上的表的rule,若报文满足rule的匹配条件,内核就会执行动作(target)。

Netfilter 是如何工作的(二):表(table)与规则(rule)

2019-06-12
阅读 2 分钟
4.5k
在(一)中说到,报文在内核协议栈中会途经5个HOOK点,在每个HOOK点上会依次执行链表上的钩子函数,那么这些钩子函数是如何与用户使用iptables下发的各个rule联系起来的呢?这些rule又是如何存储的呢? 本文详细描述这个问题。

Netfilter 是如何工作的(一):HOOK点

2019-06-11
阅读 3 分钟
11.9k
Netfilter是一套融入在Linux内核网络协议栈中的报文处理(过滤或者修改)框架。它在内核中报文的关键流动路径上定义了5个HOOK点(下图蓝色方框),各个协议(如IPv4、IPv6、ARP)可以在这些HOOK点安装钩子函数,报文流经此地,内核会按照优先级调用这些钩子函数,这些钩子函数最终会决定报文是被NF_ACCEPT(放行)还是NF_DROP(丢...

通俗理解IP路由

2019-06-02
阅读 8 分钟
15.1k
我们知道,IP地址是网络世界里的门牌号。你可以通过IP地址访问远在天边的网站,那么数据是如何到达网站的呢?靠的就是路径上每个节点的路由。路由,简单的说就是指导IP报文该去哪的指示牌。

深入浅出TCP中的SYN-Cookies

2019-05-25
阅读 3 分钟
29.6k
TCP连接建立时,客户端通过发送SYN报文发起向处于监听状态的服务器发起连接,服务器为该连接分配一定的资源,并发送SYN+ACK报文。对服务器来说,此时该连接的状态称为半连接(Half-Open),而当其之后收到客户端回复的ACK报文后,连接才算建立完成。在这个过程中,如果服务器一直没有收到ACK报文(比如在链路中丢失了),服...

backlog参数对TCP连接建立的影响

2019-05-21
阅读 8 分钟
15k
曾经有人问我套接字编程中listen的第二个参数backlog是什么意思?多大的值合适?我不假思索地回答它表示服务器可以接受的并发请求的最大值。然而事实真的是这样的吗?

packetdrill--测试TCP协议栈行为的利器

2019-05-15
阅读 6 分钟
11.9k
摘要:packetdrill是一个非常有用的用于测试网络协议栈的工具,由Google开发,它常用于对网络协议栈进行回归测试,确保新的功能不会影响原有功能。本文主要介绍其基本原理、安装、入门、测试脚本的编写方法。

TCP拥塞控制之基础

2019-05-07
阅读 5 分钟
10.2k
TCP要点有四,一曰有连接,二曰可靠传输,三曰数据按照到达,四曰端到端流量控制。注意,TCP被设计时只保证这四点,此时它虽然也有些问题,然而很简单,然而更大的问题很快呈现出来,使之不得不考虑和IP网络相关的东西,比如公平性,效率,因此增加了拥塞控制,这样TCP就成了现在这个样子。

走进 mTCP

2019-03-19
阅读 5 分钟
13.1k
互联网的发展,使得用户对网络应用的性能需求越来越高。人们不断挖掘CPU处理能力加强,添加核的数量,但这并没有使得网络设备的吞吐率线性增加,其中一个原因是内核协议栈成为了限制网络性能提升的瓶颈。

图解 epoll 是如何工作的

2019-03-15
阅读 7 分钟
14.4k
本文包含以下内容: epoll是如何工作的 本文不包含以下内容: epoll 的用法 epoll 的缺陷 我实在非常喜欢像epoll这样使用方便、原理不深却有大用处的东西,即使它可能已经比较老了 select 和 poll 的缺点 epoll 对于动辄需要处理上万连接的网络服务应用的意义可以说是革命性的。对于普通的本地应用,select 和 poll可能...