HTML5中国

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1841|回复: 0

[文章] 一个http请求背后的故事之一

[复制链接]

该用户从未签到

发表于 2015-11-21 20:25:32 | 显示全部楼层 |阅读模式
在招聘Web开发工程师时,我最喜欢问的问题就是,在浏览器里输入一个网站然后回车后,客户端和服务端都发生的什么事情,很少有说的比较清楚和全面的,这个问题看似非常简单,其实要说清楚非常丰富的知识,可以说搞懂了这个问题,基本上可以成为互联网技术专家了。之前好像记得有人写过类似的文章,我也写写自己的理解。

可以说互联网对我们生活的影响已无处不在,不管是你浏览新浪上的新闻,还是用Google搜索技术资料,或者是上**购物等等,背后都是一个庞大的网站在为亿万的用户服务,而支撑这些服务的基础就是HTTP协议,它是互联网世界的无冕之王。
了解HTTP的话,需要分成两部分,一部分是客户端浏览器的处理过程,另外一部分是服务端的处理过程。客户端和服务端的基本通讯模型非常简单,客户发一个请求,服务端接收到请求后返回一个响应结果,如下所示:
互联网在最开始的时候确实非常简单,所有的页面都是纯静态,服务端只需要把请求相应的页面资源输出给客户端,浏览器再对简单的html做过解析渲染呈现页面内容即可,但经过这么多年的发展,以及随着业务需求越来越复杂,客户端和服务端都变得非常复杂,但万变不离其宗,基本的通讯模型还是适用的,这就是简单之美,越简单的东西越能够持久。
浏览器端
一个HTTP请求再发送到服务端之前是要经过一系列的处理,最后才能到达服务端,大致的步骤是:
  • 进行DNS查询,得到服务器的真实IP
  • 建立和服务器IP的Socket连接
  • 根据HTTP协议规范构建HTTP消息头和消息体,并将之发送到服务端
  • 接收到服务端返回的HTTP Response内容,并进行页面的渲染和展示
DNS查询
HTTP请求第一步就是进行DNS解析,DNS解析本身也是个非常复杂系统工程,光这个就能讲半天,我们化繁就简,把它实现的基本原理描述一下。
首先解析浏览器中输入的URL链接,得到主机域名。完整的URL格式如下所示,这里只需要先拿到host对应的实际IP地址。域名是为了人记着方便,实际上在进行HTTP请求时是通过TCP/IP协议进行的,TCP/IP协议只能通过IP进行连接,因此首先需要将域名转到实际的IP地址,这个转换的过程就是DNS查询。
  1. <scheme>://<user>:<pwd>@<host>:<port>/<path>?<param>#<frag>
复制代码
DNS查询首先查找本地缓存,缓存的内容包含两部分,一部分是/etc/hosts文件中的本地绑定,一部分是之前查询过的缓存,这样如果能直接命中的话就不需要再经过一次网络查询,速度会非常快。如果查询不到,就会连接DNS服务器进行查询,这个一般是电信、联通这些ISP的域名服务器,查看/etc/resolve.conf可以看到,当然也可以配置成一些著名的公共DNS,比如:114.114.114.114或者8.8.8.8。现在上网通常是走路由器的,直接拨号上网的情况已很少见了,我们上大学那会儿家庭路由器还不普及才用这种方式。而路由器一般也会做一层DNS的缓存,来避免远程的网络请求。ISP接收到请求后会查询域名服务器,如果当初注册的域名是注册在这里的,那么直接返回结果,如果查询不到向更高一级的域名服务器进行查询请求,直到最顶级的域名服务器。
因为域名查询的使用频率非常高,因此每个节点都会做相应的缓存,以便减少不必要的网络开销,但如果域名对应的服务器IP发生了变化,也需要尽早进行刷新,这个缓存的有效期叫TTL,在增加一条A记录进行域名解析时大家可能会注意到这个值,一般默认是10分钟,像DNSPod和阿里云都是这个值。
设置局域网代理上网时,我们一般也会碰到DNS服务器该如何设置的问题,是设置成代理服务器的IP还是ISP的IP?如果通过最简单的IPTABLES的NAT方式来实现局域网代理上网,内网服务器配置的还是ISP的DNS服务器IP,网关需要配置成代理服务器的IP,这样在进行DNS查询时,内网服务器会通过UDP协议连接代理服务器的53端口,通过NAT方式可以请此请求转发到实际的DNS服务器上,从而完成一次DNS查询。
DNS还可以用于服务器的负载匀衡,比如同一个域名可以配置多个IP地址,将DNS的路由方式设置成轮循或者随机,不同客户的请求可以被分配到不同的服务器上,从而实现一种最简单的集群方案,大网站一般会通过此种方式来实现第一层的负载匀衡,后面才是LVS、Nginx/Apache这些负载匀衡方案。
    作者:yikebocai

HTML5中国微信

小黑屋|关于我们|HTML5论坛|友情链接|手机版|HTML5中国 ( 京ICP备11006447号 京公网安备:11010802018489号  

GMT+8, 2017-5-24 04:38

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表