从输入网址到出现网页到底发生了什么?(五)

总结

从输入网址到出现网页到底发生了什么?
1、浏览器将你输入的网页发往DNS进行解析,获得IP地址
2、浏览器自行组织符合HTTP协议格式的数据发往网址对于IP下的80端口——称作请求
3、服务器获得浏览器以TCP协议发送的字符串并进行以http格式对其进行分析,从而组织合理的内容发往浏览器。 ——称作响应
4、浏览器获得响应之后,对数据进行符合http协议要求的格式进行分析并调用解释器对获得的数据进行渲染从而显示出各种各样的网页

补充说明

渲染

大家也许会好奇,我们传输的是一个个字符串,为什么可以显示出这么丰富的界面呢?
或者说字符串和界面之间的转化是通过什么样的规则执行的呢?
这就不得不提一个机构了。

万维网联盟(W3C)创建于1994年,是Web技术领域最具权威和影响力的国际中立性技术标准机构。到目前为止,W3C已发布了200多项影响深远的Web技术标准及实施指南,如广为业界采用的超文本标记语言HTML(标准通用标记语言下的一个应用)、可扩展标记语言XML(标准通用标记语言下的一个子集)以及帮助残障人士有效获得Web信息的无障碍指南(WCAG)等,有效促进了Web技术的互相兼容,对互联网技术的发展和应用起到了基础性和根本性的支撑作用。

W3C对 html、css、xml等等标记语言进行了格式要求,和解析说明。
当服务器响应了这样的的标记语言(字符串)之后,浏览器就根据W3C的标准对标记语言进行解析从而显示出各种各样的界面。
W3C的存在,保证了同一个网址在不同的浏览器下打开显示的内容是基本一致的。

为什么说基本一致?
这里引出了软件开发的两个模式

B/S C/S

大家之前应该听说了B/S C/S这种说法,
即Browser/Server(浏览器/服务器)结构,Client/Server(客户端/服务器架构)。
大部分的软件都是CS架构,就是软件的客户端和服务器都由软件公司编写。
比如QQ、微信、支付宝等等。在这种模式下,客户端和服务器都使用socket进行自定义的通讯。
端口号自己规定,通讯的内容要求自己规定。客户端获得数据之后怎么解析,自己规定。

但是网页的访问是唯一的例外,在网页访问的模式下(B/S模式下),一家公司只能决定自己的服务器的代码编写。
端口号和通讯格式都是由http协议规定的。客户端由各种各样其他的公司编写。比如QQ浏览器、谷歌浏览器等等,公司本身和浏览器之间对于数据的展示靠W3C进行规范。但要命的是:
http协议是非常严格的协议。
W3C是一个松散的规定。所以各个浏览器对W3C的理解和兼容各不相同。
所以不能保证一个网站在不同浏览器下的展现完全相同。

说了这么多,大家应该已经明白了在HTTP协议和W3C的规范下,整个WEB领域的整体规则了。
既然浏览器不能由软件开发者自己固定,我们还是得学以致用。
下面将编写一个符合http格式的服务器和浏览器进行交互,来结束我们这个文章。

尝试编写一个服务器

<?php
$socket =stream_socket_server ("tcp://127.0.0.1:8080",$error,$errorMsg);
//本应严格按照浏览器的HTTP约定的端口80,但目前80端口已然被apache接管,故使用8080
if(!$socket)
{
	echo "Errormsg:".$errorMsg;
}
else
{
	echo ("HTTP服务器启动。");
	for(;;)
	{
		$client=stream_socket_accept($socket,-1);//最大阻塞时间MAX
		if($client)
		{
		//严格按照浏览器的HTTP约定组织返回的格式(即请求头格式)
		//  \r\n标识换行,符合上一课中对请求的格式,如果不加/r/n将不符合http格式,浏览器将不能识别。
			$http = fread($client,1024);//请求体
			$content = "HTTP/1.1 200 OK\r\nServer:http_imooc/1.0.0\r\nContent-Length:".strlen($http)."\r\n\r\n{$http}";
		//发送给浏览器
			fwrite($client, $content);
		}
		fclose($client);
	}
	fclose($socket);
}
?>

请大家运行这段代码,并在浏览器当中
输入127.0.0.1:8080
这个服务器代码将返回浏览器对服务器的请求。
(换句话说:这个代码将返回浏览器自行组织的请求字符串的内容。)
(使用不同浏览器,结果应该是不同的,至于为什么大家应该很清楚。)
相信这样可以让大家对整个体系有更好的了解。

学习补充

我在说明的过程中,
跳过了TCP三次握手、四次挥手的实现运输层原理。
同时也没有把服务器的响应代码进行拓展。
因为在实际的网站开发中,甚至服务器的响应变成http的格式都不是由程序员实现的。
更遑论TCP的实现细节。
过分的深入理解会阻止大家对整个过程的学习。
当然如果现在行有余力了,希望大家对TCP\UDP的细节进行具体的学习。
因为其实这也是非常重要的知识点。
**实际上浏览器和服务器之间的交互还存在异步交互(AJAX)的情况。**这种情况下响应体的作用一般是作为JS的数据进行界面数据的渲染,而不是页面加载的渲染。
在真实的浏览器的交互下,虽然服务器服务一个人非常迅速,可以一秒内完成服务。
但是如果服务器长期的处于TCP连接等待状态(客户端突然断网),将影响其他人进行网站访问。
如果一个人连接了服务器,但迟迟不与服务器断开连接,难道服务器不服务其他人吗?
每个语言在socket中都提供了不同的解决方法。
在JAVA中我们采用多线程的方法解决。
在PHP中一般使用IO复用的方法解决TCP多次连接的问题。

推荐阅读:PHP多路复用

期许

最后希望大家可以和我一样,以后可以有自信回答这个问题:
从输入网址到出现网页到底发生了什么?
1、浏览器将你输入的网页发往DNS进行解析,获得IP地址。
2、调用TCP协议和服务器建立连接(三次握手)
2、浏览器自行组织符合HTTP协议格式的数据发往网址对应IP下的80端口——称作请求
3、服务器获得浏览器以TCP协议发送的字符串并进行以http格式对其进行分析,从而组织合理的内容发往浏览器。 ——称作响应
5、浏览器获得响应之后,对数据进行符合http协议要求的格式进行分析提取出响应体并调用符合W3C规范的解释器对获得的数据进行渲染从而显示出各种各样的网页。
6、最后调用TCP协议和服务器断开连接(四次挥手)

希望通过对这个问题的回答,可以帮助大家更好的实现网站的开发。

### 回答1: 好的,我了解了。关于您的问题,整个过程可以分为以下几个步骤: 1. 输入URL:当您在浏览器地址栏中输入URL时,浏览器会将该URL发送到域名系统(DNS),通过域名系统将URL转化为IP地址。 2. 发送HTTP请求:浏览器根据URL发起HTTP请求,请求访问Web服务器的特定资源。 3. 服务器响应:当Web服务器接收到请求时,它将处理请求并返回所请求的资源。 4. 浏览器渲染:浏览器收到服务器响应后,它将解析HTML源代码,并根据CSS样式表和JavaScript代码来渲染页面。 5. 页面展示:最终,浏览器将HTML、CSS和JavaScript代码解析完毕后,它会在屏幕上展示出页面内容。 以上就是从输入URL到页面展示的整个过程,希望能够帮到您。 ### 回答2: 当我们在浏览器的地址栏中输入URL时,整个过程可以分为以下几个步骤: 1. DNS解析:浏览器首先会根据URL中的域名(例如www.example.com)进行DNS解析,将域名解析为对应的IP地址。这一步骤是为了找到存放网页的服务器。 2. 建立TCP连接:浏览器通过IP地址与服务器建立TCP连接。TCP协议提供可靠的连接,确保数据的完整性。 3. 发起HTTP请求:一旦建立了TCP连接,浏览器会向服务器发起HTTP请求,请求包括请求方法、请求头、请求体等信息。请求方法可以是GET、POST等,服务器根据请求的不同做出相应的响应。 4. 服务器处理请求并响应:服务器接收到浏览器的请求后,会根据请求的内容进行相应的处理。处理包括读取数据库、执行后端代码等操作。之后,服务器会生成响应对象,包含响应状态码、响应头、响应体等信息。 5. 接收服务器响应:浏览器接收到服务器的响应后,根据响应头中的Content-Type确定响应的数据类型。如为HTML类型,则浏览器会将响应的HTML代码解析成DOM树。 6. 解析页面并渲染:浏览器根据DOM树构建渲染树,并依据CSS样式对各元素进行布局和样式计算,最终生成页面的渲染结果。同时,浏览器也会执行页面中的JavaScript代码。 7. 页面展示:最后,浏览器将渲染好的页面内容显示在用户的视窗中,用户可以看到页面的展示效果。 总结起来,从输入URL到页面展示,经历了DNS解析、建立TCP连接、发起HTTP请求、服务器处理请求并响应、接收服务器响应、解析页面并渲染等多个步骤。最终,浏览器将渲染好的页面内容显示给用户。 ### 回答3: 从输入URL到页面展示,大致经历如下步骤: 1. 域名解析:当我们在浏览器中输入URL后,首先会进行域名解析。浏览器会向DNS服务器发送域名请求,获取该域名对应的IP地址。 2. 建立连接:浏览器通过获取到的IP地址与Web服务器建立TCP连接。这个过程使用的是三次握手协议,确保连接的可靠性。 3. 发送请求:建立连接后,浏览器会发送HTTP请求给Web服务器,请求的内容包括请求的类型(GET/POST等)、地址、头部信息、可能还包括cookie等相关信息。 4. 服务器处理请求:Web服务器收到请求后,会根据请求内容进行处理。处理过程可能包括调取数据库、运行后台程序等动作。 5. 服务器响应:Web服务器根据请求的内容,返回一个HTTP响应给浏览器。响应的内容包括状态码、响应头部、实际的网页内容等。 6. 下载页面资源:浏览器接收到服务器返回的响应后,会开始下载网页的资源,如HTML、CSS、JavaScript、图片等。浏览器会根据响应头部中的Content-Type确定如何解析资源。 7. 页面渲染:当所有的资源下载完成后,浏览器会根据HTML结构、CSS样式,解析并渲染出网页。浏览器会从上到下解析HTML文档,解析过程包括构建DOM树、计算CSS样式、布局页面等。 8. JavaScript执行:在渲染过程中,浏览器会遇到JavaScript代码。浏览器会逐行解析执行JavaScript代码,并根据代码修改DOM树和样式,可能还会触发网络请求等。 9. 页面展示:当页面渲染和JavaScript执行完成后,页面便可以完整地展示给用户了。用户可以看到页面内容,与页面进行交互。 以上仅是一个大致的过程,实际上还有很多细节和额外的步骤,比如缓存机制、重定向、Cookie处理等等。不同的浏览器、服务器也可能会有些许差异。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值