网络基础——网络传输基本流程
文章目录
- 网络传输基本流程
- 局域网通信
- 局域网不同的通信方式
- 认识MAC地址
- 了解以太网的通信原理
- 重新理解主机间通信
- 理解协议栈
- 总结
- 了解无限LAN和令牌环网
- 跨网络传输
- 认识IP地址
- IP地址和MAC地址的对比
- 跨网络传输流程理解
网络传输基本流程
学习完协议的相关知识后,我们需要来了解一下网络传输的基本流程。以便后序网络编程中能够快速上手,并理解对应的原理!
在了解网络传输基本流程时,我们始终秉持一个观念:
网络的发展,是从局部到整体的!
局域网通信
既然是从局部到整体,我们就需要先来了解一下局域网的通信方式!
局域网不同的通信方式
我们知道,在早期的时候,不同的机构、组织在使用计算机的时候是需要通信交流的。但是,那个时候也没有大范围的网络通信技术!所以,必然会存在着很多的局部通信网络!
也就是局域网的通信方式:
所以,一开始肯定是有很多局域网的通信标准的!但是经过时间的流逝、科技的发展,最终局域网通信的技术只剩下三种:
1.以太网
2.无限LAN
3.令牌环网
其中,以太网是目前最常用的,也是需要我们重点了解的!后序我们都是通过以太网来进行相关概念的讲解!讲解完相关概念后,我们再回过头来了解一下另外两种方式即可!
认识MAC地址
MAC地址:用于识别数据链路层中相连的节点;
长度:48位(6个字节),通常以16进制加冒号表示(如 08:00:27:03:fb:19)
特性:
- 网卡出厂时固定,一般不可修改;
- 通常全球唯一(虚拟机MAC地址为模拟,可能冲突);
- 部分网卡支持用户手动配置。
还记得我们曾经在协议相关内容说的:
数据链路层会解决当前下一个要去的节点!那么要如何找到下一个节点呢?用MAC地址!
因为每个能够通信的设备都是会有网卡的!所以,都会有对应的MAC地址!所以,数据链路层就可以通过MAC地址来确定下一个要去的位置是哪里。
了解以太网的通信原理
我们来看一张图:
既然每个网卡都有MAC地址,那么,当一台主机要发送数据到另一台主机的时候,就可以定义一个protocol(协议),就是一个struct类型的协议(这里简单理解,实际是更复杂的):
struct protocol{src的MAC地址dest的MAC地址data,发送的数据//...
};
然后把这个协议发送到以太网上,然后所有的主机其实都会接收到!因为所有的主机都连在了这个以太网上。这个过程叫做泛洪!
其他的主机会接收到这个通信的协议,然后判断一下目的地的MAC地址是否和自己的MAC地址相同,如果不相同就丢弃。相同就接收!
(Tips:Mac地址是可以自行查询的:)
上述我们是大概知道以太网是怎么通过Mac地址来进行通信的了,但是这里会有如下几个细节需要我们特别的注意:
- 以太网中,任意时刻只能有一个主机在发送数据
- 如果有多台同时发送,会发生数据干扰,我们称之为数据碰撞
- 在没有交换机的前提下,以太网就是一个碰撞域!
- 所有发送数据的主机要进行碰撞检测和碰撞避免(有对应的算法进行操作)
通过上面的描述,我们是否想起来一些比较熟悉的概念?
这个以太网,需要被多台机器使用,这不就是一个共享资源吗?
而发送数据的进行通信的多台机器,不就是多个执行流么?
所以,以太网中,任意时刻只能有一个主机在发送数据,就类似于线程的互斥!因为要保证一台机器发送数据的安全!这不就相当于通过上锁来保护资源吗!所以,以太网也是临界资源!
以太网是一个碰撞域,所以需要有对应的碰撞避免算法来尽可能地避免碰撞!这不就是要去保护线程数据安全吗?
故这里我们通过线程学习的相关概念,就能很好的理解以太网下的一些相关特性!
这里还需要说明一下:
因为以太网的通信方式是所有的主机都可以看到!所以,是有那么一种可能,通过调整网卡的接收方式,无论怎么样都把信息接收!这就可能会导致信息泄露!
当然,后序是有对应的加密方式的,这个以后再说!
重新理解主机间通信
从这里开始,我们就不能地再简单认为,主机间的通信就是单纯的两台计算机在通信!
我们需要看成两个TCP/IP协议栈在进行通信!
因为大部分时间下,双方需要通信的需求,都是由人提出来的!而人是属于用户层的,即TCP/IP协议的最顶层!
网络通信是需要遵守该协议的!所以,通信必然是需要先从用户层贯穿到协议的底层的!
现在,我们来理解一下,两台主机是如何通过协议栈来进行通信的:
需要说明几点:
- 网络协议栈,每一层都都有对应的协议
- 每一层只能认识该层对应的协议
- 向下传输数据叫做封装,向上传输数据叫做解包!
理解了相关概念,我们来理解通信过程(假设主机A给主机B发送数据进行通信):
首先,协议栈每一层都有对应的协议。每一层只看的懂这一层的协议!所以,当A发送了一个数据,向下贯穿协议栈的时候,每经过一层,都需要带上每一层对应的协议报头!我们称这个过程为封装!通过A的网卡发送给B,最后B网卡得到的,就是带有若干个协议报头的数据!
然后,为了能够让B用户得到对应的数据,需要继续向上传送。因为每一层只能认识本层的协议,没经过一层,只能解掉一个报头!解报头的过程,被叫做解包!而每一层解包后剩下的,就是这一层的有效荷载!最后通过不段向上解包,最终把数据交付给用户!
(网上不断解包的过程被称为解包和分用!)
小小总结一下:
我们先不考虑任何的协议:
对端同层,必须要先解包:分离报头和有效荷载!
同时,每一个报头都必须要能做到:
1.分离报头和有效荷载
2.能够交付给上一层具体的协议(有些层的协议可能会有多种情况)!
这些情况必然是可以通过代码来进行控制的,这些我们不用担心!
同时,每一个协议栈底层还得做到:不是发送给本主机的数据,应该直接丢弃!
当然,有些软件可能会通过调整网卡接收方式(混杂模式),不丢弃数据!这也被叫做抓包!
理解协议栈
我们刚刚一直在说协议栈,那么我们应该如何理解这个协议栈呢?
我们知道,发送数据的一方是不断地向下封装对应层的协议报头。而接收数据的一方数据是不断地向上进行解包和分用!
这个顺序,不就是很像栈的先进先出吗?
通过上图我们就明白了,为何有协议栈的说法了!
总结
- 报头部分,就是对应协议层的结构体字段,我们一般叫做报头
- 除了报头,剩下的叫做有效载荷
- 故,报文 = 报头 + 有效载荷
每一层都有报文,每一层的报文都是上述方式理解的!
但是,正因每一层都有,所以需要做一下区分:
• 协议层数据包称谓: • 应用层:请求与应答• 传输层:数据段(segment) • 网络层:数据报(datagram) • 链路层:数据帧(frame) • 封装(Encapsulation): • 应用层数据通过协议栈发送时,每层协议添加首部(header) • 首部包含信息:首部长度、载荷(payload)长度、上层协议类型等 • 数据传输与解封装: • 封装后的帧通过传输介质发送到目标主机 • 每层协议逐层剥离首部,根据首部中的"上层协议字段"将数据交给对应上层协议处理
简化硬件层,每个通信的主机都应该看为如下的协议栈(4层):
数据报文通过网卡进行发送!
数据封装的过程:
即我们理解为不断地将协议报头入栈!
数据解包分用的过程:
每个协议报头都能够做到脱离当前报文,并且交付给上层的具体协议!
通信过程:
内核和用户的区分就是在(传输层 + 网络层)。应用层更多关注的是如何控制程序,如何处理接收到的数据!而内核部分更多的关注通信的细节实现!
所以,最后显现的结果就是:
每一层都认为直接和对方相同层直接通信!
了解无限LAN和令牌环网
局域网的通信还有两种方法,我们简单了解一下即可!
无线LAN(WLAN)
• 基于IEEE 802.11标准,使用无线电波传输数据
• 典型代表:Wi-Fi,支持灵活组网和移动接入
• 采用CSMA/CA机制避免信号冲突
令牌环网(Token Ring)
• 基于IEEE 802.5标准,使用物理环形拓扑
• 通过"令牌"控制传输权限,避免数据冲突
• 早期局域网技术,现已基本被以太网取代
跨网络传输
这个部分,我们来谈论一下跨网络传输的相关话题!
认识IP地址
首先,我们需要先来认识一下IP地址:
IP协议有两个版本,
IPv4
和IPv6
。后序凡是提到IP协议, 没有特殊说明的, 默认都是指IPv4
简单来说,IP地址就是用来表示主机在全球的唯一性的:
- IP 地址是在 IP 协议中, 用来标识网络中不同主机的地址;
- 对于 IPv4 来说, IP 地址是一个 4 字节, 32 位的整数;
- 我们通常也使用 “点分十进制” 的字符串表示 IP 地址, 例如 192.168.0.1 ; 用点分割的每一个数字表示一个字节, 范围是 0 - 255;
这里会有几个问题:
1.IPv4既然是用来表示主机唯一性的,但是32位表示只能表示42亿台主机?这不够用吧!
2.不够用的情况下,是如何解决的呢?
第一个问题:
答案是必然的!IPv4的地址数是远远不够用的!每台主机(电脑、手机、入网设备)都是要有一个地址的!所以,IPv4的地址数量必然是不够的!
第二个问题:
在我国,一些方面会使用IPv6协议来解决这个问题!但是,当今世界,仍然是使用IPv4协议为主!所以,会如何解决的呢?
学习过《计算机网络》这门课程的就知道:
IP地址分为公网和内网!公网IP是不能重复的!但是不同公网下出现了一样的IP地址是可以的!其实就是网络的划分!
(这里不做讲解,知道有这么一回事即可!)
只有公网IP在全球范围内能标识主机的唯一性!
IP地址和MAC地址的对比
但是,我们前面在讲MAC地址的时候,也说到了:
MAC地址一般来说,在全球也是具有唯一性的!那么,为什么还会有MAC和IP地址的区别呢?
这里使用一个通俗的例子来进行讲解:
假设我们要从广州去往北京,开车去,那肯定是不太可能一天到的,所以需要规划前进路线!
在这个途中,起点是广州,终点是北京!
所以,我们就可以规划路线的时候(随意规划):
1.广州 -> 南昌
2.南昌 -> 武汉
3.武汉 -> 郑州
4.郑州 -> 石家庄
5.石家庄 -> 北京
在上述过程中:我们的起点始终是广州,重点是北京!其他城市,是临时的中转站!
就像坐高铁一样,总是会有途径的下一站!(个别直达列车除外)
这里对于IP地址和MAC地址也是一样的!一般来说,跨网络通信距离比较长的时候,是很难直接将通信数据发送到对方主机的!
所以,就会先前往第一个路由器,然后通过路由转发到达下一个,知道最后达到目标主机!
总结:
源头 | 目的地 |
---|---|
从哪来 -> 源IP地址 | 去哪里 -> 目标IP地址 |
上一站哪来 -> 源MAC地址 | 下一站去哪 -> 目标MAC地址 |
跨网络传输流程理解
现在,有了上述理解的概念,我们来看看跨网络通信的大致流程:
就以上述这个通信过程为样例,就假设两台主机底层发送信息使用的局域网不同!
跨网传输流程大致如下:
这里两态主机底层通信的局域网不同,但是没有关系!因为路由器重新封装协议报头的时候,会自动地想办法处理(报头的能力之一就是交付给上层对应的协议!)。
上述过程中,IP源地址和目标IP地址是不变的!这是长远目标!
但是,源MAC地址和目标MAC地址是一直在变的!
->所以,哪怕MAC地址全球唯一,也只是在局域网内是有效的罢了!
还有一点就是,无论通信的主机使用的局域网通信技术是否相同,但是最终,都会被处理到上层网络层,统一使用IP协议!底层无论是使用无限LAN、以太网、令牌环网、自定义局域网…
最终,都会通过路由器重新封装,选择具体交付的局域网通信协议!但是,再往上传交付的时候,就需要统一交付给IP协议!这样子,世界上所有的网络,都叫做IP网络!
这样做是充分的体现了不同层之间内聚但又解耦的特性的!实际上,IP地址有了,不需要MAC地址也是可以的!但这就和之前学习c语言的编译过程一样:
需要站在前人的肩膀上来进行提效!如果直接把IP干到底层,那么所有的局域网通信都得修改!这是非常麻烦的事情!
IP网络层存在的意义:提供网络虚拟层,让世界的所有网络都是IP网络,屏蔽底层网络的差异