小白科普:从输入网址到最后浏览器呈现页面内容,中间发生了什么?

微信公众号如何绕过微信限制实现支付宝支付?5分钟搞定中间页跳转 本文针对微信公众号内无法直接调用支付宝支付的问题,提供了一套合规的“中间页跳转”解决方案。通过环境检测,在微信内置浏览器中引导用户手动切换至系统浏览器,从而绕过微信限制,安全完成支付宝支付流程。该方法实现简单,5分钟即可部署,有效提升支付转化率。 阅读详情

1前言

这篇文章是应网友之邀所写,主要描述一下我们访问网站时, 从输入网址到最后浏览器呈现内容,中间发生了什么。

之前写过两篇文章《我是一个网卡》,《我是一个路由器》描述了一个电脑如何通过DHCP、ARP、NAT等上式获取IP、然后访问网络的过程,主要专注在传输层和网络层。

今天的文章主要专注于应用层,我拿了一个很简单的网络结构来讲。假定本机已经获取了IP地址,各种网络基础设施已经准备好了。

由于知识点太多,我肯定会漏掉部分内容,欢迎在留言中补充, 以后我会根据大家建议再写文章扩展。

2准备

当你在浏览器中输入网址(例如www.coder.com)并且敲了回车以后, 浏览器首先要做的事情就是获得coder.com的IP地址,具体的做法就是发送一个UDP的包给DNS服务器,DNS服务器会返回coder.com的IP, 这时候浏览器通常会把IP地址给缓存起来,这样下次访问就会加快。

比如Chrome, 你可以通过chrome://net-internals/#dns来查看。

有了服务器的IP, 浏览器就要可以发起HTTP请求了,但是HTTP Request/Response必须在TCP这个“虚拟的连接”上来发送和接收。

想要建立“虚拟的”TCP连接,TCP邮差需要知道4个东西:(本机IP, 本机端口,服务器IP, 服务器端口),现在只知道了本机IP,服务器IP, 两个端口怎么办?

本机端口很简单,操作系统可以给浏览器随机分配一个, 服务器端口更简单,用的是一个“众所周知”的端口,HTTP服务就是80, 我们直接告诉TCP邮差就行。

经过三次握手以后,客户端和服务器端的TCP连接就建立起来了! 终于可以发送HTTP请求了。

0?wx_fmt=png

之所以把TCP连接画成虚线,是因为这个连接是虚拟的, 详情可参见之前的文章《TCP/IP之大明邮差》,《张大胖的Socket》

3Web服务器

一个HTTP GET请求经过千山万水,历经多个路由器的转发,终于到达服务器端(HTTP数据包可能被下层进行分片传输,略去不表)。

Web服务器需要着手处理了,它有三种方式来处理:

(1) 可以用一个线程来处理所有请求,同一时刻只能处理一个,这种结构易于实现,但是这样会造成严重的性能问题。

(2) 可以为每个请求分配一个进程/线程,但是当连接太多的时候,服务器端的进程/线程会耗费大量内存资源,进程/线程的切换也会让CPU不堪重负。

(3) 复用I/O的方式,很多Web服务器都采用了复用结构,例如通过epoll的方式监视所有的连接,当连接的状态发生变化(如有数据可读), 才用一个进程/线程对那个连接进行处理,处理完以后继续监视,等待下次状态变化。 用这种方式可以用少量的进程/线程应对成千上万的连接请求。

(码农翻身注:详情参见《Http Server:一个差生的逆袭》)

我们使用Nginx这个非常流行的Web服务器来继续下面的故事。

对于HTTP GET请求,Nginx利用epoll的方式给读取了出来, Nginx接下来要判断,这是个静态的请求还是个动态的请求啊?

如果是静态的请求(HTML文件,JavaScript文件,CSS文件,图片等),也许自己就能搞定了(当然依赖于Nginx配置,可能转发到别的缓存服务器去),读取本机硬盘上的相关文件,直接返回。

如果是动态的请求,需要后端服务器(如Tomcat)处理以后才能返回,那就需要向Tomcat转发,如果后端的Tomcat还不止一个,那就需要按照某种策略选取一个。

例如Ngnix支持这么几种:

  • 轮询:按照次序挨个向后端服务器转发

  • 权重:给每个后端服务器指定一个权重,相当于向后端服务器转发的几率。

  • ip_hash: 根据ip做一个hash操作,然后找个服务器转发,这样的话同一个客户端ip总是会转发到同一个后端服务器。

  • fair:根据后端服务器的响应时间来分配请求,响应时间段的优先分配。

0?wx_fmt=gif

0?wx_fmt=png


不管用哪种算法,某个后端服务器最终被选中,然后Nginx需要把HTTP Request转发给后端的Tomcat,并且把Tomcat输出的HttpResponse再转发给浏览器。

由此可见,Nginx在这种场景下,是一个代理人的角色。

0?wx_fmt=gif

0?wx_fmt=png

5应用服务器

Http Request终于来到了Tomcat,这是一个由Java写的、可以处理Servlet/JSP的容器,我们的代码就运行在这个容器之中。

如同Web服务器一样, Tomcat也可能为每个请求分配一个线程去处理,即通常所说的BIO模式(Blocking I/O 模式)。

也可能使用I/O多路复用技术,仅仅使用若干线程来处理所有请求,即NIO模式。

不管用哪种方式,Http Request 都会被交给某个Servlet处理,这个Servlet又会把Http Request做转换,变成框架所使用的参数格式,然后分发给某个Controller(如果你是在用Spring)或者Action(如果你是在Struts)。

剩下的故事就比较简单了(不,对码农来说,其实是最复杂的部分),就是执行码农经常写的增删改查逻辑,在这个过程中很有可能和缓存、数据库等后端组件打交道,最终返回HTTP Response,由于细节依赖业务逻辑,略去不表。

根据我们的例子,这个HTTP Response应该是一个HTML页面。

6归途

Tomcat很高兴地把Http Response发给了Ngnix 。

Ngnix也很高兴地把Http Response 发给了浏览器。


0?wx_fmt=png

发完以后TCP连接能关闭吗?

如果使用的是HTTP1.1, 这个连接默认是keep-alive,也就是说不能关闭;

如果是HTTP1.0,要看看之前的HTTP Request Header中有没有Connetion:keep-alive,如果有,那也不能关闭。

7浏览器再次工作

浏览器收到了Http Response,从其中读取了HTML页面,开始准备显示这个页面。

但是这个HTML页面中可能引用了大量其他资源,例如js文件,CSS文件,图片等,这些资源也位于服务器端,并且可能位于另外一个域名下面,例如static.coder.com。

浏览器没有办法,只好一个个地下载,从使用DNS获取IP开始,之前做过的事情还要再来一遍。不同之处在于不会再有应用服务器如Tomcat的介入了。

如果需要下载的外部资源太多,浏览器会创建多个TCP连接,并行地去下载。

但是同一时间对同一域名下的请求数量也不能太多,要不然服务器访问量太大,受不了。所以浏览器要限制一下, 例如Chrome在Http1.1下只能并行地下载6个资源。

0?wx_fmt=png

当服务器给浏览器发送JS,CSS这些文件时,会告诉浏览器这些文件什么时候过期(使用Cache-Control或者Expire),浏览器可以把文件缓存到本地,当第二次请求同样的文件时,如果不过期,直接从本地取就可以了。

如果过期了,浏览器就可以询问服务器端,文件有没有修改过?(依据是上一次服务器发送的Last-Modified和ETag),如果没有修改过(304 Not Modified),还可以使用缓存。否则的话服务器就会被最新的文件发回到浏览器。

当然如果你按了Ctrl+F5,会强制地发出GET请求,完全无视缓存。

注:在Chrome下,可以通过 chrome://view-http-cache/ 命令来查看缓存。

现在浏览器得到了三个重要的东西:

1.HTML ,浏览器把它变成DOM Tree

2. CSS,  浏览器把它变成CSS Rule Tree

3. JavaScript, 它可以修改DOM Tree

浏览器会通过DOM Tree和CSS Rule Tree生成所谓“Render Tree”,计算每个元素的位置/大小,进行布局,然后调用操作系统的API进行绘制,这是一个非常复杂的过程,略去不表。

到目前为止,我们终于在浏览器中看到了www.coder.com的内容。

(完)

你看到的只是冰山一角, 更多精彩文章,请移步《2016文章精华》或者《2017文章精华》


码农翻身

用故事讲述技术

0.jpeg

科普web前端开发如何学习,图文全面解析 前端是什么? 在回答这个问题之前,我想到了一道面试题: 当我们在浏览器中输入网址并按回车之后,接下来会发生什么? 我们来简单地看一看 “网页展现” 的整个过程。 比如这里有一个用户,它需要访问 abc.com 这个网址。一般来说,当用户输入一个域名时,是在请求一个 HTML 资源。当他完成域名解析之后,他的浏览器会向 abc.com 这个域名所指向的 Web 服务器发出请求。 有时候 Web 服务器直接就可以返回用户的请求了;有时候 Web 服务器还需要向数据库查询一些数据,然后才能把处理结果返回给用 阅读详情

相关推荐

Chrome 玄学故障排查:为什么无痕模式正常,普通模式却无法访问网页?

摘要: 作者遇到Chrome浏览器无法打开网页的诡异故障:普通模式报DNS错误,无痕模式却能正常访问。通过分析发现,这是由于Chrome内部DNS缓存损坏导致。解决方法很简单:访问chrome://net-internals/#dns清除DNS缓存即可。文章还提供了进阶排雷方案,如禁用插件或重置套接字池,并指出无痕模式可作为网络故障的诊断工具——能访问说明是浏览器缓存问题,不能访问则是网络配置问题。最后提醒强制关机或网络切换可能导致此类缓存异常,建议读者收藏这份实用排障指南。

成茂峰 1007

前端跳转第三方网页中间页

前端跳转第三方过渡页面

weixin_49230250的博客 4568

跳转提示代码及跳转中间页

如果您想在跳转第三方网址时,可以有一个良好的提示,使用户知道这是一个URL跳转页,则可以使用本模板。 本模板采用JavaScript+CSS实现,保证提示在页面的中心,并与系统的跳转模型模板绑定(ZL_C_RedirectLink ),使用起来极其方便只要两步: 1、将images文件夹直接覆盖网站根目录同名文件夹。 2、将[带提示_转向链接模型内容页.html]文件放在您的模板目录,然后绑定就可以直接使用了。 没别的要求,插件配置成功的同志,把演示链接发在评论区,谢谢!就设置为免费下载了。

几种页面的跳转方法

一、 在和中间插入其中content中的第一个参数为定时n(秒),第二个参数为n秒后自动跳转到的URL二、用javascriptwindow.location.href="http://www.google.com";或者window.location="http://www.google.com";或者window.location.assign("http://ww

逐梦的专栏 2238

Hand-Eye 标定误差分析:从理论到 C++ 实现

本文深入探讨了机器人手眼标定中的核心环节——误差分析。文章从AX=XB方程的理论残差出发,详细解析了旋转与平移误差的数学定义与物理意义,并提供了一个工业级的C++实现代码,用于计算重投影误差。通过误差分析,工程师可以量化标定精度,诊断问题根源,从而确保视觉引导机器人系统在实际应用中的可靠性与精确性。

c7d8e的博客 695

从时序博弈到数据稳定:CS1237驱动中的信号滤波与卡尔曼实践

本文探讨了CS1237高精度ADC驱动在复杂工业环境中的信号处理挑战,重点介绍了一阶滤波与自适应卡尔曼滤波算法的实践应用。通过参数优化和动态调整策略,有效提升了数据稳定性和抗干扰能力,为嵌入式系统在噪声环境下的精密测量提供了可靠解决方案。

rnn9storyteller的博客 863

页面跳转的几种方法

HTML5 History API 允许我们操作浏览器的会话历史记录(session history),它包括和方法,以及popstate事件。

(黎子)人生编码 1万+

S4HANA Rebate Management(条件合同) -Single Step

S4HANA 条件合同管理(Condition Contract Management), 包括如何创建条件合同,场景应用

m0_50200150的博客 2308

cordova 某个页面强制横屏_小白科普:从输入网址到最后浏览器呈现页面内容,中间发生了什么?...

老刘 1前言这篇文章是应网友之邀所写,主要描述一下我们访问网站时, 从输入网址到最后浏览器呈现内容,中间发生了什么。今天的文章主要专注于应用层,我拿了一个很简单的网络结构来讲。假定本机已经获取了IP地址,各种网络基础设施已经准备好了。由于知识点太多,我肯定会漏掉部分内容,欢迎在留言中补充, 以后我会根据大家建议再写文章扩展。2准备当你在浏览器中输入网址(例如http://www.coder.c...

weixin_39612023的博客 130

模拟ic入门——设计一个单极运放(一)单级运算放大器设计基础

主要介绍了单级运放的基本理论和使用场景

qq_64956710的博客 3743

变压器铁心100Hz振动噪声的COMSOL磁致伸缩仿真全流程

磁致伸缩是铁磁材料在磁场作用下发生尺寸变化的现象,也是变压器铁心振动与噪声产生的根本原因。由于应变与磁通密度近似成平方关系,50Hz电网激励下铁心振动基频为100Hz。借助COMSOL多物理场仿真,可将磁场计算结果映射为结构应力和变形,完成“电磁—结构”单向耦合分析。该技术广泛应用于变压器振动噪声预测、结构优化及故障诊断等工程场景。本文从磁致伸缩物理机理出发,系统梳理了材料参数、等效建模、边界条件设置和结果校核等关键步骤,帮助工程师掌握从磁致伸缩到结构变形的完整仿真链路,解决实际工程对标难题。

weixin_33796177的博客 313

.jsp 读取txt 页面_小白科普:从输入网址到最后浏览器呈现页面内容,中间发生了什么?...

老刘 1前言这篇文章是应网友之邀所写,主要描述一下我们访问网站时, 从输入网址到最后浏览器呈现内容,中间发生了什么。今天的文章主要专注于应用层,我拿了一个很简单的网络结构来讲。假定本机已经获取了IP地址,各种网络基础设施已经准备好了。由于知识点太多,我肯定会漏掉部分内容,欢迎在留言中补充, 以后我会根据大家建议再写文章扩展。2准备当你在浏览器中输入网址(例如http://www.coder.c...

weixin_39755824的博客 152

大麦APP抢票协议分析:从‘掌密网络’代码看移动端API安全防护

本文深度解析了大麦APP抢票协议的安全防护体系,重点分析了'掌密网络'代码中体现的动态签名、设备指纹和人机验证等关键技术。文章详细介绍了大麦APP如何通过多层次API安全防护应对抢票压力,包括参数加密、请求头部设计和异常处理机制,为移动应用开发者提供了安全实践建议。

weixin_28740299的博客 290

【前端】从输入网址到最后浏览器呈现页面内容,中间发生了什么?

从输入网址到最后浏览器呈现页面内容,中间发生了什么? 1. 输入网址,浏览器,发送UDP包给DNS服务器,通过DNS解析得到网址的IP地址(即服务器的IP),并将IP地址缓存。 2. 客户端(浏览器)和服务器端之间建立TCP连接:由于TCP邮差需要知道4个东西(本机IP,本机端口,服务器IP,服务器端口),现在只知道了本机IP,服务器IP, 两个端口怎么办?其中,本机端口很简单,操作系统可以给...

Dora_5537的博客 572

微信小程序 - 最新详细实现用户保存下载视频到手机相册,将视频临时路径、在线播放地址(网络路径)URL存储到手机,弹出访问手机相册权限询问,支持视频格式mp4、avi、mov、wmv、flv、webm

微信小程序,视频,手机相册,保存,另存为,小程序保存到相册权限,writePhotosAlbum,一键保存视频到手机相册功能(视频来源为链接),第一次要获取用户授权,授权使用相册权限,小程序视频下载,如何把视频下载到相册,下载一个视频到本地相册,显示下载进度,可取消下载,视频下载到本地,微信小程序视频如何下载,保存视频到相机,页面播放视频并下载到本地,安卓系统,苹果ios保存到相册报错,权限拒绝后打不开,添加相册授权弹框拒绝后再也出不来了,实现保存视频到手机相册功能,将mp4在线视频下载并存储到用户的手机中

🏆 前端领域优质创作者 7623

详细指南:如何在TI C2000基于C28x的微控制器上部署FreeRTOS_C语言实现

FreeRTOS是一个小型、开源、实时的嵌入式操作系统内核。它为多种微控制器和处理器提供了支持,包括ARM、AVR、MSP430和PIC等。小型和轻量级:适合资源受限的嵌入式系统。实时性:可以满足严格的实时要求。多任务支持:支持多任务并发执行。内存管理:提供了多种内存管理策略。模块化设计:用户可以根据需要选择所需的功能模块。TI C2000系列微控制器是专为实时控制应用设计的。高性能C28x核:提供了高速的浮点运算能力。丰富的外设:包括PWM、ADC、DAC、通信接口等。低功耗。

qq_38334677的博客 1606

从输入网址到最后浏览器呈现页面内容,中间发生了什么?

小白科普:从输入网址到最后浏览器呈现页面内容,中间发生了什么? 2018-01-24 刘欣 前端开发 来自:码农翻身(微信号:coderising) 1前言 这篇文章是应网友之邀所写,主要描述一下我们访问网站时, 从输入网址到最后浏览器呈现内容,中间发生了什么。 之前写过两篇文章《我是一个网卡》,《我是一个路由器》描

houdabiao的博客 272

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

码农翻身讲网络3:从Socket编程到HTTP服务器

小白科普:从输入网址到最后浏览器呈现页面内容,中间发生了什么?(HTTP请求)原创: 老刘 码农翻身 1月2日1前言这篇文章是应网友之邀所写,主要描述一下我们访问网站时, 从输入网址到最后浏览器呈现内容,中间发生了什么。之前写过两篇文章《我是一个网卡》,《我是一个路由器》描述了一个电脑如何通过DHCP、ARP、NAT等上式获取IP、然后访问网络的过程,主要专注在传输层和网络层。今天的文章主要专注于...

Java技术江湖 2373

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

js如何通过a链接跳转到另一个页面获取复选框选中的内容_科普web前端开发如何学习,图文全面解析...

前端是什么?在回答这个问题之前,我想到了一道面试题:当我们在浏览器中输入网址并按回车之后,接下来会发生什么?我们来简单地看一看 “网页展现” 的整个过程。比如这里有一个用户,它需要访问 abc.com 这个网址。一般来说,当用户输入一个域名时,是在请求一个 HTML 资源。当他完成域名解析之后,他的浏览器会向 abc.com 这个域名所指向的 Web 服务器发出请求。有时候 Web 服务器直接就可...

weixin_39967938的博客 433

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

网络资料总结0

协议层 问题列表 小白科普:从输入网址到最后浏览器呈现页面内容,中间发生了什么?

cpongo5 106

科普web前端开发,图文全面解析

前端是什么? 在回答这个问题之前,我想到了一道面试题: 当我们在浏览器中输入网址并按回车之后,接下来会发生什么? 我们来简单地看一看 “网页展现” 的整个过程。 比如这里有一个用户,它需要访问 abc.com 这个网址。一般来说,当用户输入一个域名时,是在请求一个 HTML 资源。当他完成域名解析之后,他的浏览器会向 abc.com 这个域名所指向的 Web 服务器发出请求。 有时候 W...

IT-编程资讯 770

如何实现网页左边点击网页右边出现表单_科普web前端开发如何学习,图文全面解析...

前端是什么?在回答这个问题之前,我想到了一道面试题:当我们在浏览器中输入网址并按回车之后,接下来会发生什么?我们来简单地看一看 “网页展现” 的整个过程。比如这里有一个用户,它需要访问 abc.com 这个网址。一般来说,当用户输入一个域名时,是在请求一个 HTML 资源。当他完成域名解析之后,他的浏览器会向 abc.com 这个域名所指向的 Web 服务器发出请求。有时候 Web 服务器直接就可...

weixin_28707535的博客 759

【科普】DNS污染是什么?

污染是指者在某个网站时,了(DNS)解析的,使被了的者问站。这种攻击会的取、受到击,或者的。类似于把你的地方的了,导致你向。

weixin_43783942的博客 4470
上一篇: 告别2017,码农翻身全年文章精华
下一篇: 面向对象圣经
码农翻身
码农翻身 《码农翻身》作者 《码农翻身》作者
博客等级 码龄8年 3万+粉丝 1084原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值