当前位置: 首页 > news >正文

网络初始:TCP/IP 五层协议模型 网络通信基本流程

目录

1. 名词解释

1.1 局域网

1.2 广域网

1.3 交换机

1.4 IP 地址

1.5 端口号

2. 协议

2.1 认识协议

2.2 五元组

 3. 协议分层

3.1 分层的作用

3.2 OSI 七层网络模型 & TCP/IP 五层(四层)协议模型

4. TCP/IP 五层(四层)网络模型

4.1 物理层

4.2 数据链路层

4.3 网络层

4.4 传输层

4.5 应用层

5. 网络数据通信的基本流程

5.1 封装

5.2 分用 

6. 网络设备所在分层 [面试题]


咱们国家的互联网发展历程: 

单机时代 => 局域网时代 => 广域网时代 => 移动互联网时代(目前阶段)

1. 名词解释

1.1 局域网

把两台设备连接到同一个路由器上, 那这两台设备就在同一个局域网中了.

举个例子, 

2000年后, 国内网络主键普及开来, 出现了很多的网吧, 但那时候, 想要进行联机对战, 就只能在同一个网吧/机房中, 使用同一个网络, 出了网吧就不行了.

那时候就是局域网时代.

1.2 广域网

广域网其实就是一个大的局域网. 把多个局域网连到一起, 就成了广域网.

全世界最大的广域网, 称为"因特网(The Internet)".

因此, 局域网和广域网只是一个相对的概念.

1.3 交换机

大家知道, 路由器上的接口很少, 家有路由器一般只能插 4 个网线(1 WAN口连运营商的设备).

而 交换机, 可以视为 "对路由器的接口进行了扩展"(类似于插排的功能), 交换机上有多个插口, 别的设备连接到交换机上, 就等价于连接到路由器上(都是同一个局域网).

1.4 IP 地址

IP地址用于定位一台设备所在的网络地址.

1.5 端口号

一台设备上会有多个应用程序, IP 地址是用来标识一台设备的, 而端口号就是用来区分这台设备上的应用程序的.(每个程序的端口号都是不同的)

举个例子:

我们在网购时, 需要填写收货地址, 比如: xxx省xxx市xxx大学.

这个地址就是 "IP 地址", 但是这个大学中有上万个人, 不能明确表示收货人是谁. 

那快递小哥就会通过手机号来确定收货人到底是谁, 而手机号就可以认为是 端口号.


2. 协议

2.1 认识协议

所谓协议, 通俗来讲, 就是指事先约定好的规则. 

网络协议, 就是通信双方对于 发送/接受 数据格式的约定. (约定好我该怎么发送, 你该怎么解析)

当多个主机设备进行通信时, 只有多个主机遵守的是同一套协议, 此时的通信才是有意义的.

举个例子:

大学中, 同学们都来自五湖四海, 都有着自己的家乡话, 但是大家交流起来毫无问题, 因为大家说话聊天时, 都遵循着同一个协议 --- 普通话.

2.2 五元组

五元组是非常关键的五个信息, 每进行一次网络通信, 就会涉及到五元组:

  1. 源 IP : 数据包从哪台设备来的
  2. 源端口 : 数据包从哪个程序来的
  3. 目的 IP : 数据包要发送到哪台设备
  4. 目的端口 : 数据包要发送到哪个程序
  5. 协议类型

"源" => 从哪来的;  "目的" => 到哪去

举个例子:

"贫僧自东土大唐而来, 到西方拜服求经而去" , 其中: 

东土大唐 => 源 IP

唐僧 => 源端口

西方 => 目的 IP

佛 => 目的端口

 3. 协议分层

网络通信是一个非常复杂的过程, 如果就设计一个协议来制定网络通信中方方面面的规则, 那这个协议将会非常大非常复杂.

于是, 就将协议进行了拆分, 并且将拆分后的这些小的, 功能单一的协议进行了分类, 也就是协议分层.

分层后, 不同层的协议间有以下的要求:

  • 只有上下两层相邻的协议间才可以进行交互
  • 上层协议可以调用下层协议(下层协议可以给上层协议提供服务)
  • 协议之间的交互, 不能跨层进行 (跨级汇报, 是职场大忌)

3.1 分层的作用

协议分层具有以下好处:

  1. 封装. 上层协议不需要了解下层协议的细节. (比如下图中, 我们打电话时, 只需会说汉语就可以了, 不需要关注电话机的工作原理)
  2. 解耦. 分层之后, 可以灵活的替换其中的某一层, 对整体的影响很小. (比如下图中, 打电话的人可以说汉语, 也可以说英语; 打电话可以使用电话机, 也可以使用无线电)

3.2 OSI 七层网络模型 & TCP/IP 五层(四层)协议模型

OSI 将协议分为七层, 分别为:

  1. 物理层(Physical Layer)
  2. 数据链路层(Data Link Layer)
  3. 网络层(Network Layer)
  4. 传输层(Transport Layer)
  5. ‌会话层(Session Layer)
  6. 表示层(Presentation Layer)
  7. 应用层(Application Layer)

但是呢, OSI 的协议分层体系, 只存在于教科书上, 由于体系太过复杂, 所以真实的网络分层方式并非如此, 而是采用了更加简化的版本, 即 TCP/IP 五层(四层)协议模型. 

4. TCP/IP 五层(四层)网络模型

(五层/四层 只是叫法上的差异, 四层是因为把数据链路层和物理层看做一个整体了(这俩和硬件的相关性都很大), 这里就按照五层来讲了~)

TCP/IP是⼀组协议的代名词,它还包括许多协议.

TCP/IP 五层模型又称为 TCP/IP 协议栈, 类似于调用栈, 即上层协议可以调用下层协议提供的 api.

在 TCP/IP 五层模型中 , 对协议这样进行分层(从上往下):

  1. 应用层
  2. 传输层
  3. 网络层
  4. 数据链路层
  5. 物理层

其中, 越往上层越偏向软件, 越往下层越偏向硬件.

其中应用层就是面向应用程序的, 以后咱们程序员主要就是工作在应用层.

而传输层和网络层是由操作系统内核实现的, 操作系统也提供了供应用层调用的接口(api).

数据链路层和物理层就是直接和硬件相关的了.

4.1 物理层

物理层规定了网络通信中的一些硬件设备要符合的要求.

比如, 约定 网线, WiFi, 光纤(光猫) ... 这些硬件设施要满足的要求是怎样怎样的.

可以把整个网络体系想象成是一个物流系统, 而物理层就是在铺桥修路~

有了物理层, 才能有后续的网络通信~

4.2 数据链路层

数据链路层, 是完成两个相邻的节点/设备间的通信. (通过网线, 电脑和路由器/交换机相连, 那么这台电脑和路由器/交换机就是相邻节点/设备)

通俗来说, 数据链路层, 就是先考虑一小步该怎么走.

举个例子, 

数据链路层, 可以想象成高中时, 你和你的同桌传纸条. 你和你同桌距离很近, 不容易被老师发现, 比较容易完成.

4.3 网络层

网络层, 是基于数据链路层的, 是指任意两个设备之间的通信(这两个设备间可能隔着很多的路由器和交换机). 

网络层, 侧重于通信的中间过程是怎样的.

举个例子,

网络层, 可以想象是你跟教室里另外一名同学传纸条, 可能你在最后一排, 而ta在第一排, 需要让中间的同学一个一个的传, 最终才能到那名同学的手中.

4.4 传输层

传输层, 也是任意的两个设备之间的通信, 但和网络层不同的是, 传输层不考虑中间过程是怎样的, 只考虑起点和终点.

举个例子,

淘宝上的卖家, 卖出去衣服后, 把商品给物流公司后:

  • 卖家只考虑包裹的发出地址和收件地址, 不用考虑中间的路程是怎样规划的, 不用考虑用什么设施来运输.
  • 而物流公司就得考虑中间是怎么走的, 走哪条路线才能到达目的地.

此时, 卖家就是传输层, 物流公司就是网络层.

4.5 应用层

应用层, 负责应用程序间沟通. 可以通俗的理解为, 我们买家拿到包裹后怎样使用.

这里通过网购的例子, 将这四层贯通一下:

  1. 应用层 => 我, 考虑好收到货后怎样使用
  2. 运输层 => 卖家, 考虑好发件地址和目的地址
  3. 网络层 => 物流公司, 考虑并规划好包裹发出地和目的地的路线, 进行运输
  4. 数据链路层 => 快递小哥, 考虑相邻的节点, 将包裹送到我手中

5. 网络数据通信的基本流程

5.1 封装

发送数据时, 从上层到下层, 需要对数据逐层进行加工(添加报头), 这个过程就称为 "封装"(包装数据).

比如, 我正在QQ上给别人发消息, 这个消息是 "hello".

那么, 这个消息的发出, 需要经过一系列 封装 的过程.

1. 第一步:

应用程序获取到用户的输入, 构造一个应用层的数据包.

这个数据包, 通常是"结构化数据"(类似 C 的结构体, 有多个属性), 

发送数据的时候, 会把 结构化数据, 转化为 字符串/二进制 bit 流的数据 => 序列化

接受数据的时候, 会把 字符串/二进制 bit 流的数据, 转化为 结构化数据 => 反序列化

因为网络传输的数据, 本质上都是以 ''字符串" 或者 "二进制 bit 流" 的形式进行传输的.

而这个应用层的数据包, 就遵守着应用层协议(这个协议都是开发这个程序的程序员设定的).

假设, 遵守这样的协议格式: 发送者QQ号, 接受者QQ号, 消息发送时间, 消息内容

那么, 应用层数据包如下:

2. 第二步

接着, 应用程序调用 传输层 提供的接口(socket api), 把数据往下层传输, 交给传输层.

传输层在拿到数据后, 会根据传输层的协议, 在 "应用层数据包" 的基础上构造出 "传输层数据包".

(传输层的主要协议有两种: TCP, UDP. 这里以 TCP 为例)

并且, "传输层数据包" 的 报头 中, 包含了五元组中的 源端口和目的端口.

报头 可以理解为 标签, 里面包含了本次传输的关键信息.

比如, 卖家发货时, 肯定不是把商品光秃秃的给物流公司, 肯定会先包装好, 物流公司也会在快递袋上贴快递单(上面有收货人信息).

报头, 就可以理解为这些商品外包装, 或者快递单.

3. 第三步

传输层构造好数据后, 调用网络层的 api , 把传输层数据包交给网络层.

网络层继续进行处理, 在网络层中, 最主要的协议是 IP 协议, IP 协议继续对数据包进行加工(拼上 IP 报头)

IP 数据包的报头中, 包含了五元组的中的 源IP和目的IP.

到目前为止, 五元组中的四个关键信息已经包含了(源端口, 目的端口, 源 IP, 目的 IP),

还差一个 协议类型.

但是, 协议不止只有一种(五层协议), 所以每层数据包的报头中, 都包含了上层使用的哪个协议:

  1. 物理层数据包的数据信息, 和数据链路层使用的协议直接相关.
  2. 数据链路层得到的数据包的报头中, 记录了网络层使用的哪个协议
  3. 网络层数据包(IP 数据包)的报头中, 记录了运输层使用的哪个协议
  4. 运输层数据包(TCP 数据包)的报头中, 记录了交给应用层的哪个应用程序

注意:

TCP 协议是不关心载荷内容是啥的; IP 协议也不关心载荷内容是啥.

4. 第四步

网络层继续调用 数据链路层 的api , 把 IP 数据包交给数据链路层.

数据链路层的核心协议, 就是"以太网", 以太网这个协议就会在网络层数据包的基础上进一步加工.

(数据链路层构建出的以太网数据包, 不仅添加了 以太网报头, 还添加了以太网报尾)

(到目前为止, 数据还在主机上转悠, 还没出门~~)

注意, 谈到网络传输的 "基本数据单位", 涉及多个术语(网络数据包/帧/报/段):

  1. 段(segment) --- TCP 使用
  2. 报(Datagram) --- UDP 使用
  3. 包(packet) --- IP 使用
  4. 帧(frame) --- 数据链路层使用(以太网数据帧)

我们 Java 程序员对这些术语就不做严格区分了, 混着用也没问题~

5. 第五步

以太网会继续将这样的数据交给物理层(硬件设备 --- 网卡)

网卡会把上述二进制数据, 最终以 光信号/电信号/电磁波信号 传播出去. (此时, 数据才真正出门了~~)

综上, 

发送数据时, 从上层到下层, 需要对数据逐层进行加工(添加报头), 这个过程就称为 "封装"(包装数据).

这里的 封装, 和面向对象中的封装, 不是一个封装, 这里的封装是指网络中的自己的专业术语.


5.2 分用 

数据到达接收方主机后, 需要从下层到上层, 逐层进行解析, 这个过程, 就叫做 "分用".(封装的逆向过程)

1. 第一步

数据(光电信号)到达接收方的网卡, 网卡把光电信号还原成二进制 0101...

网卡再把二进制数据交给数据链路层.

物理层接收到数据的类型, 和数据链路层是息息相关的.

  1. 光纤/网线(有线) 来的数据, 数据链路层则按照 以太网 协议进行解析
  2. wifi(无线) 来的数据, 数据链路层则按照 802.11 协议进行解析
  3. 以太网和 802.11 是并列的关系, 本质是一样的, 都是封装分用, 但其中报头报尾不同
  4. ......

2. 第二步

数据链路层按照以太网协议进行解析, 把报头和报尾取出来, 剩下载荷, 将载荷往上传递交给网络层.

注意: 以太网报头中有专门的属性, 描述了 网络层 使用的是哪个协议. 

 3. 第三步

网络层拿到数据后, 按照 IP 协议进行解析, 取出报头, 再把载荷向上传递交给传输层.

注意: IP 报头中也有专门的属性, 描述了传输层使用的是哪个协议.

4. 第四步

传输层拿到数据后, 也是类似: 按照 TCP 协议进行解析, 取出报头, 将载荷向上交给应用层(准确来说是交给哪个应用程序).

注意: 传输层报头中, 描述了目的端口号, 告知将数据交给哪个应用程序.

5. 第五步

QQ应用程序拿到传输层给的数据后, 按照程序员指定的协议, 解析应用层数据, 拿到关键信息, 展示到聊天界面上, 给出相应提升.

(不同的应用程序, 使用的是不同的应用层协议进行解析的)

综上, 发送的数据以光电信号的形式到达对方主机后, 从下层到上层逐层进行解析("拆包")的过程, 就叫做分用.


6. 网络设备所在分层 [面试题]

上文我们考虑的只是, 当前主机数据发送前和对方主机数据接受后的事情.

但是, 数据传输的中间过程也是涉及到 封装分用的.

  • 主机, 工作过程涉及: 物理层 => 应用层(通过应用程序满足网络通信的需求)
  • 路由器, 工作过程涉及: 物理层 => 网络层(组建局域网, 进行网络数据包的转发)
  • 交换机, 工作过程涉及: 物理层 => 数据链路层(对路由器接口的扩展, 不需要考虑组网的问题)

路由器的封装分用过程:

  • 主机的数据到达路由器后, 物理层, 数据链路层, 网络层(没有传输层) 逐层进行解析, 重新构造出网络层数据包, 重新构造出以太网数据帧, 重新构造出二进制数据, 再次进行转发.
  • 路由器工作在网络层(又称为三层转发)

交换机的封装分用过程:

  • 主机的数据到达交换机后, 物理层, 数据链路层(没有网络层)逐层进行解析, 再重新构造出 以太网数据包, 重新构造出二进制数据, 转发给下一个设备即可.
  • 交换机在数据链路层取得的 以太网报头, 其中的信息就足以支持交换机来进行下一步的工作.
  • 交换机工作在数据链路层(二层转发)

传输过程中, 信号是会有衰减的, 但是到达下一个节点时(交换机/路由器), 下个节点重新发送数据时, 又会把信号重新加强.


 END


http://www.mrgr.cn/news/67366.html

相关文章:

  • FQDN(Fully Qualified Domain Name,完全限定域名)是指能够唯一标识互联网上一台主机的域名
  • 语音识别中的RPM技术:原理、应用与发展趋势
  • el-checkbox勾选一个变成了勾选所有
  • OpenGL入门004——使用EBO绘制矩形
  • 【网络安全】|nessus使用
  • 深度学习-pytorch安装与基本使用
  • 解释Python的排序方法sort和sorted的区别。
  • 详解Rust标准库:BTreeSet
  • 数字信号处理Python示例(7)生成复数指数函数
  • Python | Leetcode Python题解之第543题二叉树的直径
  • 提高区块链网络TPS七步曲
  • 【知识科普】使用 OpenSSL为特定域名生成自签名证书
  • Python 详细实现无损压缩之 DEFLATE 算法
  • VS2013安装报错“windows程序兼容性模式已打开,请将其关闭 ”解决方案
  • Python | Leetcode Python题解之第542题01矩阵
  • wps怎么算出一行1和0两种数值中连续数值1的个数,出现0后不再计算?
  • Python练习9
  • 快速部署和体验内置开源 LLM 大模型
  • UE5.4 PCG基础节点
  • 【Linux 29】传输层协议 - UDP
  • Linux 使用及常用命令详解
  • 【Linux-进程间通信】消息队列
  • LLMs之Leaderboard:Chatbot Arena的简介、使用方法、案例应用之详细攻略
  • SIwave:释放 TDR(时域反射计)向导的强大功能
  • C++ | Leetcode C++题解之第543题二叉树的直径
  • 【1个月速成Java】基于Android平台开发个人记账app学习日记——第8天,完成注册登录并保存到数据库