⽹络分层模型和应⽤协议

248 阅读9分钟

前言

网络分层模型,有说TCP/IP四层网络模型,有说TCP/IP五层网络模型,还有的说OSI七层网络模型,其实这些都是概念上的划分,并不是实实在在的实现和代码。不管概念分几层,首先我们要搞清楚为什么要分层呢?分层解决了哪些问题呢?

一.分层的意义

先来看一个例子,⽐如,你有半杯82年的可乐,想分享给你的朋友高启强,但你们已经10年没有联系了。要完成这件事,你可能要考虑:

  • 我⽤什么装可乐?
    可能的⽅案:塑料瓶、玻璃瓶、煤⽓罐
  • 怎么保证可乐始终处于低温?
    可能的⽅案:保温杯、⼩冰箱、冰盒
  • 如何保证可乐不被运输的⼈偷喝?
    可能的⽅案:封条、在上⾯写「毒药」
  • 如何获取高启强的地址?
    可能的⽅案:报案失踪、联系私⼈侦探、联系物流公司的朋友
  • 如何运输?
    可能的⽅案:⾃⾏⻋、汽⻋、⽕⻋、⾼铁、⻜机、⽕箭

fe808c7c693d307d797d902e0eccad4.png

这就形成了⼀个分层结构,我们可以总结出:

  1. 每层相对独⽴,只需解决⾃⼰的问题
  2. 每层⽆须考虑上层的交付,仅需把⾃⼰的结果交给下层即可
  3. 每层有多种⽅案可供选择,选择不同的⽅案不会对上下层造成影响
  4. 每⼀层会在上⼀层的基础上增加⼀些额外信息

二.分层网络模型

⽹络要解决的问题是:两个程序之间如何交换数据,⾯对复杂的问题,可以使⽤分层的⽅式来简化,以网络协议OSI七层模型(Open System Interconnection Reference Model)来说,从上到下分别是:应用层表示层会话层传输层网络层数据链路层物理层。 网络五层模型只是把表示层和会话层合并到了应用层,而四层模型是把五层模型数据链路层和物理层合并成了物理链路层。

  1. 应用层:面向用户,微信,QQ都属于应用层的软件,照片和视频都是应用层的数据。

  2. 表示层:计算机使用计算机的编码,把应用层的图片,声音,文字表示出来,表示层常见的协议有jpeg(图片的编码格式),MP3(声音的编码格式),ASCII 码(文字编码格式)

  3. 会话层:定义两个应用能否对接,比如QQ无法分享抖音,淘宝无法微信支付,单从网络层面二者是可以互通的,只是在软件设计上,人为的禁止互通。QQ可以登陆腾讯所有的游戏,支付宝可以登陆阿里系所有的产品。

  4. 传输层:上面三层的重点在软件开发,从传输层开始,重点就在网络通信了。传输层的协议有两个,跑的快但容易丢包的udp协议,或者跑的慢但特别稳定的tcp协议。为了保证文件传输的完整性,一般会选择tcp协议,tcp协议会对所发的每个数据包进行确认,只有对方真的收到了,才算发送成功。视频聊天对延迟要求高,可以接受少量数据的丢失,但不能接受延迟,会采用udp协议。传输层还有一个重要的作用,为数据包打上不同的端口号,开识别这个包属于哪个应用,比如发送的qq消息,由qq应用接收消息,就是这一层打端口号的意义。
    常见的端口号:
    80:http协议,浏览器的数据包 443:https协议,浏览器安全加密的网页数据包 4000:qq的数据包
    一句话总结就是传输层的作用是选择tcp还是udp协议,并且为包打上端口号。

  5. 网络层:前面的工作只是经历了编码,打上端口号,但没有说这个包发往哪个哪里。网络层会给数据包打上ip地址,ip地址是互联网地址,收件人/发件人地址。路由器工作在网络层,相当于快递公司的各个站点,用来根据ip地址来转发各种各样的数据包。

  6. 数据链路层:网络层的路由器用来连接各个网段,相当于快递公司的大卡车负责把快递送到各个派送点。工作在这一层的交换机就是负责把最终的数据包交给接收人,交换机通过mac地址来识别各个终端,会记录每个mac地址连在哪个接口上,然后把数据包发出去。
    总结:数据链路层工作就是给数据包打上mac地址,然后交换机进行高速转发,把数据包发到接收人手里。

  7. 物理层:定义怎么样物理信号来表示数据。比如定义网线是8根线组成,wifi的电磁波频率是2.4G和5G,这些都是物理层面的规定标准解决两个硬件之间怎么通信的问题,它主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。

以五层TCP/IP网络模型来示例数据是如何传输的,数据是从上到下,一层一层走的,走到每一层,都会增加一些额外的信息,最终到达物理层,物理层不在增加额外信息,而是变成电信号通过网络传输到对方,通过对方一层一层解封装,还原出真正的消息,这就是整个通信的过程。

21d9ee44db520c6821f4d343e02e063.png

三.应用层协议

e1d5be6fd7e465c2cb0616d5458b86d.png 下面主要介绍url协议和http协议

1.URL

URL(uniform resource locator,统⼀资源定位符)是⼀个固定格式的字符串,⽤于定位⽹络服务

74d2cd58b3ed069c49739ef733bdb08.png

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

  • 当协议是http端口为80时,端口可以省略
  • 当协议是https端口为443时,端口可以省略
  • schemadomainpath是必填的,其他的根据具体的要求填写,如果没有填写协议schema,浏览器会自动添加http/https,如果没有填写路径path,浏览器会自动添加“/”,代表访问根目录。输入到浏览器地址栏的url默认会使用 ASCII 进行编码,因为传递数据过程中,存在用作分隔符的保留字符,不安全字符,如空格,引号,尖括号等。

2.http协议

超文本传输协议(Hyper Text Transfer Protocol,HTTP)是一个广泛运用于互联网的应用层协议。 99%的情况下,前端开发者接触的都是HTTP协议。 该协议规定了两个方面的内容:

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

HTTP使用了一种极为简单的消息传递模式,请求-响应模式,发起请求的称之为客户端,接收请求并完成响应的称之为服务器。「请求-响应」完成后,一次交互结束。

传递消息的格式如下图

186697380db774d41026fa121790adf.png

2.1请求方法

常见的方法有:get、post、put、delete、head、connect、options
head方法:类似于get方法,但服务器不发送body,用于获取head元数据
connect:建立tunnel隧道
options:显示服务器对于访问资源支持的方法

2.2长连接和短连接

这里要强调一下,HTTP协议是基于请求/响应模式的,因此只要服务端给了响应,本次HTTP连接就结束了,根本没有长连接这一说,那么自然也就没有短连接这一说法。长连接和短连接,其实本质上是说的是TCP连接,HTTP协议说到底是应用层的协议,而TCP才是真正的传输层协议,所以只有TCP有长连接和短连接,只是HTTP1.0协议不支持TCP长连接,从HTTP1.1协议以后,TCP连接默认都是长连接。

短连接和长连接,是由connection头部决定的,keep-alive表示长连接,客户端请求时带了connection:keep-alive,代表我支持并希望使用长连接,如果服务器支持会在响应中添加connection:keep-alive,接下来就可以复用长连接。HTTP1.1协议以后,TCP连接默认都是长连接,所以加不加connection:keep-alive无意义,但是明确表示不使用要加connection:close。

2.3请求头 - host

Host标注了URL地址中的Domain + Port,host的主机名必须要填,否则不知道请求的完整路径url

Host: test.icemdata.com
2.4 请求头 - Content-Type

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

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

loginId=admin&loginPwd=123123

//数据被编码成以“&”分隔的键值对,同时以“=”分隔键和值,字符以URL编码方式编码
Content-Type: application/json

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

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

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

123456
------WebKitFormBoundaryraPtlntBIqy4X2Ho--

// multipart/form-data这种请求体,是以boundary作为分隔符,中间是子包体内容的格式。
2.4 响应头 - Content-Disposition

响应头中的Content-Disposition的取值有两个,默认值为inline,指定包体作为页面一部分展示,将文件内容直接显示在页面。取值为:attachment:指定浏览器将包体以附件的方式下载。

2.5 http Range规范

允许服务器只发送响应包体的一部分给客户端,而客户端自动将多个片段的包体组合成完整的包体,常见的使用场景是播放视频的时候,支持视频播放器实时拖动。服务器通过Accept-Range头部表示是否支持Range请求,Accept-Range:bytes表示支持,Accept-Range:none表示不支持。下面的例子是用新浪视频,从视频中间位置点击播放,服务器响应头Accept-Range:bytes表示支持Range请求,响应中返回Content-Range:bytes 1703936-2786683/2786684,代表视频总长有2786684字节,当前返回的部分是1703936-2786683字节。

8eac3203e953d0e859f73722438a119.png

8bd6982470dfc85a25225c49aef0fc3.png