对面关了不收手

场景:~/服务/答.py 的连接处理循环没判 recv 是不是 b"":客户端一断开,它就疯狂空转(CPU 打满)或攒下 CLOSE-WAIT。~/复现.sh 能看到现象。 任务:在处理循环里加上「recv 得到 b&q

开始练习 →

重启报端口占用

场景:~/服务/答.py 收到 bye 就先 close(服务端先关)。这个端口上正有一条上次运行(设了 SO_REUSEADDR)留下的 TIME-WAIT;而 答.py 没设 SO_REUSEADDR,直接起会撞 [Errno 98]

开始练习 →

客户端少发了换行

场景:服务端按行读(读到换行才算一条),可 ~/客户端.py 发请求时忘了在末尾加换行,于是发完就一直等回信、卡住不动。~/复现.sh 能看到它卡住。 任务:改 ~/客户端.py,让它发的那一行末尾带上换行(\n),跑出「收到: pong」

开始练习 →

交付:一个健壮的服务

场景:要交付一个不出上面这些毛病的 TCP 服务,端口在说明里。 任务:写 ~/服务/答.py(SO_REUSEADDR + bind + listen + 循环 accept;每条连接按行读,ping 回 pong、bye 回 bye 并

开始练习 →

DNS 是做什么的

我们平时在浏览器里敲的是 www.example.com 这样的域名,可网络实际要用的是 IP 地址。DNS 主要做的是【0】。

开始练习 →

为什么不直接记 IP

既然最后都要用 IP,之所以还要域名和 DNS、不让大家直接记 IP,是因为【0】。

开始练习 →

一个域名对几个 IP

一个域名和 IP 地址之间的对应关系是【0】。

开始练习 →

没有 DNS 会怎样

假如完全没有 DNS,我们上网会变成【0】。

开始练习 →

DNS 像生活里的什么

要打个比方,DNS 最像生活里的【0】。

开始练习 →

查出这个域名的 IP

按贯穿全条的委派树,解析 www.example.com。 贯穿本节的委派树(本地 resolver 迭代式逐级问;判题机不联网,这是它的确定模型):根 知道每个顶级域(TLD,如 com)交给哪台服务器,TLD 服务器知道每个域(如 ex

开始练习 →