问了几级才拿到
按委派树,解析 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"))
全部评论