整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

HTML-1(study)

*******HTML********

**Web服务本质**

import socket

sk = socket.socket()

sk.bind(("127.0.0.1", 8080))

sk.listen(5)

while True:

conn, addr = sk.accept()

data = conn.recv(8096)

conn.send(b"HTTP/1.1 200 OK\r\n\r\n")#http协议 简化

conn.send(b"<h1>Hello world!</h1>")#发送内容

conn.close()

sk.close()

浏览器发送请求-->HTTP协议-->服务器接受请求-->服务端返回响应-->服务端把HTML文件内容发送给浏览器-->浏览器渲染页面

What HTML?

*超文本标记语言(Hypertext Markup Language,HTML)是一种用于创建网页标记语言

*本质上是浏览器可识别的规则,我们按照规则写网页,浏览器根据规则渲染我们的页面。

对于不同的浏览器,对于同一个标签可能会有不同的解释。(兼容性问题)

*网页文件的扩展名:.html或.htm

*HTML是一种标记语言,他不是一种编程语言,HTML使用标签来描述网页。

****HTML文档结构****

*最基本的HTML文档**

<!DOCTYPE html>

<html lang = 'zh-CN'>

<head>

<meta chrset = 'UTF-8'>

<title> 标题 </title>

</head>

<body>

</body>

</html>

#解释

1.<!DOCTYPE html>声明为HTML5文档

2.<html></html>是文档的开始标记语言和结束标记,是HTML页面的根本元素,在他们之间是文档的头部(head)和主题(body)

3.<head></head>定义了HTML文档的开头部分。他们之间的内容不会在浏览器的文档窗口显示。包含了文档的元(meta)数据

4.<title></title>定义了网页标题,在浏览器标题栏显示

5.<body></body>之间的文本是可见的网页主体内容

注意:

对于中文网页需要使用<meta charset='utf-8'>声明编码。否则会出现乱码。这些浏览器会设置GBK为默认编码,则需要我们设为

<meta charset='gbk'>

****HTML标签格式****

*HTML标签是由尖括号包围的关键字

*HTML标签通常是成对出现的,比如:<div>和</div>,第一个标签是开始,第二个标签是结束。结束标签会有斜线。

*也有一部分标签是单独呈现的,比如:<br/>、<hr/>、<img src="1.jpg" />等。

*标签里面可以有若干属性,也可以不带属性。

****标签的语法

<标签名 属性1=“属性值1” 属性2=“属性值2”……>内容部分</标签名>

<标签名 属性1=“属性值1” 属性2=“属性值2”…… />

几个很重要的属性:

id:定义标签的唯一ID,HTML文档树中唯一

class:为html元素定义一个或多个类名(classname)(CSS样式类名)

style:规定元素的行内样式(CSS样式

****HTML注释

<!--注释内容-->

****<!DOCTYPE>标签****

<!DOCTYPE> 声明必须是HTML文档的第一行,位于<html>标签之前

<!DOCTYPE> 声明不是HTML标签,他是指示web浏览器关于页面使用哪个HTML版本进行编写的指令

****HTML常用标签****

**head内常用的标签**

1.<title></title> 定义网页的标题

2.<style></style> 定义内部样式表

3.<script><script>定义JS代码或引入外部JS文件

4.<link/> 引入外部样式文件

5.<meta/>定义网页原信息

****Meta标签

Meta标签介绍:

<meta>元素可提供有关页面的原信息(mata-information),针对搜索引擎和更新频度的描述和关键词。

<meta>标签位于文档的头部,不包含任何内容。

<meta>提供的信息是用户不可见的。

meta标签的组成:meta标签共有两个属性,它们分别是http-equiv属性和name 属性,不同的属性又有不

同的参数值,这些不同的参数值就实现了不同的网页功能。

1.http-equiv属性:相当于http的文件头作用,它可以向浏览器传回一些有用的信息,以帮助正确地显示

网页内容,与之对应的属性值为content,content中的内容其实就是各个参数的变量值。

<!--2秒后跳转到对应的网址,注意引号-->

<meta http-equiv="refresh" content="2;URL=https://www.baidu.com">

<!--指定文档的编码类型-->

<meta http-equiv="content-Type" charset=UTF8">

<!--告诉IE以最高级模式渲染文档-->

<meta http-equiv="x-ua-compatible" content="IE=edge">

2.names属性:主要用于描述网页,与之对应的属性值为content,content中的内容主要是便于搜索引擎

机器人查找信息和分类信息用的

<meta name="keywords" content="meta总结,html meta,meta属性,meta跳转">

<meta name="description" content="Python">

******body内常用表标签******

****基本标签(块级标签和内联标签)****

<b>加粗</b>

<i>斜体</i>

<u>下划线</u>

<a>删除</a>

<p>段落标签</p>

<h1>标题1</h1>

<h2>标题2</h2>

<h3>标题3</h3>

<h4>标题4</h4>

<h5>标题5</h5>

<h6>标题6</h6>

<!--换行-->

<br>

<!--水平线-->

<hr>

****特殊字符****

空格------

>-------->

<--------<

&--------&

¥--------¥

版权(©️)---©

注册(®️)---®

****div标签和span标签****

div标签用来定义一个块级元素,并无实际的意义。主要通过CSS样式为其赋予不同的表现。

span标签用来定义内联(行内)元素,并无实际的意义。主要通过CSS样式为其赋予不同的表现。

块级元素与行内元素的区别:

所谓块元素,是以另起一行开始渲染的元素,行内元素则不需另起一行。如果单独在网页中插入这两个元素,不会对页面产生任何的影响。

这两个元素是专门为定义CSS样式而生的。

注意:

关于标签嵌套:通常块级元素可以包含内联元素或某些块级元素,但内联元素不能包含块级元素,它只能包含其它内联元素。

p标签不能包含块级标签,p标签也不能包含p标签。

****img标签****

<img src='图片路径' alt='图片未加载成功时的提示' title='鼠标悬浮时提示信息' width='宽' height='高(宽高只有一个会等比缩放)'>

****a标签****

超链接标签

所谓的超链接是指从一个网页指向一个目标的连接关系,这个目标可以是另一个网页,

也可以是相同网页上的不同位置,还可以是一个图片,一个电子邮件地址,一个文件,

甚至是一个应用程序。

什么是URL?

URL是统一资源定位器(Uniform Resource Locator)的缩写,也被称为网页地址,是因特网上标准的资源的地址。

URL举例

http://www.baidu.com/stu/index.html

http://111.13.100.91/stu/index.html

URL地址由4部分组成

第1部分:为协议:http://、ftp://等

第2部分:为站点地址:可以是域名或IP地址

第3部分:为页面在站点中的目录:stu

第4部分:为页面名称,例如 index.html

各部分之间用“/”符号隔开。

<a href='https://www.baidu.com' target='_blank'>点击我</a>

href属性指定目标网页地址。该地址可以有几种类型:

1.绝对URL-指向另一个站点(不如 href = 'https://www.baidu.com')

2.相对URL-指向当前站点中确切的路径(href = 'index.html')

3.锚URL-指向页面中的锚(href = '#top')

target:

1._blank表示在新标签页中打开目标页面

2._self表示在当前标签页中打开目标页面

****列表*****

1.无序列表

<ul type="disc">

<li>第一项</li>

<li>第二项</li>

</ul>

type属性:

1.disc(实心圆点,默认值)

2.circle(空心圆圈)

3.square(实行方块)

4.none(无样式)

2.有序列表

<ol type="1" start="2">

<li>第一项</li>

<li>第二项</li>

</ol>

type属性:

1.1数字列表,默认值

2.A大写字母

3.a小写字母

4.I大写罗马

5.i小写罗马

3.标题列表

<dl>

<dt>标题1</dt>

<dt>内容1</dt>

<dt>标题2</dt>

<dt>内容1</dt>

<dt>内容2</dt>

</dl>

****表格****

表格是一个二维数据空间,一个表格由若干行组成,一行又有若干单元格组成,单元格里面可以

包括文字。列表。图案。表单。数字符号。预置文本和其它的表格等内容。

表格最重要的目的是显示表格类数据。

表格类数据是值最适合组织为表格格式(即按行和列组织)的数据

表格基本结构:

<table>

<thead>

<tr>

<td>序号</td>

<td>姓名</td>

<td>爱好</td>

</tr>

</theaf>

<tbody>

<tr>

<td>1</td>

<td>tom</td>

<td>吃老鼠</td>

</tr>

<tr>

<td>2</td>

<td>Jacl</td>

<td>吃奶酪</td>

</tr>

</tbody>

</table>

属性:

1.border:表格边框

2.cellpadding:内边距

3.cellspacing:外边距

4.width:像素百分比(最好通过css来设置长度)

5.rowspan:单元格竖跨多少行

6.colspan:单元格横跨多少列(即合并单元格)

****form(表单)****

功能;

表单用于向服务器传输数据,从而实现用户与web服务器的交互

表单能够包含input系列标签,比如文本字段、复选框、单选框、提交按钮等等

表单还可以包含textarea、select、fieldest和lable标签

***表单属性

1.accept-charset 规定在被提交表单中使用的字符集(默认:页面字符集)

2.action 规定在何处提交表单的地址(URL)(提交页面)

3.autocomplete 规定浏览器应该自动完成表单(默认:开启)

4.enctype 规定被提交数据的编码(默认:url-encoded)

5.method 规定在提交表单时所用的HTTP方法(默认GET)

6.name 规定识别表单的名称(对于DOM使用:document.forms.name)

7.novalidate规定浏览器不验证表单

8.target规定action属性中地址的目标(默认_self)

***表单元素

基本概念:

HTML表单是HTML元素中较为复杂的部分,表单往往和脚本、动态页面、数据处理等功能相结合,因此它是制作动态网站很重要的内容。

表单一般用来收集用户的输入信息

表单工作原理:

访问者在浏览有表单的网页时,可填写必需的信息,然后按某个按钮提交。这些信息通过Internet传送到服务器上。

服务器上专门的程序对这些数据进行处理,如果有错误会返回错误信息,并要求纠正错误。

当数据完整无误后,服务器反馈一个输入完成的信息。

******input******

<input>元素会根据不同的type属性,变化为多种形态

type属性值表现形式对应代码

text单行输入文本<input type="text" />

password密码输入框<input type="password" />

date日期输入框<input type="date" />

checkbox复选框<input type="checkbox" checked="checked" />

radio单选框<input type="radio" />

submit提交按钮<input type="submit" value="提交" />

reset重置按钮<input type="reset" value="重置" />

button普通按钮<input type="button" value="普通按钮" />

hidden隐藏输入框<input type="hidden" />

file文本选择框<input type="file" />

属性说明:

1.name:表单提交时的“键”,注意和id的区别

2.value:表单提交时对应项的值

type = “button”,“reset”,“submit”时,为按钮上显示的文本信息

type = “text”,“password”,“hidden“时,为输入框的初始值

type = ”checkbox“,”radio“,”file“时,为输相关联的值

3.checked:radio和checkbox默认被选中的项

4.readonly:text和password设置只读

5.disabled:所有input均适用

******select标签******

<from action="" method="post">

<select name="city" id="city">

<option value="1">北京</option>

<option selected="selected" value="2">成都</option>

<option value="3">西安</option>

</select>

</form>

属性说明:

1.multiple:布尔属性,设置后为多选,否则默认单选

2.disabled:禁用

3.selected:默认选中该项

4.value:定义提交时的选项值

******lable标签******

定义:<lable>标签为input元素定义标注(标记)

说明:

1.label元素不会向用户呈现任何特殊效果

2.<lable>标签的for属性值应当与相关元素的id属性值相同

<form>

<lable for="username">用户名</lable>

<input type="text" id="username" name="username">

</form>

******textarea多行文本******

<textarea name="memo" id="memo" cols="30" rows="10">

默认内容

</textarea>

属性说明:

1.name:名称

2.rows:行数

3.cols:列数

4.disable:禁用

象语法树(Abstract Syntax Trees),简称AST,如果您正在编写代码,那么 AST 很可能已经参与了您的开发流程。它们为您的开发流程的许多部分提供动力。 有些人可能在编译器的上下文中听说过它们,但它们被用于各种工具中。 即使您不编写通用开发工具,AST 也可能是您工具带中的有用工具。 在这篇文章中,我们将讨论什么是 AST,它们在哪里使用以及如何利用它们。

什么是AST

抽象语法树或 AST 是代码的树型数据结构表示。 它们是编译器工作方式的基本部分。 当编译器转换某些代码时,基本上有以下步骤:

  1. 词法分析
  2. 语法分析
  3. 代码生成

词法分析又名标记化

在此步骤中,您编写的代码将被转换为一组描述代码不同部分的标记。 这与基本语法突出显示使用的方法基本相同。 这些标记令牌不了解事物如何组合在一起,并且仅关注文件的组件。

你可以想象这就像你将一个文本分解成单词。 您可能能够区分标点符号、动词、名词、数字等,但在这个阶段,您对句子的组成部分或句子如何组合没有任何更深入的了解。

语法分析又名解析

这是我们将标记列表转换为抽象语法树的步骤。 它将我们的标记转换为表示代码实际结构的树。 以前在标记中我们只有一对 (),现在我们知道它是函数调用、函数定义、分组还是其他东西。

这里的等价物是将我们的单词列表转换为表示诸如句子之类的数据结构,某个名词在句子中扮演什么角色,或者我们是否在列表中。

另一个可以与之比较的例子是 DOM。 上一步只是将 HTML 分解为“标签”和“文本”,而这一步将生成表示为 DOM 树的层次结构。

需要注意的一件事是没有“单一”的 AST 格式。 它们可能会有所不同,这取决于您要转换为 AST 的语言以及您用于解析的工具。 在 JavaScript 中,一个通用标准是 ESTree,但您会看到不同的工具可能会添加不同的属性。

一般来说,AST 是一种树结构,其中每个节点至少有一个类型来指定它所代表的内容。

代码生成

此步骤本身可以是多个步骤。 一旦我们有了抽象语法树,我们就可以操作它,也可以将它“打印”到不同类型的代码中。 使用 AST 操作代码比直接在代码上作为文本或标记列表执行这些操作更安全。

操纵文本总是很危险的; 它显示最少的上下文。 如果您曾经尝试使用字符串替换或正则表达式来操作文本,您可能会注意到很容易出错。而且不容易调试。

甚至操纵令牌也不容易。 虽然我们可能知道变量是什么,但如果我们想重命名它,我们将无法深入了解变量的范围或可能与之冲突的任何变量。

AST 提供了有关代码结构的足够信息,我们可以更有信心地对其进行修改。 例如,我们可以确定变量的声明位置,并确切地知道由于树结构而影响程序的哪个部分。

一旦我们操纵了树,我们就可以打印树以输出任何预期的代码输出。 例如,如果我们要构建一个像 TypeScript 编译器这样的编译器,我们会输出 JavaScript,而另一个编译器可能会输出机器代码。

同样,使用 AST 更容易实现这一点,因为相同结构的不同输出可能具有不同的格式。 使用更线性的输入(如文本或标记列表)生成输出会相当困难。

如何处理 AST?

理论涵盖了哪些实际生活中的 AST 用例? 我们讨论了编译器,但我们并不是整天都在构建编译器。

AST 的用例很广泛,通常可以分为三个总体操作:读取、修改和打印。 它们是一种添加剂,这意味着如果您正在打印 AST,那么您以前也阅读过 AST 并对其进行修改的可能性很高。 但我们将介绍每个主要关注一个用例的示例。

读取/遍历 AST

从技术上讲,使用 AST 的第一步是解析文本以创建 AST,但在大多数情况下,提供解析步骤的库也提供了一种遍历 AST 的方法。遍历 AST 意味着访问树的不同节点以获取细节或执行操作。

最常见的用例之一是 linting。 例如,ESLint 使用 espree 生成 AST,如果您想编写任何自定义规则,您将根据不同的 AST 节点编写这些规则。 ESLint 文档有大量关于如何构建自定义规则、插件和格式化程序的文档。

修改/转换 AST

如前所述,与将代码修改为标记或原始字符串相比,拥有 AST 使修改所述树更容易、更安全。您可能想要使用 AST 修改某些代码的原因有很多种。

例如,Babel 修改 AST 以向下编译新功能或将 JSX 转换为函数调用。例如,当您编译 React 或 Preact 代码时会发生这种情况。

另一个用例是捆绑代码。在模块的世界中,捆绑代码通常比将文件附加在一起要复杂得多。更好地了解各个文件的结构可以更轻松地合并这些文件并在必要时调整导入和函数调用。如果您查看 webpack、parcel 或 rollup 等工具的代码库,您会发现它们都使用 AST 作为其捆绑工作流程的一部分。

打印 AST

在大多数情况下,打印和修改 AST 是齐头并进的,因为您必须输出刚刚修改的 AST。 但是,虽然像 recast 这样的一些库明确专注于以与原始代码样式相同的代码样式打印 AST,但也有各种用例,您希望以不同的方式显式打印您的 AST。

例如,Prettier 使用 AST 根据您的配置重新格式化您的代码,而无需更改代码的内容/含义。 他们这样做的方式是将您的代码转换为完全与格式无关的 AST,然后根据您的规则重写它。

其他常见的用例是用不同的目标语言打印代码或构建自己的缩小工具。

您可以使用几种不同的工具来打印 AST,例如 escodegen 或 astring。 您还可以根据您的用例构建自己的格式化程序,或者为 Prettier 构建一个插件。

最后:

虽然 AST 可能是大多数开发人员每天都不会使用的东西,但我相信了解它对今后的工作会有帮助。感谢阅读。

. 写在前面

对于互联网我们都不陌生,它完完全全改变了我们的生活,生活在这样的时代还是很幸福的。我们平时查百度、逛淘宝、京东、用腾讯、爱奇艺看视频等,我们在浏览器输入一个域名,就可以进入到我们想要的系统或页面,这其中发生了什么?是怎样的流程,我想大多数人是不太清楚的,猿人就来给大家聊聊。

总体来说分为以下几个过程:

  • DNS 解析:将域名解析成 IP 地址
  • TCP 连接:TCP 三次握手
  • 发送 HTTP 请求
  • 服务器处理请求并返回 HTTP 报文
  • 浏览器解析渲染页面
  • 断开连接:TCP 四次挥手

2. URL是什么?

URL是英语Uniform Resource Locator的缩写,中文名叫:统一资源定位符(或称统一资源定位器/定位地址、URL地址),有时也被俗称为网页地址(网址)。

URL就如同在网络上的门牌,是因特网上标准的资源的地址(Address)。它最初是由蒂姆·伯纳斯-李发明用来作为万维网的地址。现在它已经被万维网联盟编制为因特网标准。

标准的格式如下:

scheme://host.domain:port/path/filename

各部分解释如下:

  • scheme - 定义因特网服务的类型。常见的协议有 http、https、ftp、file,其中最常见的类型是 http,而 https 则是进行加密的网络传输。
  • host - 定义域主机(http 的默认主机是 www)
  • domain - 定义因特网域名,比如 http://w3school.com.cn
  • port - 定义主机上的端口号(http 的默认端口号是 80)
  • path - 定义服务器上的路径(如果省略,则文档必须位于网站的根目录中)
  • filename - 定义文档/资源的名称

3. 域名解析(DNS)

域名解析是把域名指向网站空间IP,让人们通过注册的域名可以方便地访问到网站的一种服务。IP地址是网络上标识站点的数字地址,为了方便记忆,采用域名来代替IP地址标识站点地址。域名解析就是域名到IP地址的转换过程。域名的解析工作由DNS服务器完成。

3.1 IP地址

IP 地址是指互联网协议地址,是 IP Address 的缩写。IP 地址是 IP 协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。IP 地址是一个 32 位的二进制数,比如 127.0.0.1 为本机 IP。

3.2 什么是域名解析

域名解析也叫域名指向、服务器设置、域名配置以及反向IP登记等等。说得简单点就是将好记的域名解析成IP,服务由DNS服务器完成,是把域名解析到一个IP地址,然后在此IP地址的主机上将一个子目录与域名绑定。

互联网中的地址是数字的IP地址,域名解析的作用主要就是为了便于记忆。

DNS 协议提供通过域名查找 IP 地址,或逆向从 IP 地址反查域名的服务。DNS 是一个网络服务器,我们的域名解析简单来说就是在 DNS 上记录一条信息记录。

例如 baidu.com 220.114.23.56(服务器外网IP地址)80(服务器端口号)

3.3 浏览器如何通过域名去查询 URL 对应的 IP 呢

当应用过程需要将一个主机域名映射为IP地址时,就调用域名解析函数,解析函数将待转换的域名放在DNS请求中,以UDP报文方式发给本地域名服务器。本地的域名服务器查到域名后,将对应的IP地址放在应答报文中返回。同时域名服务器还必须具有连向其他服务器的信息以支持不能解析时的转发。若域名服务器不能回答该请求,则此域名服务器就暂成为DNS中的另一个客户,向根域名服务器发出请求解析,根域名服务器一定能找到下面的所有二级域名的域名服务器,这样以此类推,一直向下解析,直到查询到所请求的域名。

4. 新建连接(TCP三次握手)

TCP位于传输层,作用是提供可靠的字节流服务,为了准确无误地将数据送达目的地,TCP协议采纳三次握手策略。

所谓三次握手(Three-way Handshake),是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。

三次握手的目的是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号并交换 TCP 窗口大小信息.在socket编程中,客户端执行connect()时。将触发三次握手。

原理

1)发送端首先发送一个带有SYN(synchronize)标志地数据包给接收方。
2)接收方接收后,回传一个带有SYN/ACK标志的数据包传递确认信息,表示我收到了。
3)最后,发送方再回传一个带有ACK标志的数据包,代表我知道了,表示’握手‘结束。

通俗的说法

1)Client:嘿,李四,是我,听到了吗?
2)Server:我听到了,你能听到我的吗?
3)Client:好的,我们互相都能听到对方的话,我们的通信可以开始了。

5. 发送HTTP请求

TCP 三次握手结束后,开始发送 HTTP 请求报文。

请求报文由请求行(request line)、请求头(header)、请求体三个部分组成,如下图所示:

6. 服务端处理

服务器是网络环境中的高性能计算机,它侦听网络上的其他计算机(客户机)提交的服务请求,并提供相应的服务,比如网页服务、文件下载服务、邮件服务、视频服务。而客户端主要的功能是浏览网页、看视频、听音乐等等,两者截然不同。 每台服务器上都会安装处理请求的应用——web server。常见的 web server 产品有 apache、nginx、IIS 或 Lighttpd 等。 web server 担任管控的角色,对于不同用户发送的请求,会结合配置文件,把不同请求委托给服务器上处理相应请求的程序进行处理(例如 CGI 脚本,JSP 脚本,servlets,ASP 脚本,服务器端 JavaScript,Java或者一些其它的服务器端技术等),然后返回后台程序处理产生的结果作为响应。

MVC 后台处理

SpirngMVC的执行流程,猿人也给大家画出来了,很详细哦!

http响应报文格式

Http状态码

对于每一个请求,http服务器都会返回一个结果,不管是成功还是失败,不同的状态码代表某一类结果。比如1开头的代表服务器收到请求,需要请求者继续执行操作,2开头的代表返回成功,3开头的代表重定向,4开头的代表客户端错误,5开头的代表服务端错误。这样我们就可以根据这些数字来判断是否执行完成,也可以用来定位排查问题。

1** 信息,服务器收到请求,需要请求者继续执行操作
2** 成功,操作被成功接收并处理
3** 重定向,需要进一步的操作以完成请求
4** 客户端错误,请求包含语法错误或无法完成请求
5** 服务器错误,服务器在处理请求的过程中发生了错误

7. 浏览器解析渲染

浏览器按顺序解析HTML文件,构建DOM树。准确地说,浏览器需要加载解析的不仅仅是HTML,还包括CSS、JS以及图片、视频等其他媒体资源。

浏览器通过解析HTML,生成DOM树,解析CSS,生成CSS规则树,然后通过DOM树和CSS规则树生成渲染树。渲染树与DOM树不同,渲染树中并没有head、display为none等不必显示的节点。

要注意的是,浏览器的解析过程并非是串连进行的,比如在解析CSS的同时,可以继续加载解析HTML,但在解析执行JS脚本时,会停止解析后续HTML。

为了更好的用户体验,渲染引擎将会尽可能早的将内容呈现到屏幕上,并不会等到所有的html都解析完成之后再去构建和布局render树。它是解析完一部分内容就显示一部分内容,同时,可能还在通过网络下载其余内容。

8. 断开连接(TCP四次挥手)

上述所有步骤完成后,就需要断开连接了。就比如我们两个人打电话,打完后就需要挥一挥手,告别了,不然要扣话费了。同样的道理,如果上述步骤执行完成后,不断开连接,则会消耗网络资源。

TCP的连接的拆除需要发送四个包,因此称为四次挥手(four-way handshake)。客户端或服务器均可主动发起挥手动作,在socket编程中,任何一方执行close()操作即可产生挥手操作。

意义:当被动方收到主动方的FIN报文通知时,它仅仅表示主动方没有数据再发送给被动方了。但未必被动方所有的数据都完整的发送给了主动方,所以被动方不会马上关闭SOCKET,它可能还需要发送一些数据给主动方后,再发送FIN报文给主动方,告诉主动方同意关闭连接,所以这里的ACK报文和FIN报文多数情况下都是分开发送的。

原理

1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。

通俗的说法

1)Client:我所有东西都说完了
2)Server:我已经全部听到了,但是等等我,我还没说完
3)Server:好了,我已经说完了
4)Client:好的,那我们的通信结束

9. 总结

写到这里,我们基本上从技术的角度讲解了从URL输入到获取资源,整个流程发生了什么。我们再来捋一捋,首先是DNS 解析:将域名解析成 IP 地址,解析完成后就需要建立TCP 连接:TCP 三次握手,然后发送 HTTP 请求,再到服务器处理请求并返回 HTTP 报文,服务器处理完成后浏览器解析渲染页面,最后断开连接:TCP 四次挥手,这样整个流程就算是完成了,这个时候我们就可以在渲染的页面愉快的看视频、听音乐、打游戏了,哈哈!

你多学一样本事,就少说一句求人的话,现在的努力,是为了以后的不求别人,实力是最强的底气。记住,活着不是靠泪水博得同情,而是靠汗水赢得掌声。 ——《写给程序员朋友》

私信“666”可获取以下资料哦!

01【开源网站】获取免费开源项目,找工作必备!

02【电子书】获取1000+本Java开发精华电子书!

03【简历】获取月薪三万简历模板!

04【BAT面试】获取全网最全一线大厂Java笔试面试题!