目前广泛使用的是 IPv4,一个 IP 地址4个字节,理论上共有2^32个 IP 地址,接近43亿。这个数量还不到人均一个,远远不够,自然也不能每个设备一个公网 IP 了,所以 Internet 规定了 IPv4 地址空间的一部分供专用地址使用,这些地址永远不会被当做公用地址来分配,局域网内部 IP 就是使用这些专用地址。
了解这个后,如果你发现你在公司的 IP 是192.168.0.100,在家里的IP也是192.168.0.100时,就不会诧异了。局域网内部 IP 只用于局域网内部通讯,如果要连接广域网,还要用到 NAT(网络地址转换)技术(详见《通俗易懂:快速理解P2P技术中的NAT穿透原理》)。
NAT 常用于局域网内部 IP 和局域网分配的公网 IP 之间进行转换,使用最多的是端口多路复用(PAT)方式,简单的描述就是,你在局域网内访问 qq 时,路由器会记录你的内网 IP 和端口(假设是192.168.0.100:12345),用路由器的公网IP和一个未使用的端口向公网发网络包(假设是202.96.134.133:23456),路由器还会把TCP~202.96.134.133:23456~192.168.0.100:12345配对保存起来。当 qq 的响应发到202.96.134.133:23456后,路由器通过查找配对表就知道是发给192.168.0.100:12345。
IP 地址不好记,于是就有了域名。浏览器访问 qq.com 时,会先做一次域名解析,把 qq.com 这个域名解析成 IP 地址,然后才能发出 IP 包。
在 windows 和 linux 下解析域名前,会先从本地 hosts 文件里查找网址映射关系,如果有,就先调用这个 IP 地址映射,完成域名解析。早期做 Web 开发时会用这种方式来切换开发环境、测试环境、预发布环境和正式环境。
比如你在腾讯云注册了一个个人用的域名,一般会直接用腾讯云的 DNS 服务器来管理该域名的解析。对于门户网站,则会自己搭建 DNS 服务器来管理域名。自建 DNS 服务器既方便管理,又能提高安全等级,防范 DDOS 域名攻击。
如果域名的访问量比较大,可以让域名对应多个 IP 地址,操作系统会随机选择其中一个,这是早期的 Web 负载均衡方式。但因为有些 DNS Server 不按 TTL 指示缓存,导致 DNS 变更生效时间最长可达到24~48小时。一旦某个 IP 的机器故障,而 DNS 又不能立即刷新,会让部分用户服务不可用。于是就有了用 LVS/nginx 来动态负载均衡的方式,LVS 的负载均衡基于 IP 层,nginx 则是用 HTTP 层的反向代理机制。
Svr 模式相对 Web 模式来说,通讯性能更强,因为采用了长连接和异步通讯,还能主动推送消息,这是优势。但也因为采用了长连接和异步通讯,对客户端开发的要求就更高些,需要处理好断线重连和支持响应乱序。
Web 模式因为模式简单,Web 服务器自己实现了 HTTP 协议处理和 FastCGI 进程管理等通用操作,FastCGI 这些外部程序只需要处理业务逻辑就行,降低了很多门槛。而且因为是无状态的,扩容非常方便,直接加机器就能搞定,这个平滑扩容的优势在 Web 时代的作用非常大——搞性能优化、架构优化的时间成本比较大,而且不可控,加硬件就能快速抗住,是个好的方案。
7、数据层的演进
我们用一个做手游的故事来聊聊数据层不断优化提升的演进过程。
7.1简单设计
有一天,老板突然说做个山寨版的糖果传奇手游,你接到任务后,分析出游戏的交互频率不大,都是点查询,用 MySQL 能简单搞定。建个表,设好主键和索引,你轻松搞定数据库设计,惬意的泡了杯茶边喝边敲代码。