听说一个IP可以绑定多个域名,那么服务端是怎么实现的?
如果我以IP访问服务器,服务器怎么才能知道我想上的是哪个网站?
全球所有网站共同使用一个IP,理论上都是可以的,只要每个网站有自己独一无二的域名。因为IP和网站没有天生的、必然的绑定联系。
在浏览器输入google.com,然后敲回车,我们的目标是什么?
当然是搜索内容了!
为了完成这个查询交易,通常需要完成2次Request/Response消息交互。
第一次:打开网站,获得搜索接口
第二次:在网站接口上搜索内容
每次的请求(Request)都由浏览器主动(Active)发出。服务器被动响应(Passive Response)。
整个过程,用户压根没有接触到IP地址。退一步说,用户压根也没有必要知道网站的IP地址。
互联网能够快速走进千家万户,不就是因为其简单易用吗?
使用域名来访问网站,就是互联网对“用户友好”最好的诠释!
假设当初不是这么设计,全球的网站不是依靠唯一(Unique)的域名来识别的,而是依靠全球唯一的IP来识别,结局会是什么样子?
这是我查询到google.com对应的IPv4、IPv6地址:
名称: google.com
Addresses: 2404:6800:4012::200e
172.217.160.78
用户在浏览器敲入“172.217.160.78”这长长的数字,需要有好的记忆力才能记住。这算好的,当用户使用IPv6地址“2404:6800:4012::200e”访问网站时,这才是噩梦的开始,这长长的数字是怎么记啊?怎么还有“:”、“::”,什么意思啊?用户边敲边骂,这什么玩意?
如果真这么搞,IPv4都不一定搞得起来,IPv6就更别提了。
而“
google.com
”可以让用户一下子就记住了这个网站,简单产生美!
互联网的增速发展,IP地址越来越稀缺。为了缓解IP地址紧张的局面,在用户(Client)侧使用了IP共享技术。这个IP共享技术就是NAT,很多用户共用一个IP。
服务器(Server)侧又如何实现IP共享呢?
很简单,只要域名解析(DNS)技术,将多个网站(域名)解析成一个IP就可以了。这样IP地址、域名将不是1:1的对应关系,而是1:N的对应关系!
配置该IP的服务器,将会同时托管(Hosted)多家网站,那么当互联网的流量到达这台服务器时,服务器是如何区分每家网站的流量的?
很简单,在HTTP Request请求报文头里有一个Host字段,由浏览器填入访问网站的域名。
Host = “google.com”
,通过这个手段就可以将该网站的页面返回给浏览器。
所以,从这个意义上来说,全球所有服务器公用一个IP,在理论上是可以的。再次重申,这仅仅是理论上的可能,不代表现实!
HTTPS流量
上文用户使用的是HTTP访问网站,现如今大多使用HTTPS访问网站,在服务器看到Host = “google.com”之前,服务器需要与浏览器做TLS握手,握手时需要服务器出示待访问网站的证书。服务器懵圈了,你浏览器不告诉我要访问哪个网站,我怎么会知道?
浏览器想想也是,服务器如果收到HTTP报文头里Host = “google.com”,自然知道要访问哪个网站。可是在没有完成TLS握手,就无法收到这个关键信息。而服务器需要在TLS握手时就需要知道,浏览器想要访问的网站,该咋办呢?
在TLS 报文头的Extension部分,有一个字段SNI(Server Name Identification),可以由浏览器填入:SNI = “google.com”,这样服务器就明白了浏览器的真实意图。
用户直接使用IP地址访问服务器,服务器该如何抉择呢?
- 服务器如果配置了默认网站,将使用默认网站。
- 如果服务器IP只托管一个网站,等同于默认网站。
- 如果服务器没有配置默认网站,且同时托管多个网站,服务器无法提供服务。