理论上,一个网站可以通过域名访问,也可以通过IP地址访问。但实际并非如此,除了百度可以通过IP地址打开外,像京东、知乎这样的大平台,均无法打开,这是为什么呢?
像百度、京东、知乎这样体量的网站,由于服务器太多,数据量庞大,很难满足用户“秒开”的需求,都会使用CDN加速来提高访问速度。
当用户访问网站时,域名解析到距离用户最近的CDN服务器的公网IP,浏览器与公网IP对应的CDN服务器建立连接。
举个例子,当北京的用户访问使用了CDN的网站时,浏览器会与北京的CDN服务器建立连接。上海用户访问网站,会与上海的CDN服务器建立连接。
因此,一个域名,不用地方的用户,看到的公网IP也会不同。
问题来了,CDN服务器一个公网IP,可能为很多网站服务,当浏览器主动连接时,CDN服务器怎么知道是连接了A网站还是B网站呢?
答案是使用SNI。
SNI是TLS的扩展,用来解决一个服务器拥有多个域名的情况。
当用户浏览器填入SNI=”目标域名”后,CDN服务器便可以根据SNI的值,判断用户想连接目标网站,完成TLS安全连接,并把资源返回浏览器。
比如浏览器填入SNI=”www.zhihu.com”,CDN服务器马上知道用户想访问的是知乎,立马可以将资源返回给浏览器。访问同一个CDN服务器下的其他域名同理。
有一天,用户突然不喜欢在浏览器输入域名了,而是直接使用IP地址访问,CDN服务器不知所措了……
SNI=”54.223.189.245”,CDN服务器已经无法作出判断,不知道用户要访问哪一个网站了。
与其返回一个错误网站的资源给用户,不如拒绝服务。
问题又来了,为什么百度就可以?
有两种可能。
一种是百度的IP地址,对应的就是baidu.com网站服务器,换句话说,百度并没有使用CDN,而且这个IP地址是百度独享。
另一种是百度使用了专用CDN服务器,整个CDN只服务于baidu.com。
简单的说,百度有钱买IP,或者有实力自己架设CDN网络……
评论留言