网络初始: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 五元组
五元组是非常关键的五个信息, 每进行一次网络通信, 就会涉及到五元组:
- 源 IP : 数据包从哪台设备来的
- 源端口 : 数据包从哪个程序来的
- 目的 IP : 数据包要发送到哪台设备
- 目的端口 : 数据包要发送到哪个程序
- 协议类型
"源" => 从哪来的; "目的" => 到哪去
举个例子:
"贫僧自东土大唐而来, 到西方拜服求经而去" , 其中:
东土大唐 => 源 IP
唐僧 => 源端口
西方 => 目的 IP
佛 => 目的端口
3. 协议分层
网络通信是一个非常复杂的过程, 如果就设计一个协议来制定网络通信中方方面面的规则, 那这个协议将会非常大非常复杂.
于是, 就将协议进行了拆分, 并且将拆分后的这些小的, 功能单一的协议进行了分类, 也就是协议分层.
分层后, 不同层的协议间有以下的要求:
- 只有上下两层相邻的协议间才可以进行交互
- 上层协议可以调用下层协议(下层协议可以给上层协议提供服务)
- 协议之间的交互, 不能跨层进行 (跨级汇报, 是职场大忌)
3.1 分层的作用
协议分层具有以下好处:
- 封装. 上层协议不需要了解下层协议的细节. (比如下图中, 我们打电话时, 只需会说汉语就可以了, 不需要关注电话机的工作原理)
- 解耦. 分层之后, 可以灵活的替换其中的某一层, 对整体的影响很小. (比如下图中, 打电话的人可以说汉语, 也可以说英语; 打电话可以使用电话机, 也可以使用无线电)
3.2 OSI 七层网络模型 & TCP/IP 五层(四层)协议模型
OSI 将协议分为七层, 分别为:
- 物理层(Physical Layer)
- 数据链路层(Data Link Layer)
- 网络层(Network Layer)
- 传输层(Transport Layer)
- 会话层(Session Layer)
- 表示层(Presentation Layer)
- 应用层(Application Layer)
但是呢, OSI 的协议分层体系, 只存在于教科书上, 由于体系太过复杂, 所以真实的网络分层方式并非如此, 而是采用了更加简化的版本, 即 TCP/IP 五层(四层)协议模型.
4. TCP/IP 五层(四层)网络模型
(五层/四层 只是叫法上的差异, 四层是因为把数据链路层和物理层看做一个整体了(这俩和硬件的相关性都很大), 这里就按照五层来讲了~)
TCP/IP是⼀组协议的代名词,它还包括许多协议.
TCP/IP 五层模型又称为 TCP/IP 协议栈, 类似于调用栈, 即上层协议可以调用下层协议提供的 api.
在 TCP/IP 五层模型中 , 对协议这样进行分层(从上往下):
- 应用层
- 传输层
- 网络层
- 数据链路层
- 物理层
其中, 越往上层越偏向软件, 越往下层越偏向硬件.
其中应用层就是面向应用程序的, 以后咱们程序员主要就是工作在应用层.
而传输层和网络层是由操作系统内核实现的, 操作系统也提供了供应用层调用的接口(api).
数据链路层和物理层就是直接和硬件相关的了.
4.1 物理层
物理层规定了网络通信中的一些硬件设备要符合的要求.
比如, 约定 网线, WiFi, 光纤(光猫) ... 这些硬件设施要满足的要求是怎样怎样的.
可以把整个网络体系想象成是一个物流系统, 而物理层就是在铺桥修路~
有了物理层, 才能有后续的网络通信~
4.2 数据链路层
数据链路层, 是完成两个相邻的节点/设备间的通信. (通过网线, 电脑和路由器/交换机相连, 那么这台电脑和路由器/交换机就是相邻节点/设备)
通俗来说, 数据链路层, 就是先考虑一小步该怎么走.
举个例子,
数据链路层, 可以想象成高中时, 你和你的同桌传纸条. 你和你同桌距离很近, 不容易被老师发现, 比较容易完成.
4.3 网络层
网络层, 是基于数据链路层的, 是指任意两个设备之间的通信(这两个设备间可能隔着很多的路由器和交换机).
网络层, 侧重于通信的中间过程是怎样的.
举个例子,
网络层, 可以想象是你跟教室里另外一名同学传纸条, 可能你在最后一排, 而ta在第一排, 需要让中间的同学一个一个的传, 最终才能到那名同学的手中.
4.4 传输层
传输层, 也是任意的两个设备之间的通信, 但和网络层不同的是, 传输层不考虑中间过程是怎样的, 只考虑起点和终点.
举个例子,
淘宝上的卖家, 卖出去衣服后, 把商品给物流公司后:
- 卖家只考虑包裹的发出地址和收件地址, 不用考虑中间的路程是怎样规划的, 不用考虑用什么设施来运输.
- 而物流公司就得考虑中间是怎么走的, 走哪条路线才能到达目的地.
此时, 卖家就是传输层, 物流公司就是网络层.
4.5 应用层
应用层, 负责应用程序间沟通. 可以通俗的理解为, 我们买家拿到包裹后怎样使用.
这里通过网购的例子, 将这四层贯通一下:
- 应用层 => 我, 考虑好收到货后怎样使用
- 运输层 => 卖家, 考虑好发件地址和目的地址
- 网络层 => 物流公司, 考虑并规划好包裹发出地和目的地的路线, 进行运输
- 数据链路层 => 快递小哥, 考虑相邻的节点, 将包裹送到我手中
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),
还差一个 协议类型.
但是, 协议不止只有一种(五层协议), 所以每层数据包的报头中, 都包含了上层使用的哪个协议:
- 物理层数据包的数据信息, 和数据链路层使用的协议直接相关.
- 数据链路层得到的数据包的报头中, 记录了网络层使用的哪个协议
- 网络层数据包(IP 数据包)的报头中, 记录了运输层使用的哪个协议
- 运输层数据包(TCP 数据包)的报头中, 记录了交给应用层的哪个应用程序
注意:
TCP 协议是不关心载荷内容是啥的; IP 协议也不关心载荷内容是啥.
4. 第四步
网络层继续调用 数据链路层 的api , 把 IP 数据包交给数据链路层.
数据链路层的核心协议, 就是"以太网", 以太网这个协议就会在网络层数据包的基础上进一步加工.
(数据链路层构建出的以太网数据包, 不仅添加了 以太网报头, 还添加了以太网报尾)
(到目前为止, 数据还在主机上转悠, 还没出门~~)
注意, 谈到网络传输的 "基本数据单位", 涉及多个术语(网络数据包/帧/报/段):
- 段(segment) --- TCP 使用
- 报(Datagram) --- UDP 使用
- 包(packet) --- IP 使用
- 帧(frame) --- 数据链路层使用(以太网数据帧)
我们 Java 程序员对这些术语就不做严格区分了, 混着用也没问题~
5. 第五步
以太网会继续将这样的数据交给物理层(硬件设备 --- 网卡)
网卡会把上述二进制数据, 最终以 光信号/电信号/电磁波信号 传播出去. (此时, 数据才真正出门了~~)
综上,
发送数据时, 从上层到下层, 需要对数据逐层进行加工(添加报头), 这个过程就称为 "封装"(包装数据).
这里的 封装, 和面向对象中的封装, 不是一个封装, 这里的封装是指网络中的自己的专业术语.
5.2 分用
数据到达接收方主机后, 需要从下层到上层, 逐层进行解析, 这个过程, 就叫做 "分用".(封装的逆向过程)
1. 第一步
数据(光电信号)到达接收方的网卡, 网卡把光电信号还原成二进制 0101...
网卡再把二进制数据交给数据链路层.
物理层接收到数据的类型, 和数据链路层是息息相关的.
- 光纤/网线(有线) 来的数据, 数据链路层则按照 以太网 协议进行解析
- wifi(无线) 来的数据, 数据链路层则按照 802.11 协议进行解析
- 以太网和 802.11 是并列的关系, 本质是一样的, 都是封装分用, 但其中报头报尾不同
- ......
2. 第二步
数据链路层按照以太网协议进行解析, 把报头和报尾取出来, 剩下载荷, 将载荷往上传递交给网络层.
注意: 以太网报头中有专门的属性, 描述了 网络层 使用的是哪个协议.
3. 第三步
网络层拿到数据后, 按照 IP 协议进行解析, 取出报头, 再把载荷向上传递交给传输层.
注意: IP 报头中也有专门的属性, 描述了传输层使用的是哪个协议.
4. 第四步
传输层拿到数据后, 也是类似: 按照 TCP 协议进行解析, 取出报头, 将载荷向上交给应用层(准确来说是交给哪个应用程序).
注意: 传输层报头中, 描述了目的端口号, 告知将数据交给哪个应用程序.
5. 第五步
QQ应用程序拿到传输层给的数据后, 按照程序员指定的协议, 解析应用层数据, 拿到关键信息, 展示到聊天界面上, 给出相应提升.
(不同的应用程序, 使用的是不同的应用层协议进行解析的)
综上, 发送的数据以光电信号的形式到达对方主机后, 从下层到上层逐层进行解析("拆包")的过程, 就叫做分用.
6. 网络设备所在分层 [面试题]
上文我们考虑的只是, 当前主机数据发送前和对方主机数据接受后的事情.
但是, 数据传输的中间过程也是涉及到 封装分用的.
- 主机, 工作过程涉及: 物理层 => 应用层(通过应用程序满足网络通信的需求)
- 路由器, 工作过程涉及: 物理层 => 网络层(组建局域网, 进行网络数据包的转发)
- 交换机, 工作过程涉及: 物理层 => 数据链路层(对路由器接口的扩展, 不需要考虑组网的问题)
路由器的封装分用过程:
- 主机的数据到达路由器后, 物理层, 数据链路层, 网络层(没有传输层) 逐层进行解析, 重新构造出网络层数据包, 重新构造出以太网数据帧, 重新构造出二进制数据, 再次进行转发.
- 路由器工作在网络层(又称为三层转发)
交换机的封装分用过程:
- 主机的数据到达交换机后, 物理层, 数据链路层(没有网络层)逐层进行解析, 再重新构造出 以太网数据包, 重新构造出二进制数据, 转发给下一个设备即可.
- 交换机在数据链路层取得的 以太网报头, 其中的信息就足以支持交换机来进行下一步的工作.
- 交换机工作在数据链路层(二层转发)
传输过程中, 信号是会有衰减的, 但是到达下一个节点时(交换机/路由器), 下个节点重新发送数据时, 又会把信号重新加强.
END