问了几级才拿到

👁️ 1 人浏览 💬 0 人评论 ❤️ 添加收藏

按委派树,解析 img.cdn.net 问过几级服务器?

贯穿本节的委派树(本地 resolver 迭代式逐级问;判题机不联网,这是它的确定模型): 知道每个顶级域(TLD,如 com)交给哪台服务器,TLD 服务器知道每个域(如 example.com)的权威服务器是谁,权威服务器上才有最终的 IP。chain(名字) 交回一路问过的服务器名(从根到权威),levels 是问过几级,resolve 交回 IP。

DELEG = {
    "根": {"com": "com服务器", "net": "net服务器", "org": "org服务器"},
    "com服务器": {"example.com": "example权威", "shop.com": "shop权威"},
    "net服务器": {"cdn.net": "cdn权威"},
    "org服务器": {"wiki.org": "wiki权威"},
}
AUTH = {
    "example权威": {"www.example.com": "93.184.216.34", "mail.example.com": "93.184.216.35"},
    "shop权威": {"www.shop.com": "10.0.0.9"},
    "cdn权威": {"img.cdn.net": "203.0.113.7"},
    "wiki权威": {"wiki.org": "198.51.100.2"},
}


def tld_of(name):
    return name.rsplit(".", 1)[-1]


def zone_of(name):
    # 权威区(去掉最左的主机名那一段,如 www.example.com → example.com)
    parts = name.split(".")
    return ".".join(parts[-2:])


def chain(name):
    # 迭代式解析:本地 resolver 从根问起,一级级拿到「去问下一个」的指引,返回问过的服务器名
    seq = ["根"]
    tld = tld_of(name)
    tsrv = DELEG["根"][tld]
    seq.append(tsrv)
    asrv = DELEG[tsrv][zone_of(name)]
    seq.append(asrv)
    return seq


def levels(name):
    # 问了几级服务器才拿到答案
    return len(chain(name))


def resolve(name):
    asrv = chain(name)[-1]
    return AUTH[asrv][name]

print(levels("img.cdn.net"))
提交你的答案
请登录后提交答案。
去登录
代码编辑器
Ctrl + Enter 运行
本次输入:
输出:

                        
👩‍🏫
AI
💬 题目评论

全部评论