基础-网络分层模型与应用协议

87 阅读6分钟

网络,是一个非常大的概念,想学好网络,不浸淫大几年是搞不定的。所以,作为前端工程师,根据需要职业的需要,就挑一些基础常用的网络知识来学习,以满足日常开发与前端能力进阶的需要。

1.分层模型

网络要解决的东西太复杂了,面对复杂的问题,可以使用分层的方式简化。经过不断地简化,网络最终形成了五层模型。

1.五层网络模型

image.png

  • 物理层

    不同设备之间信息要进行交互,那用什么样的信号进行传输?光信号、电信号或者电磁波?不同信号之间又有不同的规则或者规范,这些规范称为协议。

  • 数据链路层

在一个局部的网络中,如何精准的找到另一台计算机,有MAC协议,用来做身份验证。

  • 网络层

比如有家里有几台电脑,多台设备,这些设备的信号都会到达路由器,路由器形成的网络是一个局域网。如果是在家外面,或者说局域网之外,那就是一个庞大的互联网,如何在茫茫的互联网中找到对方并且这条路是相对最优的路径。那就靠网络层来解决,通过IP地址来找到远处,比如说在美国的一台计算机。

  • 传输层

数据怎么传输?如何保证传输的可靠性等,都靠传输层来解决。这里有两个重要的协议TCPUDPTCP属于可靠协议,UDP属于广播协议,为不可靠协议。

  • 应用层

我们的网络要应用到具体的场景里面去,比如说通过浏览器去访问网站、发送邮件或软件与硬件的通信等等,都有不同的协议与应对不同的场景。

因此,我们前端学网络,聚焦的点应该在应用层上

2.数据的传输

image.png 在信息传输的时候,每一层会根据自己的协议,往这个信息里加点自己的东西,这一个封装的过程。后面经过物理的信号传递后,每一层又会根据自己的协议把自己的东西拿掉,这是一个解封装的过程。

3.四层、五层、七层

最早的时候,网络这块儿的官网标准并没有形成,都是一些民间标准。一些软件公司受到市场需求的影响,比如大学科研或者军事上的,所以他们搞了个网络的分层模型,最早是四层模型。后来国际标准出来了,搞出了一套七层模型,从应用层里引出了表示层会话层,把物理链路层拆成了数据链路层物理层。后面呢在实际应用中发现表示层会话层应用层的联系是非常紧密的,没必要抽离出来,所以七层模型现在仅仅是在教科书上出现,而被大家广泛接受的是五层模型。

image.png

2.应用层协议

这个是会对我们的开发、思维、调错和优化产生深远的影响了。

1. URL

URL(uniform resource locator,统一资源定位符) 用来定位网络服务。

我们的硬件,比如说手机、电脑,可以看作是互联网的入口,通过这个设备就可以接入互联网,享受互联网提供的服务。 URL就是要找到这个服务,通过URL地址,我们就可以找到所需要的服务。

URL本质上是一个固定格式的字符串。

image.png 它表达了:从网络中哪台计算机(domain)中的哪个程序(port)寻找哪个服务(path),并标注了获取服务的具体细节(query),以及要用什么样的协议通信(schema)

这里面包含了一些细节:

  • 当协议是 http,端口是80时,端口可以省略;
  • 当协议是 https,端口是443时,端口可以省略;
  • schemadomain``path是必填的,其他的根据具体情况来定。

2. HTTP

超文本传输协议(Hyper Text Transfer Protocol)是一个广泛应用于互联网的应用层协议。该协议规定了两个方面的内容:传递消息的模式传递消息的格式

1.传递消息的模式

image.png 这是一种极为简单的消息传递模式,【请求-响应】模式。发起请求的称为客户端,接受请求并完成响应的称为服务器。【请求-响应】完成后,一次交互结束。

2.传递消息的格式

基于文本的协议,请求和响应的都是字符串。

image.png

接下来分析一下请求字符串里都应该写什么。很多程序都可以用来发请求,浏览器只是其中一种。接口测试工具postman也是用来发请求的,现在在vscode里安装下插件rest client,用来发请求,便于我们观察请求的原始格式。

  1. 新建个.http文件。

文件里写的就是以下的内容。

image.png

请求行只有一行;请求头可以有多行,两次回车,说明请求头结束了;请求体随便写。

2.例子

//text.http

GET / HTTP/1.1 //请求行
Host: www.taobao.com  //请求头

//两次空格,这是请求体

响应的内容(部分截图):

image.png

针对上面的例子中的请求行,

image.png分为三个部分。

  • GET

    request method 表示请求方法。可以自定义,需要和后端沟通。

  • /

    表示path 和 query。

  • HTTP/1.1

    http协议的版本。

针对上面的例子中的请求头,是以键值对的形式书写。具体写什么,根据服务器的要求来确定。

来试试post的请求,这种请求需要写请求体。而请求体的格式多样,比如id=1id:1,多个键值对时还可以放在一行里,用&拼接:name=lisi&id=3,这时就必须与服务器沟通,约定好统一的格式。而沟通的方式就是在请求头中声明请求体的格式。例如:

Content-Type: application/x-www-form-urlencoded //请求体格式说明

name=lisi&id=3 //拼接的格式

PS: 上面的这种格式说明x/y,被称之为MIME。用于描述字符串的格式,比如image/pngapplication/javascript

来发请求看看:

POST /api/user/login HTTP/1.1
Host: www.study.com
Content-Type: application/x-www-form-urlencoded

loginId=admin1&loginPwd=12323

image.png

没问题,现在来换json格式的试试:

POST /api/user/login HTTP/1.1
Host: study.duyiedu.com
Content-Type: application/json

{
  "loginId":"admin1",
  "loginPwd":"123123"
}

image.png

都没问题!

下面简单说一下响应吧,也是分为三个部分,和请求一样。

响应行有三部分:http版本、响应码、响应消息。 image.png

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