作为一名后端屌丝程序员,对算法、并发、性能乐此不疲。但是,随着年龄和阅历的增加,显然叶落而不知秋的心态是不太能混了。尤其是,某T面试官在明知我是后端,且明确表示对HTTP协议不太熟的情况下,强行让我解释HTTP状态码200至600的含义。这,便是本篇的初衷,讲一讲后端眼里的前端故事。内容基于《深入分析JavaWeb技术内幕》,加入了自己的理解,思维会比较跳跃,需要后端基础。
web请求过程
作为一名从CS架构转入BS架构的后端,不得不说,BS是趋势也是方向,两个好处:
客户端使用统一的浏览器,使用配置简单
服务端基于统一的HTTP,简化开发模式,并且开源服务器众多,开发成本低
B/S网络架构CS架构通常是长链接交互数据,而BS架构是通过基于HTTP协议的无状态的短链接通讯。当在浏览器输入时,会发生一系列动作,最终将需要的信息返回到浏览器。其中涉及很多概念,如DNS解析、CDN、负载均衡等(后续会详解),但是基本架构还是差不多,基本流程是:
浏览器输入URL---DNS解析成对应IP---负载均衡服务器---CDN---服务端系统---分布式缓存---文件系统/DB
包含CDN的架构图:
发起一个HTTP请求概括为,通过URL解析到服务器IP,建立socket链接,发送符合HTTP规范的输入流,等待服务器返回数据,然后断开链接。linux中curl+URL命令,可以简单发起一个HTTP请求。
HTTP解析HTTP是BS网络架构的核心,程序员杀人放火之必备。
首先,要了解的是HTTP header部分,它控制着数据传输、浏览器渲染、服务器执行逻辑。
常见HTTP请求头:
常见响应头:
常见错误码:
总结:
HTTP请求头,charset、encoding、language、host、User-Agent、Connection
HTTP响应头,Server、type、encoding、language、length、Keep-Alive
HTTP常见状态码,200成功,302临时跳转,400请求语法错误,403服务器收到请求,拒绝服务,404请求资源不存在,500服务端异常
复杂而又重要,常用ctrl+F5组合键刷新界面,来获得最新数据。其原理是,在header中添加了两项,Pragma:no-cache和Cache-Control:no-cache。对于缓存相关的header参数,主要如下:
Pragma/Cache-Control
缓存控制,Cache-Control优先级较高,和其他请求字段同时存在时(如Expires),会覆盖其他字段。Pragma类似,常用就是Pragma:no-cache,可选值如下:
Expires
指定一个日期,超过这个日期,缓存超时,重新请求
Last-Modified/Etag
服务端响应头中返回一个Last-Modified字段,告诉浏览器这个页面的最后修改时间。当浏览器再次请求时,在header中添加If-Modified-Since字段,来询问页面是否最新,最新则返回304,服务器也不会传送数据。
Etag类似功能,为每一个页面分配一个唯一编号,后端比较难处理,需要记住网站所有资源。
将域名解析成地址,非常重要。整个HTTP通信都是基于TCP/IP协议簇的,没有IP地址就没法通信,但是IP地址是一串数字,难记,所以有了IP和域名的对应关系。有了对应关系,就要有解析,知道域名通过对应关系,就能得到IP,从而建立起通信。
DNS域名解析过程看书说话,我们来捋一捋,当你在浏览器输入一串URL时,怎么找到的对应服务器IP
浏览器检查本地缓存,缓存有实效,通过TTL(DNS记录在DNS服务器上缓存时间)设置
检查操作系统缓存,linux下在/etc/hosts
本地区域名服务器,LDNS
Root Server域名服务器
根域名服务器返回给本地域名服务器一个所查询域的主域名服务器gTLD Server地址(全球13台左右)
LDNS在向上一步gTLD发送请求
接收请求的gTLD服务器查找并返回此域名对应的Name Server域名服务器地址(通常是注册的域名(提供商)服务器)
Name Server查询存储的域名和IP映射关系,连同一个TTL值返回给DNS Server
返回该域名对应的IP和TTL值,LDS会缓存这个对应关系
把解析结果返回给用户,用户根据TTL值缓存在本地