长期以来,我们都会考察面试者一些有关 TCP/IP 协议族的犄角旮旯的问题。例如:IPv4 协议栈和 IPv6 协议栈的校验和算法有什么不同? 每个工程师都要证明自己对于网络栈的全面理解。

本着传统的TCP/IP 酒令的精神,在这里我想和诸位分享我在 CloudFlare 的自动缓解攻击系统工作的这几个月里,遇到的那些有关 TCP/IP 的奇葩问题。

CC BY-SA 2.0 image by Daan Berg

如果你不知道正确答案也不用担心,欢迎提出有趣的观点!

有些问题的答案是显而易见的,而有些问题却没有直接的答案,而且还可能引起激烈的讨论。列出这些问题的目的是鼓励诸位捡起满是灰尘的 RFC 文档,激发起对网络栈内部工作原理的兴趣以及传播、分享我们如此依赖的协议的知识。

如果你想分享某个问题的答案,别忘了添加一条评论。

你觉得自己完全了解 TCP/IP 协议族吗?让我们试试看:

古老的问题

1)TCP 最小的端口号是多少?

2)TCP 帧中有一个叫做 URG Pointer 的字段,什么时候会用到该字段?

3)RST 包能有荷载么?

4)什么时候会用到 IPv6 里的“flow”字段?

5)socket中的 IP_FREEBIND 选项有什么用?

被遗忘奇葩问题

6)PSH 标志实际上有什么用?

7)TCP 时间戳和 SYN Cookie 是如何协同工作的?

8)“UDP” 包可以把校验和字段设置为0么?

9)TCP 的同时开放连接是如何工作的?真的能工作么?

碎片处理和拥塞控制

10)什么是愚笨窗口综合征(stupid window syndrome)?

11)TCP 头里的 CWE 和 ECE 标志有什么用?

12)IP 头里的 ID 字段是什么?ID 字段必须和 DF 比特位一起完成什么工作?为什么有些 IP 包的 ID 字段不是零并且设置了 DF?

新提议

13)SYN 包可以有荷载么?(提示:新RFC提案)

14)SYN+ACK 包可以有荷载么?

ICMP Path MTU

15)ICMP 包太大(packet-too-big )的消息会由路由器返回,并且荷载里包含了原始包的一部分。Linux 系统中可接受的最小荷载长度是多少?

16)当 ICMP包太大(packet-too-big )的消息被中间路由返回时会包含这个路由的源IP。但在实际操作中,我们经常可以看到 ICMP 消息的源 IP 与原始包的目的 IP 相同。为什么会这样?

Linux配置

17)Linux 有一个名为 “tcp_no_metrics_save” 的 sysctl 设置。它用于存储什么?存储多久?

18)Linux 使用了两个队列来处理到达的 TCP 连接:SYN 队列和接收队列。SYN 队列长度是多少?

19)如果 SYN 队列因变得很大而导致溢出,那么会发生什么?

路由相关

最后:

20)BGP bogons 是什么?为什么说它们现在只是个小问题?

21)TCP 有一个会添加 MD5 校验和到包中的扩展。该扩展什么时候起作用?

22)IPv4 和 IPv6 的校验和算法有什么区别?

6 7 收藏 7 评论

关于作者:zer0Black

目前工作为移动开发,兴趣广泛,计算机各方面均有强烈兴趣。(新浪微博:<a href="http://weibo.com/u/... 个人主页 · 我的文章 · 13