目所见即所得,充分发挥了一个好的题目的重要性,废话不多说,进入今天的正题。先看一下图,⼤概的就能理解整个过程了,但是有很多点可以细挖:DNS 解析、TCP 三次握⼿、HTTP 报⽂格式、TCP 四次挥⼿等等。
浏览器地址栏是Web浏览器中用于输入网址的区域。当用户在地址栏中输入网址URL(Uniform Resource Locator的缩写)并按下回车键时,浏览器会解析该网址并加载相应的网页内容。这个过程涉及到以下几个关键步骤:
A) 浏览器内核首先搜索自身的DNS缓存,如果命中,则返回域名的IP地址。如果未命中尝试访问操作系统的DNS缓存,我们可以打开chrome流啊兰奇,,在chrome地址栏输入:chrome://net-internals/#dns 查看浏览器内的dns缓存,如果是edge浏览器输入:edge://net-internals/?#dns 点击lookup查询结果,可以点击“Clear host cache”清理浏览器DNS记录。
在windows命令行输入以下命令:nslookup -d www.baidu.com 查询DNS记录信息吗,查询结果如下,截图只是一部分值,可以下去自己了解
A) 操作系统的DNS缓存,以windows系统为例,查找ipconfig/displaydns 里面的内容,如果命中,返回域名的IP地址,如果未命中,尝试读取hosts文件(C:\Windows\System32\drivers\etc)
C、读取hosts文件,如果命中,返回域名的IP地址,如果未命中,尝试调用DNS系统调用发送DNS请求(端口53)到首选的ISP DNS服务器(一般是电信运营商提供)
D、 ISP 的 DNS 服务器:ISP 是互联网服务提供商(Internet Service Provider)的简称,ISP 有专门的 DNS 服务器应对 DNS 查询请求如果在hosts文件中也没有找到对应的条目,浏览器就会发起一个DNS的系统调用,就会向 本地配置的首选DNS服务器(一般是电信运营商提供的)发起域名解析请求(通过的是UDP协议向DNS的53端口发起请求,这个请求是递归的请求,也就是运营商的DNS服务器必须得提供给我们该域名的IP地址)如果命中,返回域名的IP地址,如果未命中尝试根域名服务器(全球13个),进行递归查询。 查询顺序:根服务器--->顶级域名服务器(.com;.cn等)--->然后域名服务器。
总结这样就完成了域名映射的成IP地址
一旦解析出URL对应的IP地址,浏览器会尝试与服务器建立TCP连接。这个过程涉及三次握手(客户端向服务器发送SYN数据包,服务器发送SYN+ACK数据包,客户端发送ACK数据包)以建立可靠的传输通道。
三次握手的过程:
1、客户端发送建立TCP连接的请求报文,其中报文中包含seq序列号,是由发送端随机生成的,并且将报文中的SYN字段置为1,表示需要建立TCP连接。(SYN=1,seq=x,x为随机生成数值);
2、服务端回复客户端发送的TCP连接请求报文,其中包含seq序列号,是由回复端随机生成的,并且将SYN置为1,而且会产生ACK字段,ACK字段数值是在客户端发送过来的序列号seq的基础上加1进行回复,以便客户端收到信息时,知晓自己的TCP建立请求已得到验证。(SYN=1,ACK=x+1,seq=y,y为随机生成数值)这里的ack加1可以理解为是确认和谁建立连接;
3、客户端收到服务端发送的TCP建立验证请求后,会使自己的序列号加1表示,并且再次回复ACK验证请求,在服务端发过来的seq上加1进行回复。(SYN=1,ACK=y+1,seq=x+1)。
为啥要三次握手呢?“为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误”。
一旦TCP连接建立成功,浏览器会向服务器发送一个HTTP请求。这个请求通常包含请求行、请求头和请求体。请求行描述了请求的类型(如GET、POST等)和资源路径。请求头提供了有关请求的详细信息,如请求的HTTP版本、用户代理的信息等,以chrom为例,按下F12即可进入开发模式,NEtwork一栏查看Http请求具体报文
服务器接收到请求后,会根据请求的内容和权限来处理该请求。处理完成后,服务器会向浏览器发送一个HTTP响应。这个响应通常包含一个状态行、响应头和响应体。状态行描述了响应的状态(如200 OK)和消息(如“OK”)。响应头提供了有关响应的详细信息,如响应类型、缓存控制等。响应体包含了服务器返回给浏览器的原始数据。
一旦收到HTTP响应数据,浏览器会解析该数据以构建页面。解析过程中,浏览器会提取响应头中的信息,并根据这些信息来处理页面内容。然后,浏览器会将解析后的页面内容呈现给用户,通常会使用HTML、CSS和JavaScript等技术来实现页面的样式和交互效果。
当浏览器完成对页面的渲染后,它会自动发送一个TCP断开链接的命令(TCP四次挥手),以终止与服务器的连接。这个过程涉及四次挥手(客户端向服务器发送FIN数据包,服务器发送ACK数据包,客户端发送FIN+ACK数据包,服务器发送FIN数据包)以释放资源并断开连接。
四次挥手的详细过程:
1、客户端发送断开TCP连接请求的报文,其中报文中包含seq序列号,是由发送端随机生成的,并且还将报文中的FIN字段置为1,表示需要断开TCP连接。(FIN=1,seq=x,x由客户端随机生成);
2、服务端会回复客户端发送的TCP断开请求报文,其包含seq序列号,是由回复端随机生成的,而且会产生ACK字段,ACK字段数值是在客户端发过来的seq序列号基础上加1进行回复,以便客户端收到信息时,知晓自己的TCP断开请求已经得到验证。(FIN=1,ACK=x+1,seq=y,y由服务端随机生成);
3、服务端在回复完客户端的TCP断开请求后,不会马上进行TCP连接的断开,服务端会先确保断开前,所有传输到A的数据是否已经传输完毕,一旦确认传输数据完毕,就会将回复报文的FIN字段置1,并且产生随机seq序列号。(FIN=1,ACK=x+1,seq=z,z由服务端随机生成);
4、客户端收到服务端的TCP断开请求后,会回复服务端的断开请求,包含随机生成的seq字段和ACK字段,ACK字段会在服务端的TCP断开请求的seq基础上加1,从而完成服务端请求的验证回复。(FIN=1,ACK=z+1,seq=h,h为客户端随机生成)
至此TCP断开的4次挥手过程完毕。
总结从浏览器地址栏输⼊url到显示主⻚的过程涉及多个关键步骤,包括URL解析、建立连接、获取网页内容以及渲染页面等。这些步骤通过复杂的计算机网络和计算机系统实现,使得用户可以轻松地访问Web资源并获得丰富的互联网体验。
参考:https://zhuanlan.zhihu.com/p/609043689
https://zhuanlan.zhihu.com/p/629094462?utm_id=0
https://code84.com/664373.html#
TML 或超文本标记语言 允许 Web 用户使用元素、标签和属性创建和构造部分、段落和链接。然而,值得注意的是,HTML 不能被视为一种编程语言,因为它不能创建动态功能。
HTML有很多用例,即:
本文将介绍 HTML 的基础知识,包括它的工作原理、优缺点以及它与 CSS 和 JavaScript 的关系。
HTML(代表超文本标记语言)是构成大多数网页和在线应用程序的计算机语言。超文本是用于引用其他文本片段的文本,而标记语言是告诉 Web 服务器文档的样式和结构的一系列标记。
在国内的网站上找了一圈,这应该是介绍历史最细致的,长按保存手机里翻译
平均每个网站包含几个不同的信息 HTML 页面。例如,主页、关于页面和联系页面都将具有单独的 HTML 文件。
HTML 文档是以 .html 或 .htm 扩展名结尾的文件。Web 浏览器读取 HTML 文件并呈现其内容,以便互联网用户可以查看它。
所有 HTML 页面都有一系列 HTML 元素,由一组标签和属性组成。HTML 元素是网页的构建块。标签告诉 Web 浏览器元素在哪里开始和结束,而属性描述元素的特征。
元素的三个主要部分是:
这三个部分的组合将创建一个 HTML 元素:
<p>这是在HTML中添加段落的方法。</p>
HTML 元素的另一个关键部分是它的属性,它有两个部分——名称和属性值。名称标识用户想要添加的附加信息,并且属性值给出进一步的说明。
例如,添加紫色和 font-family verdana 的样式元素将如下所示:
< p style= "color:purple;font-family:verdana" >这是在HTML中添加段落的方法。< /p >
另一个属性,HTML 类,对于开发和编程来说是最重要的。class 属性添加了可以作用于具有相同类值的不同元素的样式信息。 例如,我们将对标题 <h1> 和段落 <p> 使用相同的样式。样式包括背景颜色、文本颜色、边框、边距和填充,在 .important 类下。要在 <h1> 和 <p> 之间实现相同的样式,请在每个开始标记后添加 class=”important”:
<html>
<head>
<style>
.important {
background-color: blue;
color: white;
border: 2px solid black;
margin: 2px;
padding: 2px;
}
</style>
</head>
<body>
<h1 class="important">This is a heading</h1>
<p class="important">This is a paragraph.</p>
</body>
</html>
大多数元素都有一个开始标签和一个结束标签,但有些元素不需要结束标签即可工作,例如空元素。这些元素不使用结束标签,因为它们没有内容:
< img src= "/" alt= "图像" >
这个图像标签有两个属性——一个src属性,图像路径,和一个alt属性,描述性文本。但是,它没有内容,也没有结束标签。
最后,每个 HTML 文档都必须以 <!DOCTYPE> 声明开头,以告知 Web 浏览器文档类型。使用 HTML5,doctype HTML public 声明将是:
< !DOCTYPE html >
目前,有 142 个 HTML 标签可以用于创建各种元素。尽管现代浏览器不再支持其中一些标签,但学习所有可用的不同元素仍然是有益的。
第二节将讨论最常用的 HTML 标签和两个主要元素——块级元素和内联元素。
块级元素占据页面的整个宽度。它总是在文档中开始一个新行。例如,标题元素将位于与段落元素不同的行中。
每个 HTML 页面都使用这三个标签:
<html>
<head>
<!-- META INFORMATION -->
</head>
<body>
<!-- PAGE CONTENT -->
</body>
</html>
其他流行的块级标签包括:
内联元素格式化块级元素的内部内容,例如添加链接和强调的字符串。内联元素最常用于在不破坏内容流的情况下格式化文本。
例如,一个 <strong> 标签会以粗体呈现一个元素,而 <em> 标签会以斜体显示它。超链接也是使用 <a> 标记和 href 属性来指示链接目标的内联元素:
<a href="https://www.icodingdeu.com/" >点我!</a>
HTML 的第一个版本由 18 个标签组成。从那时起,每个新版本都带有添加到标记中的新标签和属性。迄今为止,该语言最重大的升级是 2014 年引入的 HTML5。
HTML 和 HTML5的主要区别在于HTML5 支持新类型的表单控件。HTML5 还引入了几个语义标签,可以清楚地描述内容,例如 <article>、<header> 和 <footer>。
就像任何其他计算机语言一样,HTML 有其优点和局限性。以下是 HTML 的优缺点:
优点:
就像任何其他计算机语言一样,HTML 有其优点和局限性。以下是 HTML 的优缺点:
缺点:
HTML 用于添加文本元素并创建内容结构。然而,仅仅建立一个专业的和完全响应的网站是不够的。因此,HTML 需要借助层级样式表 (CSS)和JavaScript来创建绝大多数网站内容。
HTML 是 Internet 上的主要标记语言。每个 HTML 页面都有一系列创建网页或应用程序内容结构的元素。
HTML 是一种对初学者友好的语言,有很多支持,主要用于静态网站页面。HTML 与用于样式的 CSS 和用于功能的 JavaScript 一起使用效果最好。
我们还向您展示了一些在线教学课程,它们将有助于提高您的 HTML 知识或提供对 HTML 的基本理解。
如果您有任何其他喜欢的资源来学习 HTML,请在评论部分告诉我们。
分享成果,随喜正能量】人生,既为过客,何须执着,有些事情,注定无法左右,总要学会放下,懂得随缘。你所追求的,也许最后是一场空,不是你不够努力,是一开始,结局已经注定。。
《VBA信息获取与处理》教程是我推出第六套教程,目前已经是第一版修订了。这套教程定位于最高级,是学完初级,中级后的教程。这部教程给大家讲解的内容有:跨应用程序信息获得、随机信息的利用、电子邮件的发送、VBA互联网数据抓取、VBA延时操作,剪贴板应用、Split函数扩展、工作表信息与其他应用交互,FSO对象的利用、工作表及文件夹信息的获取、图形信息的获取以及定制工作表信息函数等等内容。程序文件通过32位和64位两种OFFICE系统测试。是非常抽象的,更具研究的价值。
教程共两册,八十四讲。今日的内容是专题八“VBA与HTML文档”:查找百度首页的网页元素
大家好,我们开始HTML DOM常见对象的方法的讲解,所谓的方法就是对象自身的动作。HTML DOM 方法就是我们可以在节点(HTML 元素)上执行的动作,比如添加或修改元素。
一些常用的 HTML DOM 方法:
getElementById(id) 获取带有指定 id 的节点(元素)
getElementsByTagName() 返回包含带有指定标签名称的所有元素的节点列表(集合/节点数组)。
getElementsByClassName() 返回包含带有指定类名的所有元素的节点列表。
appendChild(node) 插入新的子节点(元素)
removeChild(node) 删除子节点(元素)
insertBefore() 在指定的子节点前面插入新的子节点。
getAttribute() 返回指定的属性值。
HTML DOM 方法还有很多,我们经常利用的就是上述前三个我用红色标记的方法。
所谓访问HTML 元素(节点)就是上述方法的利用,我们举例说明:
1) getElementById() 方法返回带有指定 ID 的元素:
语法:document.getElementById("id");
如获取 id="intro" 的元素:document.getElementById("intro");
2) getElementsByTagName() 返回带有指定标签名的所有元素。
语法:document.getElementsByTagName("tagname");
如获得所有 <p> 元素的列表:document.getElementsByTagName("p");
3)getElementsByClassName() 查找带有相同类名的所有 HTML 元素。
如获得所有包含 class="intro" 的所有元素的一个列表:document.getElementsByClassName("intro");
注意:getElementsByClassName() 在 Internet Explorer 5,6,7,8 中无效。
有了上面的理论讲解,我们看看在实际的应用中如何查找所需要的网页元素:
1)当我们可以很清晰的观测到,节点的某些属性时,就可以直接定位它。元素节点的主要的定位属性有:id、name和索引号。元素起始标签的语法:<标签 id="xx" name="xx" value=”xx”...>,而索引号,是按源代码书写的顺序,给每类的元素的成员进行编号(类似每类元素,形成一个数组,从0开始编号)。通过元素类别和编号,我们可以很容易的找到它。我们利用的主要工具:
getElementById(“元素的id属性”)或all(“元素的id属性”):返回拥有指定id的元素集合
getElementsByName(“元素的name属性”)或all(“元素的name属性”):返回拥有指定名称的元素的集合
getElementsByTagName(“标签名称”)或all.tags(“标签名称”):返回该类标签的元素集合。
all(索引号):返回指定索引号的元素节点。
2)我们还可以从body元素/节点开始,一级级去寻找,也可以先定位到它的毗邻节点/元素,再通过判断,去查找它的精确位置。从节点方面而言,树形的模型的节点有个特征,除了根节点,每个节点均只有一个父节点(parentNode),有一个或者多个子节点(childNodes,类似一个对象集合或对象数组,从0开始编号)。因此,通过节点的亲属关系,进行判断查找,我们就可以一步步的在父子节点中切换,获取所需的元素。节点有一些属性,可以利于我们的查找判断,如下:
nodeName(节点名称):元素节点的名称为其标签名,属性节点的名称为其属性名称;
nodeValue(节点值):文本节点的值为其包含的文本,属性节点的值为其包含的属性值;
nodeType(节点类型):元素节点为1、属性节点为2、文本节点为3、注释节点为8、文档节点为9。另外,从元素方面而言,要定位元素的父元素可以通过parentElement属性,定位元素的子元素集合可以通过children属性,判断其标签的名称(tagname),他的值(value),内含文本(innertext)等方式来进行查找。最后,定位节点/元素的下一个同级兄弟可以通过nextSibling属性,定位上一个同级兄弟可以用previousSibling属性。
我们去捕捉百度首页,那个提交搜索的表单。这个表单的名称是”f”,然后查询它的innerHtml和OuterHtml。
Sub MYNZA() '捕捉百度首页,提交搜索的表单
【代码见教程】
End Sub
代码截图:
输出结果:
innerHtml:
<input name="ie" type="hidden" value="utf-8"><input name="f" type="hidden" value="8"><input name="rsv_bp" type="hidden" value="1"><input name="rsv_idx" type="hidden" value="1"><input name="ch" type="hidden" value=""><input name="tn" type="hidden" value="baidu"><input name="bar" type="hidden" value=""><span class="bg s_ipt_wr iptfocus quickdelete-wrap"><span class="soutu-btn"></span><input name="wd" class="s_ipt" id="kw" maxlength="255" value="" autocomplete="off"><a title="清空" class="quickdelete" id="quickdelete" style="top: 0px; right: 0px; display: none;" href="javascript:;"></a><span class="soutu-hover-tip" style="display: none;">按图片搜索</span></span><span class="bg s_btn_wr"><input class="bg s_btn" id="su" type="submit" value="百度一下"></span><span class="tools"><span id="mHolder"><div id="mCon"><span>输入法</span></div><ul id="mMenu"><li><a name="ime_hw" href="javascript:;">手写</a></li><li><a name="ime_py" href="javascript:;">拼音</a></li><li class="ln"></li><li><a name="ime_cl" href="javascript:
;">关闭</a></li></ul></span></span><input name="rn" type="hidden" value=""><input name="fenlei" type="hidden" value="256"><input name="oq" type="hidden" value=""><input name="rsv_pq" type="hidden" value="8da8d8ec001a725c"><input name="rsv_t" type="hidden" value="b2b39kZjoN4DHoLoPMw+sMpFZqL/TpIfDe8w9ONePLlGObWa6DFTgMgCmyY"><input name="rqlang" type="hidden" value="cn"><input name="rsv_dl" type="hidden" value="ib"><input name="rsv_enter" type="hidden" value="1">
OuterHtml:
<form name="f" class="fm" id="form" action="/s"><input name="ie" type="hidden" value="utf-8"><input name="f" type="hidden" value="8"><input name="rsv_bp" type="hidden" value="1"><input name="rsv_idx" type="hidden" value="1"><input name="ch" type="hidden" value=""><input name="tn" type="hidden" value="baidu"><input name="bar" type="hidden" value=""><span class="bg s_ipt_wr iptfocus quickdelete-wrap"><span class="soutu-btn"></span><input name="wd" class="s_ipt" id="kw" maxlength="255" value="" autocomplete="off"><a title="清空" class="quickdelete" id="quickdelete" style="top: 0px; right: 0px; display: none;" href="javascript:;"></a><span class="soutu-hover-tip" style="display: none;">按图片搜索</span></span><span class="bg s_btn_wr"><input class="bg s_btn" id="su" type="submit" value="百度一下"></span><span class="tools"><span id="mHolder"><div id="mCon"><span>输入法</span></div><ul id="mMenu"><li><a name="ime_hw" href="javascript:;">手写</a></li><li><a name="ime_py" href="javascript:;">拼音</a></li><li class=
"ln"></li><li><a name="ime_cl" href="javascript:;">关闭</a></li></ul></span></span><input name="rn" type="hidden" value=""><input name="fenlei" type="hidden" value="256"><input name="oq" type="hidden" value=""><input name="rsv_pq" type="hidden" value="8da8d8ec001a725c"><input name="rsv_t" type="hidden" value="b2b39kZjoN4DHoLoPMw+sMpFZqL/TpIfDe8w9ONePLlGObWa6DFTgMgCmyY"><input name="rqlang" type="hidden" value="cn"><input name="rsv_dl" type="hidden" value="ib"><input name="rsv_enter" type="hidden" value="1"></form>
从以上的返回结果,大家也可以看出document 对象的innerHtml和OuterHtml属性的不同。
本节知识点回向:
HTML DOM对象常用的方法有哪些?如何利用
本节参考文件:008工作表.xlsm
我20多年的VBA实践经验,全部浓缩在下面的各个教程中,教程学习顺序:
【分享成果,随喜正能量】做人是一件很麻烦的事,所有说法和实情之间都存在这巨大的空隙,好像一生都在和这个东西挣扎,分辨力越强这空隙越深不见底,最后似乎只好把空虚视为答案和真相。。
*请认真填写需求信息,我们会在24小时内与您取得联系。