Blog

报文最大生存时间(MSL)

Content #

MSL 是 Maximum Segment Lifetime,报文最大生存时间,它是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。因为 TCP 报文基于是 IP 协议的,而 IP 头中有一个 TTL 域,是 IP 数据报可以经过的最大路由数,每经过一个处理他的路由器此值就减 1,当此值为 0 则数据报将被丢弃,同时发送 ICMP 报文通知源主机。协议规定 MSL 为 2 分钟,实际应用中常用的是 30 秒, 1 分钟和 2 分钟等。

Viewpoints #

From #

第11讲 | TCP协议(上):因性恶而复杂,先恶后善反轻松

hping3测试网络延迟

Content #

以 baidu.com 为例,你可以执行下面的 hping3 命令,测试你的机器到百度搜索服务器的网络延迟:

# -c表示发送3次请求,-S表示设置TCP SYN,-p表示端口号为80
$ hping3 -c 3 -S -p 80 baidu.com
HPING baidu.com (eth0 123.125.115.110): S set, 40 headers + 0 data bytes
len=46 ip=123.125.115.110 ttl=51 id=47908 sport=80 flags=SA seq=0 win=8192 rtt=20.9 ms
len=46 ip=123.125.115.110 ttl=51 id=6788  sport=80 flags=SA seq=1 win=8192 rtt=20.9 ms
len=46 ip=123.125.115.110 ttl=51 id=37699 sport=80 flags=SA seq=2 win=8192 rtt=20.9 ms

--- baidu.com hping statistic ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 20.9/20.9/20.9 ms

从 hping3 的结果中,你可以看到,往返延迟 RTT 为 20.9ms。

...

SYN Cookies

Content #

TCP SYN Cookies 也是一种专门防御 SYN Flood 攻击的方法。SYN Cookies 基于连接信息(包括源地址、源端口、目的地址、目的端口等)以及一个加密种子(如系统启动时间),计算出一个哈希值(SHA1),这个哈希值称为 cookie。

然后,这个 cookie 就被用作序列号,来应答 SYN+ACK 包,并释放连接状态。当客户端发送完三次握手的最后一次 ACK 后,服务器就会再次计算这个哈希值,确认是上次返回的 SYN+ACK 的返回包,才会进入 TCP 的连接状态。

因而,开启 SYN Cookies 后,就不需要维护半开连接状态了,进而也就没有了半连接数的限制。内核选项 net.ipv4.tcp_max_syn_backlog 也就无效了。

你可以通过下面的命令,开启 TCP SYN Cookies:

$ sysctl -w net.ipv4.tcp_syncookies=1
net.ipv4.tcp_syncookies = 1

When the connection queue begins to get full, the system starts responding to SYN requests with SYN cookies rather than SYN-ACKs, and it frees the queue slot. Thus, the queue never fills completely. The cookie has a short timeout; the client must respond to it within a short period before the serving host will respond with the expected SYN-ACK. The cookie is a sequence number that is generated based on the original sequence number in the SYN, the source and destination addresses and ports, and a secret value. If the response to the cookie matches the result of the hashing algorithm, the server is reasonably well assured that the SYN is valid.

...

增大半连接的容量

Content #

SYN Flood 会导致 SYN_RECV 状态的连接急剧增大。在上面的 netstat 命令中,你也可以看到 190 多个处于半开状态的连接。

不过,半开状态的连接数是有限制的,执行下面的命令,你就可以看到,默认的半连接容量只有 256:

$ sysctl net.ipv4.tcp_max_syn_backlog
net.ipv4.tcp_max_syn_backlog = 256

SYN 包数再稍微增大一些,就不能 SSH 登录机器了。 所以,你还应该增大半连接的容量,比如,你可以用下面的命令,将其增大为 1024:

$ sysctl -w net.ipv4.tcp_max_syn_backlog=1024
net.ipv4.tcp_max_syn_backlog = 1024

Viewpoints #

From #

39 | 案例篇:怎么缓解 DDoS 攻击带来的性能下降问题?

从实模式进入保护模式的步骤

Content #

为了保证代码在不同种Intel处理器中的前后兼容性,建议遵循以下步骤执行模式切换操作(请参考Intel官方白皮书Volume 3的9.9.1节)。 (1) 执行CLI汇编指令禁止可屏蔽硬件中断,对于不可屏蔽中断NMI只能借助外部电路才能禁止。(模式切换程序必须保证在切换过程中不能产生异常和中断。) (2) 执行LGDT汇编指令将GDT的基地址和长度加载到GDTR寄存器。 (3) 执行MOV CR0汇编指令位置CR0控制寄存器的PE标志位。(可同时置位CR0控制寄存器的PG标志位。) (4) 一旦MOV CR0汇编指令执行结束,紧随其后必须执行一条远跳转(far JMP)或远调用(far CALL)指令,以切换到保护模式的代码段去执行。(这是一个典型的保护模式切换方法。) (5) 通过执行JMP或CALL指令,可改变处理器的执行流水线,进而使处理器加载执行保护模式的代码段。 (6) 如果开启分页机制,那么MOV CR0指令和JMP/CALL(跳转/调用)指令必须位于同一性地址映射的页面内。(因为保护模式和分页机制使能后的物理地址,与执行JMP/CALL指令前的线性地址相同。)至于JMP或CALL指令的目标地址,则无需进行同一性地址映射(线性地址与物理地址重合)。 (7) 如需使用LDT,则必须借助LLDT汇编指令将GDT内的LDT段选择子加载到LDTR 寄存器中。 (8) 执行LTR汇编指令将一个TSS段描述符的段选择子加载到TR任务寄存器。处理器对TSS段结构无特殊要求,凡是可写的内存空间均可。 (9) 进入保护模式后,数据段寄存器仍旧保留着实模式的段数据,必须重新加载数据段选择子或使用JMP/CALL指令执行新任务,便可将其更新为保护模式。(执行步骤(4)的JMP或CALL指令已将代码段寄存器更新为保护模式。)对于不使用的数据段寄存器(DS和SS寄存器除外),可将NULL段选择子加载到其中。 (10) 执行LIDT指令,将保护模式下的IDT表的基地址和长度加载到IDTR寄存器。 (11) 执行STI指令使能可屏蔽硬件中断,并执行必要的硬件操作使能NMI不可屏蔽中断。

From #

一个64位操作系统的设计与实现

网络设备的状态标识

Content #

<BROADCAST,MULTICAST,UP,LOWER_UP> 叫做 net_device flags,网络设备的状态标识。

UP 表示网卡处于启动的状态; BROADCAST 表示这个网卡有广播地址,可以发送广播包; MULTICAST 表示网卡可以发送多播包; LOWER_UP 表示 L1 是启动的,也即网线插着呢。 MTU1500 是指最大传输单元 MTU 为 1500,这是以太网的默认值。 MTU 是二层 MAC 层的概念。MAC 层有 MAC 的头,以太网规定正文部分不允许超过 1500 个字节。正文里面有 IP 的头、TCP 的头、HTTP 的头。如果放不下,就需要分片来传输。

qdisc pfifo_fast 是什么意思呢?

qdisc 全称是 queueing discipline,中文叫排队规则。内核如果需要通过某个网络接口发送数据包,它都需要按照为这个接口配置的 qdisc(排队规则)把数据包加入队列。

最简单的 qdisc 是 pfifo,它不对进入的数据包做任何的处理,数据包采用先入先出的方式通过队列。pfifo_fast 稍微复杂一些,它的队列包括三个波段(band)。在每个波段里面,使用先进先出规则。

三个波段(band)的优先级也不相同。band 0 的优先级最高,band 2 的最低。如果 band 0 里面有数据包,系统就不会处理 band 1 里面的数据包,band 1 和 band 2 之间也是一样。

数据包是按照服务类型(Type of Service,TOS)被分配到三个波段(band)里面的。TOS 是 IP 头里面的一个字段,代表了当前的包是高优先级的,还是低优先级的。

...

MAC地址的唯一性

Content #

MAC 地址号称全局唯一,不会有两个网卡有相同的 MAC 地址,而且网卡自生产出来,就带着这个地址。很多人看到这里就会想,既然这样,整个互联网的通信,全部用 MAC 地址好了,只要知道了对方的 MAC 地址,就可以把信息传过去。

这样当然是不行的。 一个网络包要从一个地方传到另一个地方,除了要有确定的地址,还需要有定位功能。 而有门牌号码属性的 IP 地址,才是有远程定位功能的。

例如,你去杭州市网商路 599 号 B 楼 6 层找刘超,你在路上问路,可能被问的人不知道 B 楼是哪个,但是可以给你指网商路怎么去。但是如果你问一个人,你知道这个身份证号的人在哪里吗?可想而知,没有人知道。

MAC 地址更像是身份证,是一个唯一的标识。它的唯一性设计是为了组网的时候,不同的网卡放在一个网络里面的时候,可以不用担心冲突。从硬件角度,保证不同的网卡有不同的标识。

MAC 地址是有一定定位功能的,只不过范围非常有限。你可以根据 IP 地址,找到杭州市网商路 599 号 B 楼 6 层,但是依然找不到我,你就可以靠吼了,大声喊身份证 XXXX 的是哪位?我听到了,我就会站起来说,是我啊。但是如果你在上海,到处喊身份证 XXXX 的是哪位,我不在现场,当然不会回答,因为我在杭州不在上海。

所以,MAC 地址的通信范围比较小,局限在一个子网里面。例如,从 192.168.0.2/24 访问 192.168.0.3/24 是可以用 MAC 地址的。一旦跨子网,即从 192.168.0.2/24 到 192.168.1.2/24,MAC 地址就不行了,需要 IP 地址起作用了。

Viewpoints #

From #

第3讲 | ifconfig:最熟悉又陌生的命令行

三个最常见的协同算法

Content #

  1. 基于用户的协同过滤算法(User-based Collaborative Filtering)

基于用户的协同过滤算法就是基于用户和用户之间的相似性,推荐你喜欢的东西,过滤你不喜欢的东西。

  1. 基于物品的协同过滤算法(Item-based Collaborative Filtering)

根据用户群对于物品的购买或者评价发现物品和物品之间的相似程度,然后再根据具体用户历史使用的类似物品推荐给这个用户。

  1. 基于数据模型的协同过滤算法(Model-based Collaborative Filtering)

不一定非要通过协同过滤的公式来计算用户之间的距离,我们完全可以复用其他机器学习算法,先做出来模型,再进行相关的协同过滤。

例如,用关联算法来去做物品之间的相似度评估,然后根据置信度、支持度、提升度或者其他评分规则推荐给用户。我们也可以用聚类算法来找到用户之间的关联程度,把用户之间的距离计算出来,然后把这些用户群相似度比较高的用户之间的商品确定给同样聚类比较清楚的用户。类似的我们还可以用分类算法回归算法,用神经网络做协同过滤、用图模型做协同过滤、用隐语义模型做协同过滤等等。

Viewpoints #

From #

19 | 协同过滤:你看到的短视频都是集体智慧的结晶