与JavaWeb有关的故事(web请求与Java I/O)

作为一名后端屌丝程序员,对算法、并发、性能乐此不疲。但是,随着年龄和阅历的增加,显然叶落而不知秋的心态是不太能混了。尤其是,某T面试官在明知我是后端,且明确表示对HTTP协议不太熟的情况下,强行让我解释HTTP状态码200至600的含义。这,便是本篇的初衷,讲一讲后端眼里的前端故事。内容基于《深入分析JavaWeb技术内幕》,加入了自己的理解,思维会比较跳跃,需要后端基础。

web请求过程

作为一名从CS架构转入BS架构的后端,不得不说,BS是趋势也是方向,两个好处:

客户端使用统一的浏览器,使用配置简单

服务端基于统一的HTTP,简化开发模式,并且开源服务器众多,开发成本低

B/S网络架构

CS架构通常是长链接交互数据,而BS架构是通过基于HTTP协议的无状态的短链接通讯。当在浏览器输入时,会发生一系列动作,最终将需要的信息返回到浏览器。其中涉及很多概念,如DNS解析、CDN、负载均衡等(后续会详解),但是基本架构还是差不多,基本流程是:

浏览器输入URL---DNS解析成对应IP---负载均衡服务器---CDN---服务端系统---分布式缓存---文件系统/DB

包含CDN的架构图:

与JavaWeb有关的故事(web请求与Java I/O)

发起一个HTTP请求

概括为,通过URL解析到服务器IP,建立socket链接,发送符合HTTP规范的输入流,等待服务器返回数据,然后断开链接。linux中curl+URL命令,可以简单发起一个HTTP请求。

HTTP解析

HTTP是BS网络架构的核心,程序员杀人放火之必备。
首先,要了解的是HTTP header部分,它控制着数据传输、浏览器渲染、服务器执行逻辑。
常见HTTP请求头:

与JavaWeb有关的故事(web请求与Java I/O)

常见响应头:

与JavaWeb有关的故事(web请求与Java I/O)

常见错误码:

与JavaWeb有关的故事(web请求与Java I/O)

总结:

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,可选值如下:

与JavaWeb有关的故事(web请求与Java I/O)

Expires
指定一个日期,超过这个日期,缓存超时,重新请求

Last-Modified/Etag
服务端响应头中返回一个Last-Modified字段,告诉浏览器这个页面的最后修改时间。当浏览器再次请求时,在header中添加If-Modified-Since字段,来询问页面是否最新,最新则返回304,服务器也不会传送数据。
Etag类似功能,为每一个页面分配一个唯一编号,后端比较难处理,需要记住网站所有资源。

DNS域名解析

将域名解析成地址,非常重要。整个HTTP通信都是基于TCP/IP协议簇的,没有IP地址就没法通信,但是IP地址是一串数字,难记,所以有了IP和域名的对应关系。有了对应关系,就要有解析,知道域名通过对应关系,就能得到IP,从而建立起通信。

DNS域名解析过程

看书说话,我们来捋一捋,当你在浏览器输入一串URL时,怎么找到的对应服务器IP

与JavaWeb有关的故事(web请求与Java I/O)

浏览器检查本地缓存,缓存有实效,通过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值缓存在本地

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyzfyg.html