深入Web请求过程(笔记)
深入Web请求过程
B/.S架构的好处:
B/S架构带来两方面好处:
l 客服端使用统一浏览器,由于浏览器具有统一性,有效屏蔽了不同服务提供商提供给用户使用服务的差异性。、
l 服务端基于统一的HTTP,为服务提供商简化了开发模式,节省开发成本,服务开发者只需要关注提供服务的应用逻辑。
B/S网络架构概述
B/S网络架构从前端到后端都是基于统一的应用层协议HTTP来交互数据,与传统C/S架构采用的长连接的交互模式不同,HTTP采用无状态的短连接的通信方式。通常情况下,一次请求就完成一次数据交互,通常对应一个业务逻辑,然后通信连接就断开了。采用这种方式是为了能够同时服务更多的用户。
如下图所示:用户在浏览器输入网址,首先会先请求DNS把这个域名解析成对应ip地址,然后根据这个ip地址在互联网找到对应服务器,发送一个get请求,服务器返回默认的数据资源给访问的用户。如果有服务器多台,还需要一个负载均衡设备来平均分配所有用户的请求。
如何发起一个请求
发起一个HTTP请求的过程就是建立一个Socket通信过程。在浏览器建立Socket连接之前,必须根据地址栏里写入的URL的域名DNS解析出IP地址,再根据这个IP地址和默认的80端口与远程服务器建立Socket连接,然后浏览器根据这个url组装成一个get类型的HTTP请求头,发送给目标服务器,服务器发回数据,断开连接。
Linux下可以使用curl+url就可以简单发起HTTP请求。查看http头信息,加上-I选项
HTTP解析
常见HTTP请求头:
Accept-Charset :用于指定客户端接受的字符集
Accept-Encoding: 用于指定可接受的内容编码
Accept-Language:用于指定一种自然语言
Host:用与指定被请求资源的Intent主机和端口号
User-Agent:客服端将他操作系统,浏览器和其他属性告诉服务器
Connection:当前连接是否保持
常见HTTP相应头:
Server:使用服务器名称
Content-Type:用来指明发送给接收者的实体正文的媒体类型
Content-Encoding:与请求报头Accept-Encoding对应,告诉浏览器服务端采用的是什么压缩编码
Content-Language:描述了资源所用的自然语言。
Content-Length:指明实体正文的长度,用以字节方式存储的十进制数字来表示
Keep-Alive:保存连接的时间
常见HTTP状态吗:
200:客户端请求成功
302:临时跳转,跳转的地址通过Location指定
400:客户端请求有语法错误,不能被服务器识别
403:服务器收到请求,但拒绝提供服务
404:请求的资源不存在
500:服务器发生不可预期的错误
浏览器缓存机制:
浏览器缓存是一个比较复杂但是又比较重要的机制。按ctrl+f5组合键刷新页面,会重新请求服务器,即使是请求服务器,也有可能服务器的前端部署一个缓存服务器,为了让用户能够看到最新数据,必须通过HTTP来控制。在请求头加上Pragma:no-cache和Cache-Control:no-cache。
HTTP Head字段用于指定所有缓存机制在整个请求响应链中必须服从的指令。
HTTP Head字段的可选值:
Public:所有内容都被缓存,在响应头设置。
Private:内容只缓存到私有缓存中,在响应头设置。
No-cache: 所有内容不会被缓存
No-store:所有内容不会被缓存到缓存或Intent临时文件中
Must-revalidation/proxy-revalidation:如果缓存内容失败,请求必须发送到服务器进行重新验证
Max-age=xx:缓存内容在xxx秒后失效,这个只在HTTP1.1可用。
Expires:通常使用格式是:Expries:Sat,25 Feb 2012 12:22:17 GMT 后面跟着一个日期和时间,超过这个时间值,缓存的内容将失效。也就是浏览器在发出请求之前检查这个页面这个字段。
Last-Modified/Etag:
Last-Modified字段一般用于一个服务器上的资源最后修改时间,资源可以是静态(静态内容自动加上Last-Modified)或者动态的内容(Servlet提供一个getLastModified方法用于检查某个动态内容是否已经更新),通过这个最后修改时间可以判断当前请求的资源是否最新的。
浏览器再次请求子啊请求头增加一个If-Modified-Since: 字段,询问当前缓存的页面是否最新。如果最新,服务器返回304.
Etag这个字段让服务器给每个一个页面分配一个唯一编号,区分当前这个页面是否最新的。如果多台服务器,就比较难处理。
DNS域名解析
Linux和window可以使用nslookup来查询域名解析结果,linux 还可以使用dig命名来查询DNS解析过程。加上trace 可以跟踪域名解析过程
DNS解析后会缓存解析结果,其中主要两个地方缓存结果,一个是本地域名服务器,一个用户本地机器。这个两个缓存都是TTL值和本机缓存大小控制的,本地机器可以使用ipconfig/flushdns命令来刷新缓存。 Linux 通过/etc/init.d/nscd restartlai 清除。
在Java的jvm 也会缓存DNS的解析成果。这个缓存在InetAddress类中,有两种缓存策略:一种是正确解析结果缓存,另一种是失败的解析结果缓存。这个两个缓存时间由lib\security\java.security文件中配置,networkaddress.cache.ttl和networkaddress.cache.negative.ttl 默认值-1(永不失效)和10(缓存10秒)
需要使用InetAddress类解析域名,必须是单例模式,不然会有严重性能问题。每次创建InetAddress=实例,则每次都要进行完整域名解析。
域名解析记录分为A记录,MX记录,CNAME记录,NS记录,TXT记录
A记录:用来指定对应的IP地址。A记录可以将多个域名解析到一个IP地址,但是不能将一个域名解析多个IP地址。
MX:记录:就是将某个域名下邮件服务器向自己的邮箱服务器。
CNAME:别名解析.所谓别名解析就是为一个域名设置一个或多个别名。
NS记录:为某个域名指定DNS解析服务器,也就是这个域名有指定的IP地址的DNS服务器去解析。
TXT记录:为某个主机名或域名设置说明。
CDN工作机制
CDN就是内容分部网络。是一种先进的流量分配网络,其目的提高用户访问网站的相应速度,有别于镜像,比镜像更智能。目前以静态数据为主,用户从主服务器请求到动态内容,再从CDN上下载静态数据,从而加速网页数据内容的下载速度。
负载均衡:就是对工作任务进行平衡。分摊到个多个操作单元上执行。可以提高服务器响应速度以及利用效率,避免软件或者硬件出现单点失效,解决网络拥塞问题,实现地理位置无关行,为用户提供一致的访问质量。