浏览器是我们日常都会用的一个软件,那么,当你向浏览器的地址栏输入一个地址(URL)时,它背后究竟发生了哪些故事呢?
浏览器检查地址
1 检查地址的有效性
对于浏览器来说,一般可以支持两种地址的输入:IP(192.xxx.xxx.xxx)直接访问和通过域名(www.xxx.com)访问。在你输入一个地址后,浏览器最先做的就是检查你的地址是否“合法”。譬如,用IP的时候有超过255的数字、域名中有非法字符等。只有当你正确输入一个地址,浏览器才会按照你的指令进行以下步骤。否则,(现在的)浏览器会认为你想在搜索引擎中搜索这段字符串。
2 检查访问方式(http or https)
假设你已输入正确,此时浏览器会检测你的访问方式。访问方式有HTTP和HTTPS两种,区别如下:
- https是http协议的安全版本,http协议的数据传输是明文的,是不安全的;https使用了SSL/TLS协议进行了加密处理,需要先建立SSL加密通道再进行通信,有效防止不安全访问。
- http和https使用连接方式不同,默认端口也不一样,http是80,https是443。
由于http的明文传输机制安全性很差,因此大部分网站现已转为https。但如果你不指定明确的访问方式,浏览器依旧会默认使用http进行访问。为了能使你顺利到达https的访问通道,网站开发者想出了下图的办法让你的http访问转化成https访问,即当你请求80端口时,服务器会返回一条重定向至443端口的信息,让你的浏览器重新请求443端口。
此时问题来了,你和服务器之间出现了坏人!(他甚至可能是你的网络运营商,如果真是的话https拿他也经常没得办法咯)他可能通过路由劫持、DNS劫持等方式劫持了你的网络,比如劫持了你的80端口,就会出现下图中的“中间人劫持攻击”。坏人可以根据他的目的,在原网页中植入广告、钓鱼网站等不良信息,再发送给你的浏览器。
一种常用的解决方案是使用HTST,在此不再详述。读者请自行搜索了解。
3 其他检查
除了上述检查,浏览器还会进行一些额外的操作,比如安全检查、访问限制(比如某些网站emmmm)。
4 浏览器缓存
最后,浏览器将检查自己的缓存情况,来决定下一步的行为,如图所示。其中要注意的是,RFC 规定,如果 ETag 和 Last-Modified 都有,则必须一次性都发给服务器,没有优先级。如果服务器输出了 ETag,没有必要再输出 Last-Modified。
ETag是LastModifed的补充,有些动态生成的内容就可以用md5做ETag控制缓存了。ETag比lastModified更加严谨,如果资源发生变化,ETag就会发生变化,就会把最新的资源给客户端返回去,而LastModified不识别s(秒)单位里的修改,所以如果资源在s(秒)单位里发生了修改,那LastModified也不会发生改变,这样如果只用了LastModified,客户端得到的资源就不是最新的;但是设定了ETag之后,每次客户端发出请求,服务端都会根据资源重新生成一个ETag,对性能有影响。
ETag只在特定情况下才更有用,比如同一url的资源在不同条件下返回不同的内容。而现实中一般会通过各种方法来避免这样的情况出现,因为这样容易消耗更多资源。相比而言,LastModified一般情况下一般足够,且LastModified更快,并且是web服务器自动支持的。因此默认使用LastModified,有需要的情况下才用ETag