1:HTTP请求和建立一个Socket其实没有太大的区别,只不过outputStream.write的字节码写的数据格式,要符合HTTP,浏览器在创建socket连接之前,要通过DNS解析出ip地址,在通过这个IP地址和默认的端口80,与原创服务器建立socket连接。浏览器根据这个url组装成一个get类型的Http请求头。通过outputSream.write发送。远程服务器,通过inputStram.read读取,服务器等到返回结果,最后断开连接。
HttpClient 是一个很好的开源的发送Http的工具包,Linux下就是 crul + url 就可以发送一个请求了。
DNS域名解析过程:
1:首先浏览器会在缓存找有没有对应域名解析过的ip,如果缓存中有,那么这个过程就结束。浏览器缓存也是有限制的,浏览器缓存大小和浏览器缓存时间限制
2:上一步,没有找到,会到操作系统的缓存找,看有没有这个域名对应的DNS解析结果。也可以在 Linux上 /etc/hosts 和windows 上C:\Windows\System32\drivers\etc\hosts 配置要解析域名对应的ip。当解析到配置文件中某一个域名的时候,操作系统会缓存这个解析的结果,当然了也是受缓存大小和域名失效时间限制的。
3:上一步,没有找到,会将域名发送到本地的域名服务器进行解析。想查看本地的域名服务器,windows下可以通过:ipconfig / all 查看
Linux 查看:cat /etc/resolv.conf
本地区的域名服务器就是:本地互联网接入的一个DNS解析服务,例如:如果是是学校接入的网络,那么这个dns服务器就在学校附近,如果是接入的小区网络,那一般是电信,联通,也就是spa,这个dns服务器就会在我们城市的某一个角落里。这个缓存的解析结果,受到域名失效时间限制,一般不会受空间大小的现在。基本上大部分的域名解析在这里完成。
4:如果本地去域名服务器,依然没有命中的话,那么就会去Root Server 域名服务器去解析。
5:根域名服务器,会返回给本地域名服务器一个主域名服务器的地址。gTLD server 全球只有13台,它是国际顶级域名。
6:LDNS会想上一步返回的主域名服务器发送请求,解析。
7:接受请求的gTLD server 会去找对应的Name Server 就是注册这个域名名的供应商。
8:Name Server 域名服务器,会去找对应域名对应的ip,找到对应映射的值后,返回结果和TTL值,发送给DNS Server 域名服务器
9:根据返回的域名对应的ip和ttl,local DNS SERVER 会缓存这个值的。
10:解析的结果返回给用户,本地缓存就会缓存这个值,时间就是有ttl来控制了
这个只是简单的描述一下域名解析的过程,当然了,实际情况,会比这个更加复杂。
CDN:内容分布网络,一个网络架构,让用户可以就近取得所需的内容,提高网站的访问相应速度。cdn是以缓存网站中静态数据,入js,css,图片和静态页面等数据。用户从主网站获取动态数据后,再在从cdn上下载静态数据。从而加快网页数据内容的下载数独。
1:访问静态文件,发送请求,Local Dns 解析,最终到这个域名注册的服务器解析。
2:dns服务器通常会把它canme 解析到另一个域名,而这个域名最终会被指向cdn全局种的dns负载均衡服务器
3:在由gTM分配这个用户,离得最近的cdn节点。
4:拿到这个解析,去访问静态文件,如果不存在,就会去源网站获取,在返回给用户。
上述讲解后,要说一下负载均衡:有三种
1:链路负载均衡
2:集群负载均衡
3:操作系统负载均衡
链路负载均衡,就是上面讲解的dns解析,这个解析可以控制,解析到不同的应用服务器上,这个有一个很明显的缺点,就是一旦某一个服务端挂了,那么这个对应ip对应的域名就不能访问了,然后缓存的域名没有得到及时的更新的话,就会导致一直用不了服务。
集群负载均衡,分为硬件集群和软件集群,硬件集群,一般用一台专门的硬件设备转发请求。软件集群的话,成本低,但是会增加网络延时,一般网站忽略它吧。