网络,是一个非常大的概念,想学好网络,不浸淫大几年是搞不定的。所以,作为前端工程师,根据需要职业的需要,就挑一些基础常用的网络知识来学习,以满足日常开发与前端能力进阶的需要。
1.分层模型
网络要解决的东西太复杂了,面对复杂的问题,可以使用分层的方式简化。经过不断地简化,网络最终形成了五层模型。
1.五层网络模型
-
物理层
不同设备之间信息要进行交互,那用什么样的信号进行传输?光信号、电信号或者电磁波?不同信号之间又有不同的规则或者规范,这些规范称为协议。
-
数据链路层
在一个局部的网络中,如何精准的找到另一台计算机,有MAC协议,用来做身份验证。
- 网络层
比如有家里有几台电脑,多台设备,这些设备的信号都会到达路由器,路由器形成的网络是一个局域网。如果是在家外面,或者说局域网之外,那就是一个庞大的互联网,如何在茫茫的互联网中找到对方并且这条路是相对最优的路径。那就靠网络层来解决,通过IP地址来找到远处,比如说在美国的一台计算机。
- 传输层
数据怎么传输?如何保证传输的可靠性等,都靠传输层来解决。这里有两个重要的协议TCP、UDP。TCP属于可靠协议,UDP属于广播协议,为不可靠协议。
- 应用层
我们的网络要应用到具体的场景里面去,比如说通过浏览器去访问网站、发送邮件或软件与硬件的通信等等,都有不同的协议与应对不同的场景。
因此,我们前端学网络,聚焦的点应该在
应用层上。
2.数据的传输
在信息传输的时候,每一层会根据自己的协议,往这个信息里加点自己的东西,这一个封装的过程。后面经过物理的信号传递后,每一层又会根据自己的协议把自己的东西拿掉,这是一个解封装的过程。
3.四层、五层、七层
最早的时候,网络这块儿的官网标准并没有形成,都是一些民间标准。一些软件公司受到市场需求的影响,比如大学科研或者军事上的,所以他们搞了个网络的分层模型,最早是四层模型。后来国际标准出来了,搞出了一套七层模型,从应用层里引出了表示层和会话层,把物理链路层拆成了数据链路层和物理层。后面呢在实际应用中发现表示层、会话层和应用层的联系是非常紧密的,没必要抽离出来,所以七层模型现在仅仅是在教科书上出现,而被大家广泛接受的是五层模型。
2.应用层协议
这个是会对我们的开发、思维、调错和优化产生深远的影响了。
1. URL
URL(
uniform resource locator,统一资源定位符) 用来定位网络服务。
我们的硬件,比如说手机、电脑,可以看作是互联网的入口,通过这个设备就可以接入互联网,享受互联网提供的服务。 URL就是要找到这个服务,通过URL地址,我们就可以找到所需要的服务。
URL本质上是一个固定格式的字符串。
它表达了:从网络中
哪台计算机(domain)中的哪个程序(port)寻找哪个服务(path),并标注了获取服务的具体细节(query),以及要用什么样的协议通信(schema)。
这里面包含了一些细节:
- 当协议是
http,端口是80时,端口可以省略;- 当协议是
https,端口是443时,端口可以省略;schema、domain``path是必填的,其他的根据具体情况来定。
2. HTTP
超文本传输协议(Hyper Text Transfer Protocol)是一个广泛应用于互联网的应用层协议。该协议规定了两个方面的内容:传递消息的模式 和 传递消息的格式。
1.传递消息的模式
这是一种极为简单的消息传递模式,【请求-响应】模式。发起请求的称为
客户端,接受请求并完成响应的称为服务器。【请求-响应】完成后,一次交互结束。
2.传递消息的格式
基于文本的协议,请求和响应的都是字符串。
接下来分析一下请求字符串里都应该写什么。很多程序都可以用来发请求,浏览器只是其中一种。接口测试工具postman也是用来发请求的,现在在vscode里安装下插件rest client,用来发请求,便于我们观察请求的原始格式。
- 新建个
.http文件。
文件里写的就是以下的内容。
请求行只有一行;请求头可以有多行,两次回车,说明请求头结束了;请求体随便写。
2.例子
//text.http
GET / HTTP/1.1 //请求行
Host: www.taobao.com //请求头
//两次空格,这是请求体
响应的内容(部分截图):
针对上面的例子中的请求行,
分为三个部分。
-
GET
request method 表示请求方法。可以自定义,需要和后端沟通。
-
/
表示path 和 query。
-
HTTP/1.1
http协议的版本。
针对上面的例子中的请求头,是以键值对的形式书写。具体写什么,根据服务器的要求来确定。
来试试post的请求,这种请求需要写请求体。而请求体的格式多样,比如id=1或id:1,多个键值对时还可以放在一行里,用&拼接:name=lisi&id=3,这时就必须与服务器沟通,约定好统一的格式。而沟通的方式就是在请求头中声明请求体的格式。例如:
Content-Type: application/x-www-form-urlencoded //请求体格式说明
name=lisi&id=3 //拼接的格式
PS: 上面的这种格式说明
x/y,被称之为MIME。用于描述字符串的格式,比如image/png、application/javascript
来发请求看看:
POST /api/user/login HTTP/1.1
Host: www.study.com
Content-Type: application/x-www-form-urlencoded
loginId=admin1&loginPwd=12323
没问题,现在来换json格式的试试:
POST /api/user/login HTTP/1.1
Host: study.duyiedu.com
Content-Type: application/json
{
"loginId":"admin1",
"loginPwd":"123123"
}
都没问题!
下面简单说一下响应吧,也是分为三个部分,和请求一样。
响应行有三部分:http版本、响应码、响应消息。
| 分类 | 分类描述 |
|---|---|
| 1** | 信息,服务器收到请求,需要请求者继续执行操作 |
| 2** | 成功,操作被成功接收并处理 |
| 3** | 重定向,需要进一步的操作以完成请求 |
| 4** | 客户端错误,请求包含语法错误或无法完成请求 |
| 5** | 服务器错误,服务器在处理请求的过程中发生了错误 |