web请求过程分析
web请求过程分析
大致过程
首先用户输入URL网址,会请求DNS对域名进行解析成相应的IP地址,然后根据IP地址,在互联网上寻找对应的服务器,向服务器发起一个get请求,服务器返回对应的数据资源。
当然,服务器可能有很多台,负载均衡设备会平均分配所有用户的请求,请求的数据可能存储在分布式缓存中或是静态文件,或是数据库里。
当数据返回浏览器,浏览器解析数据发现还有一些静态资源,则又会发起HTTP请求,这些请求很可能在CDN上,CDN服务器又会处理这个用户的请求。!
image
HTTP请求:
HTTP请求头:
请求头 | 说明 |
---|---|
Accept | 浏览器可接受的MIME类型 |
Accept-Charset | 浏览器可接受的字符集 |
Accept-Encoding | 浏览器能够进行解码的数据编码方式 |
Accept-Language | 浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到 |
Authorization | 授权信息,通常出现在对服务器发送的WWW-Authenticate头的应答中 |
Connection | 表示是否需要持久连接 |
Content-Length | 表示请求消息正文的长度 |
Cookie | 这是最重要的请求头信息之一 |
From | 请求发送者的email地址,由一些特殊的Web客户程序使用,浏览器不会用到它 |
Host | 初始URL中的主机和端口 |
If-Modified-Since | 只有当所请求的内容在指定的日期之后又经过修改才返回它,否则返回304“Not Modified”应答 |
Pragma | 指定“no-cache”值表示服务器必须返回一个刷新后的文档,即使它是代理服务器而且已经有了页面的本地拷贝 |
Referer | 包含一个URL,用户从该URL代表的页面出发访问当前请求的页面 |
User-Agent | 浏览器类型,如果Servlet返回的内容与浏览器类型有关则该值非常有用 |
UA-Pixels,UA-Color,UA-OS,UA-CPU | 由某些版本的IE浏览器所发送的非标准的请求头,表示屏幕大小、颜色深度、操作系统和CPU类型 |
响应头 | 说明 |
---|---|
Allow | 服务器支持哪些请求方法(如GET、POST等) |
Content-Encoding | 文档的编码(Encode)方法 |
Content-Length | 表示内容长度 |
Content-Type | 表示后面的文档属于什么MIME类型 |
Date | 当前的GMT时间 |
Expires | 指明应该在什么时候认为文档已经过期,从而不再缓存它 |
Last-Modified | 文档的最后改动时间 |
Location | 表示客户应当到哪里去提取文档 |
Refresh | 表示浏览器应该在多少时间之后刷新文档,以秒计 |
常用状态码
1**:请求收到,继续处理
100——客户必须继续发出请求
2**:操作成功收到,分析、接受
200——交易成功
3**:完成此请求必须进一步处理
302——在其他地址发现了请求数据
4**:请求包含一个错误语法或不能完成
400——错误请求,如语法错误
403——禁止访问
404——没有发现文件、查询或URl
5**:服务器执行一个完全有效请求失败
500 - 内部服务器错误
浏览器缓存机制
cache control
当刘拉起页面异常,通常可能是浏览器做了缓存。如果ctrl+F5重新请求页面,则请求到的是最新的页面。因为此时请求会增加Pragma:no-cache和Cache-Control :no-cache
Expires
浏览器在发出请求之前会检查这个字段,过期则会重新发起请求
Last-Modefied
表示最后修改时间,浏览器再次请求时在请求头上加上,询问当前缓存是否是最新的,是则不会传输新的数据。
DNS域名解析
步骤:(输入回车后)
- 浏览器检查缓存有没有域名对应的IP地址,如果IP没有发生变化,则直接访问成功。如果变化了则失败,因此缓存时间设置不能太长。
- 如果浏览器缓存中没有,则会查找操作系统缓存红是否有对应的解析结果。
- 如果还没有,操作系统把域名发送给LDNS服务器,该服务器一般都会缓存域名解析结果,缓存时间是受域名失效时间控制,缓存空间一般不是影响域名失效的主要因素。80%的域名解析在这里完成,LDNS承担了域名解析的主要工作。
- 如果还没有找到,就去ROOTServer域名服务器请求解析。
- 根域名服务器返回给本地域名服务器一个所查询主域名服务器地址(gTLD server)。gTLD是国际顶级域名服务器,全球只有13台。
- LDNS向gTLD服务器发送请求。
- gTLD查找并返回域名对应的Name Server域名服务器地址。
- Name Server根据映射表,得到IP记录,连同一个TTL值返回给DNS Server域名服务器。
- 返回该域名对应的IP地址和TTL值,LDNS缓存域名和IP,缓存时间由TTL控制。
- LDNS把结果返回给用户,用户根据TTL值缓存在本地缓存中。
总结:
浏览会先查找缓存,未找到则会查本地的DNS缓存和hosts文件,
未找到则会调用DNS服务,将地址给本地解析服务器,解析域名,若未找到则会向上寻找,一直到到根域名服务器
根域名服务器会顶级域名寻找顶级域名服务器,将该服务器IP发给本地DNS域名解析(根服务器在顶层,不会一层层向下寻找,向下找到一层就让本地DNS自己去找)
例如:根域名服务器找到.com域服务器地址IP,将ip发送给我们的域名解析服务器,我们的服务器再向该ip地址询问,直到找到域名对应的IP地址
几种域名解析方式
- A记录,A代表的是Address,用来指定域名对应的IP地址。
- MX记录,表示Mail Exchange,将域名下的邮件服务器指向自己的Mail Server
- CNAME记录,Canonical Name(别名解析)。一个ip地址对应多个域名。
- NS记录,为某个域名指定DNS解析服务器
TXT记录,为某个主机名或域名设置说明
CDN架构
用户要访问某个静态文件(如CSS文件),假设这个文件域名是cdn.jianshu.com,那么首先要想LDNS发请求,经过迭代解析后会回到这域名的注册服务器去解析,这个DNS解析服务器通常会把它重新CNAME解析到另外一个域名,这个域名最终会指向CDN全局中的DNS负载均衡服务器,再由这个GTM来最终分配给访问用户最近的CDN节点。
用户拿到DNS解析结果,用户去CDN节点访问静态文件,如果节点中所请求的文件不存在, 就会回到源站去获取这个文件,再返回给用户。
负载均衡
Load Balance:对工作任务进行平衡、分摊到多个操作单元上执行,如图片服务器、应用服务器。
链路负载均衡
通过DNS解析成不同的IP,用户根据IP来访问不同的目标服务器
集群负载均衡
- 硬件负载均衡
一主一备,优点是性能非常好,但较为昂贵,访问量增大到极限时,不能进行动态扩容。 - 软件负载均衡
成本低,缺点请求要多次经过代理服务器,增加网络延时,如图,LVS和HAProxy对用户的HTTp请求中的URL或者Coolie来进行负载均衡,发送给指定访问的机器。
操作系统负载均衡
利用操作系统级别的软中断或者硬件中断达到负载均衡,如设置多队列网卡