文章目录
- 网络基础
- 浅谈计算机网络背景
- 了解协议
- 网络传输基本流程
- 局域网传输基本流程
- 跨网络的数据传输流程
网络基础
浅谈计算机网络背景
计算机最早是没有网络的,当时想要数据之间交互就需要人来传递,但是这样效率非常低,而且也容易出错;
后来为了提高效率,通过一根总线和集线器,将小范围的计算机链接在一起(教室大小的范围),其中有一台计算机当作共享服务器,其他计算机负责数据处理,再利用共享服务器做数据交互
再后来,就由这种简陋的模型发展成了局域网;假设将一个教室大小看作一个整体,里面有多台计算机经交换机连接在一起组成局域网,那么多个教室之间互相交互就由路由器连接各个教室交换机,就可以实现跨网络传送
局域网不断的发展,变得越来越大,就发展成了“广域网”,(这只是一个相对概念,为了区分局域网的区别)例如,一个省分为好多区,把每个区看作一个局域网,那么站在省的角度,就可以说是广域网。
了解协议
协议是一种约定,例如两台计算机之间约定进行通信,计算机A给计算机B发数据之前先发送三个1三个0,计算机B收到信号后,先回复三个0三个1,之后开始接收数据。例如生活中的遥控器,每个按键按下的时候,都会发送一串由2进制组成的红外波,电视接收后再把红外波解析成二进制码。
一般咋网络通信协议上的制定,都是由这个邻域的领头企业,例如5G华为;而想要提高效率就只能跟随制定的协议,要么厂商就只能自己发展,并且使用协议的用户多了,也就决定了市场,其他不想跟随的企业也只能跟随,这样就达到了相对统一。
实际的网络通信非常复杂, 需要分很多的层次,如图所示:
OSI七层模型
- OSI(Open System Interconnection,开放系统互连)七层网络模型称为开放式系统互联参考模型, 是一个逻辑上的定义和规范;
- 把网络从逻辑上分为了7层. 每一层都有相关的物理设备,比如路由器,交换机;
- OSI 七层模型是一种框架性的设计方法,其最主要的功能使就是帮助不同类型的主机实现数据传输;
- 它的最大优点是将服务、接口和协议这三个概念明确地区分开来,概念清楚,理论也比较完整.。通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯;
七层模型相对复杂且不实用,一般都按4层或者5层区分
- 应用层: 负责应用程序间沟通,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问 协议(Telnet)等. 我们的网络编程主要就是针对应用层
- 传输层: 负责两台主机之间的数据传输. 如传输控制协议 (TCP), 能够确保数据可靠的从源主机发送到目标主机
- 网络层: 负责地址管理和路由选择. 。如在IP协议中, 通过IP地址来标识一台主机, 并通过路由表的方式规划出两台主机之间的数据传输的线路。(路由器工作在网路层)
- 数据链路层:负责设备之间的数据帧的传送和识别.;例如网卡设备的驱动、帧同步(就是说从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作,有以太网、令牌环网, 无线LAN等标准(交换机工作在数据链路层)
- 物理层:负责光/电信号的传递方式. 比如现在以太网通用的网线(双绞 线)、早期以太网采用的的同轴电缆 (现在主要用于有线电视)、光纤, 现在的wifi无线网使用电磁波等都属于物理层的概念。物理层的能力决定了最大传输速率、传输距离、抗干扰性等(集线器工作在物理层)
网络传输基本流程
局域网传输基本流程
在局域网中,两台主机是可以直接通信的,通信流程如下,其中最底层的一条线是网线,属于物理结构
(TCP层还有一个协议是udp)
主机A给主机B发送数据时,不是直接从应用层到对方应用层的(不是横着直接发送的),而是自上到下,经过以太网到达对方最底层,之后自下而上贯穿(发送数据是U型的)
在自上而下、自下而上的同时,每一层都会添加自己的“报头”文件,经过以太网发送到对端主机后,对端主机每一层解析自己层所需的报头文件
(每一层从上层封装下来的数据叫做载荷,加上当前层的报头又组成载荷给下一层)
站在应用层的角度,就好像是由主机A直接发送给主机B一样,而主机发送数据最后是只需要数据的,这个数据就经历了封装 -> 解包的过程。
报头是什么?
报头就类似于快递,当在网上买完东西后,会先由商家去发快递,快递会把商品包装,包装后贴上快递单,快递单上有单独的单号、发货地址、收货地址等等信息,经过公路的运输到达一些转运点,转运点会扫描所需的信息分发给具体的运输车,运输车会到达收货地再由快递员按收货地址分片配送。
而报头就是数据的“快递单”,上面有每一层所需要的数据,来指导当前层进行某种协议决策。
报头的本质
LinuxOS是C语言写的,站在语言角度报头的数据结构可能是如下的结构:
struct my_hdr { unsigned int src:16; unsigned int dst:16; unsigned int type:8; unsigned int len:24; }; 报头就是一个位段,具体和协议有关
假设发送一个数据,那么数据可以看成是载荷放在缓冲区里,那么报头就是 位段变量,
struct my_hardA.stc = 0x1
将这些位段数据拷贝到载荷前面;那么如何拿到数据呢?,可以将这个整体强转成struct my_har*
,之后++一下就拿到数据了
(封装与解包)几乎每一层的报头都包含两种字段:
- 当前报文的有效载荷要交付给上一层的哪一个协议(例如TCP与UDP)
- 明确报头与载荷的边界
上面介绍的是两台主机间通信的流程,那么多台主机的通信基本和上述一样,但有一些细节需要注意
如图,
-
每个主机都有自己的MAC地址,主机A要给主机E发送数据,就需要带上E的MAC地址;
MAC地址的长度为48位(6个字节),通常表示为12个16进制数,每2个16进制数之间用冒号隔开 xx:xx:xx:xx:xx:xx
MAC地址由网络设备制造商生产时写在硬件内部,更多应用在局域网中的。
-
由于局域网的网络资源是共享的,所以所有主机其实都能收到主机A给主机E发送的数据,但是它们看到MAC地址不是自己的选择丢弃
-
假如A发送完后马上B也给E发送,就会发生数据碰撞,所以每台主机都要有碰撞检测的能力以及碰撞避免的算法,保证每个时刻只有一台主机向局域网中通信
上述中共享的网络资源就可以看成是个临界资源,那么数据碰撞就可以看成是互斥,系统和网络是不分家的
要攻击局域网,其实就等于是线程的饥饿问题,一直发送数据,同时由于局域网络资源是共享的,只是通信的主机认为是单独通信,实际上所有主机都能看到数据,那么就可以对数据进行抓包等等(这些做法不推荐,有兴趣的可以用自己的多台设备实验)
跨网络的数据传输流程
局域网通信应用Mac地址比较多,而跨网络主要就是IP地址了,图示如下:
主机A和主机B是两个不同的局域网(令牌环类似于互斥锁,谁拿锁谁向局域网发送数据),当主机A跨网络向主机B发送数据时:
- 会先进行封装,一直到达链路层,之后解封发送给路由器
- 路由器收到后,会再次进行封装,封装的是令牌环相关的报头,并发送给主机B
- 主机B收到后,又会进行解封一路向上直到拿到纯数据
其中,MAC和IP地址各自的作用又是什么样的?
-
主机A给主机B发送数据是要跨网络的,所以会先发送给路由器,所以MAC的地址会先填写路由器的MAC
-
但是又得让路由器直到是发送给谁的,所以要带上主机B的IP地址
-
路由器收到后通过IP地址知道是要发送给谁的,之后将数据重新封装并带上MAC B的地址
MAC地址就好比快递在运输过程中的每个省份的高速入口出口,IP地址就好比最终的目的地,(IP地址在网络层,MAC地址在链路层)
由于每个局域网的链路层用的协议都不一样,那么站在路由器的角度就等于把底层统一了,上层看不见底层是怎样的通信的,屏蔽了底层的差异,这是分层的好处,因为用户并不关心底层是怎样的,只想把数据传送到。
(IP地址为32位,由用点分隔开的4个8八位组构成,如192.168.1.1,这种写法叫点分十进制格式)