大师兄

加餐 | 模块四思考题解答

今天我会带你把《模块四:Web 技术》中涉及的课后练习题,逐一讲解,并给出每个课时练习题的解题思路和答案。

练习题详解

15 | 内容分发网络:请简述 CDN 回源如何工作?

问题】如果你的应用需要智能 DNS 服务,你将如何实现?

解析】首先你可以在你的域名解析系统中增加两条(或以上)ns 记录。比如说你的域名是 example.com,那么你可以增加 ns1.exmaple.com, ns2.example.com。当然,指定这两个域名的 IP 还需要配置两个 A 记录。

然后你需要两台机器(也可以是容器或者虚拟机),对应 ns1 和 ns2。最好用不在同一个物理机上的两个容器,这样可以避免一台物理机故障导致服务瘫痪。然后在每个容器(虚拟机)上安装一个 Named 服务。Named 是一个专门用来提供 DNS 服务的工具,在虚拟机上安装完成 Named 后,这个虚拟机就变成了一个权威服务器节点。

配置好 Named 后,你需要写几个脚本文件,给要提供 DNS 的域名配置信息。Named 配套使用的有个叫作 GeoDNS 的插件,可以提供基于地理位置的智能 DNS 服务。

更具体的操作,你可以参考这篇文档:https://bind9.readthedocs.io/en/latest/configuration.html

17 | HTTP 协议面试通关:强制缓存和协商缓存的区别是?

问题】写一张网页,用 WebRTC 实现点到点通信。

解析】这里我为你找到了一份 Github 上的源代码:https://github.com/ScaleDrone/webrtc/blob/master/

image (5).png

在 WebRTC 的网络世界中,视频传输可以走点到点服务。客户端被称作 Peer,Peer 的数据直接传送给另一个 Peer,我们也称作P2P 网络。在P2P 网络中,要解决 NAT 穿墙问题,WebRTC 设计了一个网络的抽象框架被称作交互式网络建立连接(Interactive Connectivity Establishment, ICE),图中的 STUN 是 ICE 的一个实现。

对于一个 P2P 网络中的 Peer,它每次要接入这个 P2P 网络会获得一个身份,这个身份就包括它的 IP 地址、端口使用的协议等,这个身份被抽象成了一个对象——Candidate(候选人)。当候选人创建一个 P2P 连接的时候,它会获得候选人的身份。但这个时候,它还没有发起任何真实的数据连接。此时它必须知道另一个人的身份,才能够进行通信。

P2P 网络本身不具备传输身份的能力,因此这个时候需要另一个第三方网络提供身份的交换。代码中的这个第三方服务就是 ScaleDrone。当用户加入聊天室,会先创建连接:

pc = new RTCPeerConnection(...)

接下来会触发onicecanddiate事件获得候选人(Candidate)身份:

pc.onicecandidate = event => {
if (event.candidate) {
// 通过ScaleDrone分发身份
}
};

在实际的代码操作中,代码将获得的身份(event.candiate)直接发送到了 ScaleDrone 提供的某个聊天室中去,这样聊天室的其他用户就会拿到这个身份。

当有新用户进入聊天室后,ScaleDrone 会广播新用户的身份:

room.on('data', (message, client) => {
// Message was sent by us
if (client.id === drone.clientId) {
return;
}
if (message.sdp) {
// This is called after receiving an offer or answer from another peer
pc.setRemoteDescription(new RTCSessionDescription(message.sdp), () => {
// When receiving an offer lets answer it
if (pc.remoteDescription.type === 'offer') {
pc.createAnswer().then(localDescCreated).catch(onError);
}
}, onError);
} else if (message.candidate) {
// Add the new ICE candidate to our connections remote description
pc.addIceCandidate(
new RTCIceCandidate(message.candidate), onSuccess, onError
);
}
});

这个时候,用户彼此都会将对方加入自己的候选人列表:

pc.addIceCandidate(
new RTCIceCandidate(message.candidate), onSuccess, onError
)

加入之后,如果远程候选人录制了视频,WebRTC 的 ontract 事件就会收到视频的数据流,也就是下面这段程序:

pc.ontrack = event => {
const stream = event.streams[0];
if (!remoteVideo.srcObject || remoteVideo.srcObject.id !== stream.id) {
remoteVideo.srcObject = stream;
}
};

这份代码的优势是不需要提供中转的流媒体服务器,就可以完成点到点的视频通信。同理,如果是多人视频,也可以用同样的方法实现。这段程序中需要两个第三方的服务:

  1. 基于 ICE 标准提供 P2P 网络的服务(提供 NAT 穿透能力),这个可以使用 STUN;

  2. 第三方聊天室服务,用于实现聊天的具体逻辑和交换身份。

18 | 爬虫和反爬虫:如何防止黑产爬取我的数据?

问题】用最熟悉的语言写一段程序,模拟成浏览器访问拉勾教育的首页获取首页数据。

解析我这里推荐用 selenium+py 解决这个问题。Selenium 是一个用于自动化测试框架。我这里会用到 Selenium 的 WebDriver,这个 WebDriver 支持多款浏览器,比如 Chrome、Safari 等。具体来说,可以用下面的程序引入 selenium 和选择要使用的 WebDriver:

from selenium import webdriver
driver = webdriver.Chrome()

我这里选择了 Chrome,然后我们就可以模拟浏览器发送请求了:

driver.get("https://edu.lagou.com")

总结

这一模块我们学习了和 Web 技术相关的内容。在实际工作中,配置 DNS 往往是 Leader 的职责

作为 Leader 要关注域名、资源的 URL 的命名是否合理,方便记忆;要配置好 CDN 防止有资源直接从源站被获取;要部署好智能 DNS 实现负载均衡;在网站域名发生变更的时候,还要考虑到老域名如何迁移新域名。另一方面,对 HTTP 协议作为 Web 技术的核心,Leader 还要关注它的性能优化连接、资源大小、缓存等,这样才能更好地制作用户体验。

这一讲就到这里,发现求知的乐趣,我是林䭽。感谢你学习本次课程,下一讲我们将学习《19 | 网络安全概述:对称、非对称加密的区别是?》,再见!