Skip to content

网络之分层模型和应用协议

原文来源:渡一网络大师课课件

分层模型

五层网络模型

面对复杂的问题,可以使用分层的方式来简化。

经过不断的演化,网络最终形成了五层模型:

image-20211008163417521

数据的传输

image-20211008163458168

四层、五层、七层

image-20211008164017299

应用层协议

URL

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

image-20230112104100679

URL是一个固定格式的字符串

image-20230112102913056

它表达了:

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

这里面包含了一些细节:

  • 当协议是http端口为80时,端口可以省略
  • 当协议是https端口为443时,端口可以省略
  • schemadomainpath是必填的,其他的根据具体的要求填写

HTTP

超文本传输协议(Hyper Text Transfer Protocol,HTTP)是一个广泛运用于互联网的应用层协议。

99%的情况下,前端开发者接触的都是HTTP协议。

该协议规定了两个方面的内容:

  • 传递消息的模式
  • 传递消息的格式

传递消息的模式

image-20230112110047746

HTTP使用了一种极为简单的消息传递模式,「请求-响应」模式

发起请求的称之为客户端,接收请求并完成响应的称之为服务器。

「请求-响应」完成后,一次交互结束。

传递消息的格式

image-20230113214343300

HTTP的消息格式是一种纯文本的格式,文本分为三个部分:

请求行
请求头

请求体

具体每一部分写什么内容,要看具体的服务要求

试一试

有非常多的工具可以发送http请求,这里推荐一个非常直观的工具

  1. 安装vscode插件REST Clinet

    image-20230112114542925

  2. 新建文件xxx.http

  3. 编写请求文本

    http
    POST /api/user/login HTTP/1.1
    Host: study.duyiedu.com
    Content-Type: application/json
    
    {
      "loginId":"admin",
      "loginPwd":"123123"
    }
  4. 发送请求

熟悉关键信息

请求方法

请求行中的第一个单词是请求方法

在HTTP协议中,请求方法仅有语义的区别,只是表达了这次请求的「愿望」。

关于请求方法的协议原文见 HTTP/1.1规范RFC7231-Chapter4

image-20230113190854930

比如GET表达了客户端想要获取一些东西,POST表达了客户端想要提交一些东西

常见的请求方法有:

  • GET:获取
  • POST:提交
  • PUT:修改
  • DELETE:删除

具体在开发中应该选择什么请求方法,一定是看服务方的要求

通常情况下:

  • 获取数据一般使用GET
  • 提交数据一般使用POST
  • 各种静态资源的获取,一般使用GET
请求头 - Host

Host标注了URL地址中的Domain + Port

示例:

Host: study.duyiedu.com
请求头 - Content-Type

Content-Type标注了附带的请求体是什么格式

比如,请求体的数据为loginId:admin, loginPwd:123456,请求体可以用不同的格式发出

Content-Type: application/x-www-form-urlencoded

loginId=admin&loginPwd=123123
Content-Type: application/json

{ "loginId": "admin", "loginPwd": "123123" }
Content-Type: multipart/form-data; boundary=aaa

--aaa
Content-Disposition: form-data; name="loginId"

admin
--aaa
Content-Disposition: form-data; name="loginPwd"

123456
--aaa
Content-Disposition: form-data; name="avatar"; filename="small.jpg"
Content-Type: image/jpeg

文件的二进制
--aaa--
响应码

响应码(状态码、消息码)是响应行中的一个数字,后面往往跟上一个对应的单词,用于表达服务器对这个响应的整体「态度」

常见的响应码有:

image-20230112131000507

常见的状态码有:

  1. 200 OK:一切正常。

  2. 301 Moved Permanently:资源已被永久重定向。

    你的请求我收到了,但是呢,你要的东西不在这个地址了,我已经永远的把它移动到了一个新的地址,麻烦你取请求新的地址,地址我放到了响应头的Location中了

    试试请求:www.douyutv.com

  3. 302 Found:资源已被临时重定向。

    你的请求我收到了,但是呢,你要的东西不在这个地址了,我临时的把它移动到了一个新的地址,麻烦你取请求新的地址,地址我放到了请求头的Location中了

  4. 304 Not Modified:文档内容未被修改。

    你的请求我收到了,你要的东西跟之前是一样的,没有任何的变化,所以我就不给你结果了,你自己就用以前的吧。啥?你没有缓存以前的内容,关我啥事

  5. 400 Bad Request:语义有误,当前请求无法被服务器理解。

    你给我发的是个啥啊,我听都听不懂

  6. 403 Forbidden:服务器拒绝执行。

    你的请求我已收到,但是我就是不给你东西

  7. 404 Not Found:资源不存在。

    你的请求我收到了,但我没有你要的东西

  8. 500 Internal Server Error:服务器内部错误。

    你的请求我已收到,但这道题我不会,解不出来,先睡了

响应头 - Content-Type

Content-Type标注了附带的响应体是什么格式

常见的值有:

  1. text/plain: 普通的纯文本
  2. text/html:html文档
  3. text/javascriptapplication/javascript:js代码
  4. text/css:css代码
  5. image/jpeg:jpg图片
  6. attachment:附件
  7. 其他MIME类型

URL和URI

URI

统一资源标识符(Uniform Resource Identifier,URI)。标识、定位任何资源的字符串。URI是一个用于标识某一互联网资源名称的字符串。 该种标识允许用户对任何(包括本地和互联网)的资源通过特定的协议进行交互操作。URI由包括确定语法和相关协议的方案所定义。Web上可用的每种资源 -HTML文档、图像、视频片段、程序等 - 由一个通用资源标识符(Uniform Resource Identifier, 简称"URI")进行定位。

URL

统一资源定位符(Uniform Resource Locator,URL)。URL对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。 它最初是由蒂姆·伯纳斯·李发明用来作为万维网的地址。现在它已经被万维网联盟编制为互联网标准RFC1738了。

URL和URI的区别

  1. 作用的区别

    • URL(统一资源定位符)主要用于链接网页,网页组件或网页上的程序,借助访问方法(http,ftp,mailto等协议)来检索位置资源。

    • URI(统一资源标识符)用于定义项目的标识,此处单词标识符表示无论使用的方法是什么(URL或URN),都要将一个资源与其他资源区分开来。

  2. 可以说URL是URI(URL是URI的子集),但URI永远不能是URL。

  3. 协议区别:URL指定要使用的协议类型,而URI不涉及协议规范。

总结

URI标记了一个网络资源,仅此而已;

URL标记了一个WWW互联网资源(用地址标记),并给出了他的访问地址。(URI是Uniform Resource Identifier,表示是一个资源; URL是Uniform Resource Locator,表示是一个地址。