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

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

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

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

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

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

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

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

Linux内核UDP隧道框架

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

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

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

聊聊TCP的重传退避与公平

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

Linux路由缓存的前世今生

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

inet socket 与 packet socket

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

深入浅出TCP中的SYN-Cookies

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

走进 mTCP

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