计算机网络 - 应用层
最近刚看完《计算机网络:自顶而下方法》,觉得有必要记点东西,基本上是在看书的时候看到什么觉得值得写一点,就写下什么。接下来的几篇博客大概如此,所以会在有条理和没有条理之间反复横跳。而且这些只是我一介初学者形似笔记一样的东西(而且写笔记的人还很懒),所以正确性就像 IP 协议的可靠性一样——没有任何保证了
HTTP
Cookie
HTTP 的无状态简化了服务器设计,但是一个站点通常希望识别用户,为此,HTTP 使用了 cookie,其允许站点对用户进行跟踪
cookie 技术有四个组件:
HTTP 响应报文的 cookie 首部行
HTTP 请求报文的 cookie 首部行
用户端维护的 cookie 文件,一般由浏览器管理
站点的后端数据库
比方说当我们登录一个购物网站时,网站后端将我们标记为用户 6151604,发送的响应报文可能就包含了 Set-cookie: 6151604。之后我们再访问这个网站时,浏览器会在请求报文中加上 Cookie: 6151604,这样网站就可以在不用再次登陆知道用户是谁
当然,这项技术有许多隐私相关的争议
Web 缓存器
其实就是所谓的代理服务器。望文生义,它所做的确实是缓存对象的副本,以此减少响应时间以及接入链路到因特网的通信量
HTTP 的条件 GET 允许缓存器证实自己的副本是最新的:请求报文的 If-modified-since:(后面跟上一个时间)
响应报文的 Last-modified 可以告诉缓存器此对象最新被修改的时间;状态 304 Not Modified 则告知缓存器继续使用该对象
HTTP/2 成帧
单一的 TCP 传输会出现队首阻塞(HOL)的现象,比如 b 站的视频页面,如果先传输视频,再传输其他对象,那么那些小的对象将有很大的延迟。HTTP/2 的方法是将每个报文分成小帧,并在相同的 TCP 连接上交错发送。当这些帧到达客户时,先由帧子层装配成初始响应报文,再交给浏览器
除此之外,HTTP/2 还增加了优先级,允许服务器像一个用户请求发送多个响应
DNS
Domain Name System,域名系统,由分层的 DNS 服务器实现的分布式数据库,运行在 UDP 之上,使用 53 端口
大致上来说,有三种 DNS 服务器:
根 DNS 服务器:全世界有超过 1000 台,是 13 个不同的服务器的副本,由 12 个组织管理,提供 TLD 服务器的 IP
顶级域(Top-Level Domain, TLD)DNS 服务器:对每个如 .com 顶级域,多有 TLD 服务器(集群),提供权威 DNS 服务器地址
权威 DNS 服务器:每个在因特网上公共可访问主机(比如某公司/大学的服务器)都必须提供其自己的 DNS 记录(自己这边的主机名和 IP 的映射)。这个组织/机构可以自己实现一个权威 DNS 服务器,也可以将记录移交给服务商提供的服务器(你可以看到一个域名一般会有对应的 DNS 服务器)
其实还有本地 DNS 服务器,每一个 ISP 都会有一个“邻近”的 DNS 服务器,它起到类似代理的作用,理论上没有也可以,但是它的存在非常重要
当我们要知道一个域名对应的 IP 地址,首先主机会向其本地 DNS 发送查询报文(本地 DNS 的 IP 可以通过 DHCP 获得),然后本地 DNS 服务器将此报文转发到根 DNS 服务器,根 DNS 注意到其后缀(假如是 edu),便向本地 DNS 服务器返回负责 edu 后缀的 TLD 服务器 IP 地址列表,则本地 DNS 服务器又向这些 TLD 中的一个发送查询报文,该 TLD 会返回权威 DNS 服务器的 IP。最后本地 DNS 服务器直接向权威 DNS 服务器发送查询报文,终于,在返回的响应报文中得到了我们想要的 IP 地址
可以看到一共发了 8 次 DNS 报文,但实际上完全可能更多:因为 TLD 并不知道权威 DNS 服务器,它只知道中间的某个,而后要经过几“跳”才能得到最终的权威 DNS服务器
所以 DNS 广泛采取了缓存:当某 DNS 服务器收到了一个 DNS 回答,它便将其缓存下来。通常保存一两天后丢弃。所以通常在本地 DNS 就可以马上得到结果,一般根服务器被绕过了
还有一些像 SMTP,P2P,CDN,DASH...... 的知识,我想还是等需要时再看书吧。我只是希望我在这写的东西,是一直能记住的东西