第一次将“精通”用在标题里面,以后这就是努力的方向了!我会把 localhost 总结一下,如有错误请批评指正,如有遗漏请指出!谢谢!
规范
localhost 是一个特殊的域名,在 RFC 6761 中对其在域名解析系统(DNS)中的使用做了详细规范:
- localhost 的 IPv4 或 IPv6 地址查询必须始终解析为相应的环回地址,该地址在单独的标准中指定。
- 应用可以自行解析环回地址,或者将他们交由本地解析器机制。
- 当名称解析器收到 localhost 的地址(A 或 AAAA)查询时,它应该返回适当的环回地址,以及其他请求的记录类型的请求响应。不应将本地主机的查询转发到缓存名称服务器(caching name servers)。
- 为了避免使域名系统根服务器(Domain Name System root servers)负担流量,缓存名称服务器不应请求本地主机的名称服务器记录,也不要向权威名称服务器(authoritative name servers)转发解析。
- DNS 注册商不能在顶级域 localhost 中委派域名。
- 在上述规定的前提下,当权威名称服务器收到 ‘localhost’ 查询请求时,应该适当处理。
数据包处理
通过 localhost 可以访问自己主机上的网络服务。但是请求使用的是回环网络接口,任何发往回环网络地址的数据包,并不会出现在系统以外,也不会经由路由转发,其处理都在 TCP/IP 协议的链路层实现的,因此也就不受防火墙和网卡的相关限制。这些有点类似于linux中的socket。
具有环回源地址或目标地址的数据包,在非环回接口上收到则必须被删除。这种数据包有时被称为火星包。和其他虚假数据包一样,它们可能是恶意的,它们带来的问题可以通过 bogon 滤波避免。
fiddler、charles是不能抓到这种请求的,但是可以通过抓包神器 wireshark 抓到,具体配置请移步这里。
特殊情况
MySQL 数据库的版本区分使用主机名 localhost 与使用地址 127.0.0.1 和 ::1。当在应用程序的客户端连接器接口中使用 localhost 作为目标时,MySQL 应用程序编程接口使用 Unix 域套接字连接到数据库,而通过环回接口的 TCP 连接需要直接使用显式地址。使用 127.0.0.0/8 网络地址时,一个值得注意的例外是,它们用在多协议标签交换(MPLS)跟踪路由错误检测中,它们的不可路由属性提供了一种方便的方法来避免向最终用户传送错误数据包。
配置方法
hosts文件包含了IP地址和主机名之间的映射,还包括主机名的别名。在没有域名服务器的情况下,系统上的所有网络程序都通过查询该文件来解析对应于某个主机名的IP地址,否则就需要使用DNS服务程序来解决。通常可以将常用的域名和IP地址映射加入到hosts文件中,实现快速方便的访问。除此之外,host文件还可以用在局域网中以构建映射关系,或者将恶意网站的域名映射到错误 ip 或者本机 ip 上来达到屏蔽的效果。
配置方法如下:
- 首先要保证你具有管理员权限。
- windows下,hosts文件一般的位置为:
C:\Windows\System32\drivers\etc
。linux下,hosts文件的路径为/etc/hosts
。 - hosts文件每行代表一个映射,格式为
IP地址 主机名/域名[ 主机别名]
,其中’[ 主机别名]
‘不是必须的。例如:202.108.22.5 www.baidu.com
将域名www.baidu.com
映射到了202.108.22.5
。 - 直接使用文本编辑软件修改即可,windows 下可用 txt 编辑器,而 linux 下可使用 vim。
参考
localhost 的详细规范可参考 RFC 6761。
维基百科英文、维基百科中文
浅谈localhost