一、网络的发展
网络的发展有下面几个阶段:
- 独立模式: 计算机之间相互独立;
- 网络互联: 多台计算机连接在一起, 完成数据共享;
- 若某个业务需要多台计算机协同完成时,可以将共享的数据放到某个服务器中集中管理,各个计算机就能通过服务器获取这些共享的数据。
- 局域网(LAN): 一片区域内的计算机通过路由器和交换机连接在一起,可以用来相互通信的计算机数量增多
交换机:局域网中有一种叫做交换机的设备,其主要用于完成局域网内的数据转发工作。
- 数据转发:在局域网内将数据从一台主机转发给另一台主机。
路由 器: 各局域网之间通过路由器连接起来,其主要用于完成数据的路由转发工作。
- 路由转发:在局域网之间路由器根据路由信息,将数据包从一个局域网转发到另一个局域网。
- 广域网(WAN): 将远隔千里的计算机都连在一起;多个局域网通过路由器连接起来,构成一个广域网,也可以说是一个更大的局域网
- 所谓 "局域网" 和 "广域网" 只是一个相对的概念. 比如, 我们有 "天朝特色" 的广域网, 也可以看做一个比较大的局域网
二、协议
1 .协议的概念
- "协议" 是一种约定。它是多方协商出来的一种解决方案,达成一种"共识"。
- 双方想要进行通信,就需要按照双方事先都知道的约定进行通信。
- 从语言的角 度看,协议是通信双方都认识的一种结构化的数据类型,双方的 OS 能通过同一种协议 (结构体) 进行通信。
例如:两方之间对暗号,事先约定了0代表收到,1代表吃饭等,这个约定是两方都知道的。
协议的好处:
- 统一标准,通信双方能够通过某种标识把数据识别出来
- 提高通信的效率和可靠性
计算机之间想要传递各种不同的信息,就需要约定好双方的数据格式。
2 . 协议分层
- 整个网络协议栈被分成层状结构的一个个的小模块,具体到实例有OSI七层参考模型和TCP/IP五成参考模型
- 协议栈是分层的,每层通信双方都有协议,同层之间互相可以认识对方的协议。
- 协议本质也是软件,在设计上为了更好的进行模块化,解耦合,也是被设计成为
层状结构的。将 层与层之间进行解耦,保证代码的可维护性和可扩展性。
- 协议本质也是软件,在设计上为了更好的进行模块化,解耦合,也是被设计成为
- 分层最大的好处在于 "封装",在分层的情况下,将某层的协议进行替换后,通信双方之间并不会受到影响。
- 纯软件的网络协议分为四层,每一层都能解决一种因为网络通信距离变长时所产生的问题。
- 每一层都能解决一种因为网络通信距离变长时所产生的问题
- 应用层:解决如何使用送达的数据。
- 传输层:解决报文在传输过程中出现错误,或者丢失。
- 网络层:解决在转发中,如何进行路径选择、目标主机定位。
- 数据链路层:解决如何保证将数据交给下一跳主机。
3 . OSI****七层参考模型
- OSI(Open System Interconnection,开放系统互连)七层网络模型称为开放式系统互联参考模型,是一个逻辑上的定义和规范;
- 把网络从逻辑上分为了 7 层. 每一层都有相关、相对应的物理设备,比如路由器,交换机;
- OSI 七层模型是一种框架性的设计方法,其最主要的功能使就是帮助不同类型的主机实现数据传输;
- 它的最大优点是将服务、接口和协议这三个概念明确地区分开来,概念清楚,理论也比较完整. 通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯;
- 但是, 它既复杂又不实用; 所以我们按照 TCP/IP 四层模型来讲解
4 . **TCP/IP五层(或四层)**模型
TCP/IP 是一组协议的代名词,它还包括许多协议,组成了 TCP/IP 协议簇 .
TCP/IP 通讯协议采用了 5 层的层级结构,每一层都呼叫它的下一层所提供的网络来完
成自己的需求 .
- 物理层: 负责光/电信号的传递方式. 比如现在以太网通用的网线(双绞线)、早期以太网采用的的同轴电缆(现在主要用于有线电视)、光纤, 现在的 wifi 无线网使用电磁波等都属于物理层的概念。物理层的能力决定了最大传输速率、传输距离、抗干扰性等. 集线器(Hub)工作在物理层.
- 数据链路层: 负责设备之间的数据帧的传送和识别. 例如网卡设备的驱动、帧同步(就是说从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作. 有以太网、令牌环网, 无线 LAN 等标准. 交换机(Switch)工作在数据链路层.
- 网络层: 负责地址管理和路由选择. 例如在 IP 协议中, 通过 IP 地址来标识一台主机, 并通过路由表的方式规划出两台主机之间的数据传输的线路(路由). 路由器(Router)工作在网路层.
- 传输层: 负责两台主机之间的数据传输. 如传输控制协议 (TCP), 能够确保数据可靠的从源主机发送到目标主机.
- 应用层: 负责应用程序间沟通,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等. 我们的网络编程主要就是针对应用层.
- 可以看出OS贯穿整个网络协议栈,协议栈是网络标准组织定义的,所有的OS(Windows.Linux和MacOs等)都是支持的。数据通信的本质就是
两个协议栈之间进行通信
。
总结:
- 应用层解决的传输数据的目的,根据特定的通信目的,进行数据分析与处理,达到某种业务性的目的
- 传输层和网络层处理数据传输遇到的问题,保证数据的可靠性
- 数据链路层和物理层负责数据真正发送的过程,完成以太网和局域网的通信
- 下三层处理的是通信细节,应用层处理的是业务细节
一般而言:
- 对于一台主机, 它的操作系统内核实现了从传输层到物理层的内容
- 对于一台路由器, 它实现了从网络层到物理层(有些可到应用层)
- 对于一台交换机, 它实现了从数据链路层到物理层
- 对于集线器, 它只实现了物理层
但是并不绝对. 很多交换机也实现了网络层的转发; 很多路由器也实现了部分传输层的内容(比如端口转发)
三、网络传输基本流程
局域网通信协议
局域网内的主机是通过路由器和交换机连接在一起的,局域网内的两台主机通信本质就是两个协议栈之间在进行通信,下面是两台主机通过TCP/IP协议进行文件传输的过程:
1 .数据的封装和分用
- 不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报 (datagram),在链路层叫做帧(frame),应用层叫做请求和响应
- 应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),也就是报头,称为封装(Encapsulation).
- 报头信息中包含了一些类似于首部有多长, 载荷(payload)有多长, 上层协议是什么等信息.
- 数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部, 根据首部中的 "上层协议字段" 将数据交给对应的上层协议处理
问题:每一协议层的数据包是什么?
- 数据包=报头+有效载荷
问题:数据如何封装?
- 当应用层想将一段数据交给另一个主机时,TCP / IP 软件方面的 4 层协议从上至下要分别对该数据包进行封装。
- 将数据交给应用层,应用层会为该数据添加上对应的应用层协议的报头信息,然后将数据交给传输层。
- 传输层收到数据后,传输层会为该数据添加上对应的传输层协议的报头信息,然后将数据交给网路层。
- 网络层收到数据后,网络层会为该数据添加上对应的网络层协议的报头信息,然后将数据交给链路层。
- 链路层收到数据后,链路层会为该数据添加上对应的链路层协议的报头信息,到此数据封装完毕。
- 最后就可以通过局域网将封装好的数据发送给对端主机。
问题:协议的共性是什么?
几乎所有的协议都需要解决两个问题:
- 如何将数据包中的报头 和有效载荷 分离的问题,这个过程叫做解包。
- 自底向上,要确认自己的有效载荷 交付给上层的那个协议,这个过程叫做分用。
-
报头:本质也是一种数据,报头一般是通过位段实现的,协议栈的每一层都有一个对应的位段来表示当前层的报头。
-
有效载荷:数据包中,除了当前新增报头以外的数据就叫做有效载荷。
问题:数据包如何分用?
- 当对端主机的链路层收到一段数据包后,需要由下至上经过 TCP / IP 的 4 层,对该收到的数据机型解包和分用。
- 链路层收到数据后,将数据包中关于链路层协议的报头信息分离出来,然后将剩下的数据交给网络层。
- 网络层收到数据后,将数据包中关于网络层协议的报头信息分离出来,然后将剩下的数据交给传输层。
- 传输层收到数据后,将数据包中关于传输层协议的报头信息分离出来,然后将剩下的数据交给应用层。
- 应用层收到数据后,将数据包中关于应用层协议的报头信息分离出来,到此数据的解包分用彻底完成。
问题:如何分离报头与有效载荷?
- 要将数据中的报头取出来,就得知道报头与有效载荷之间的界限在哪。
- 又因为报头往往都在数据包的最前端,只要知道报头的大小,就可以确定报头与有效载荷的界限了。
- 有两种获取报头大小的方式
- 定长报头:报头的大小是固定的,发送方和接收方都能够知道报头的大小,这就是一种约定。如数据报
- 自描述字段:报头当中提供一个用来表示报头长度的字段。如报文长度
2 .碰撞
问题:什么是碰撞?
- 局域网中,同时有多台主机在发送数据,如果某个主机发送的数据与其他主机发送的数据之间互相干扰,这种情况被称为数据碰撞。
问题:如何判断发送的数据是否发生了碰撞?
- 因为是采用广播的形式将数据发送到局域网中,当 A 主机发送数据后,A 主机自己也能收到这个数据。
- 当 A 主机收到数据后,可将其与之前发送出去的数据进行对比,如果此时收到的数据和之前发送的不一致,就说明发生了数据碰撞。
问题:发生了碰撞后该如何处理?
- 当 A 主机发现自己发送的数据产生了数据碰撞后,A 主机可以选择等待一段时间,过一阵子在重新发送该数据。
- 从系统的角度看,局域网就是临界资源,碰撞的检测和避免,本质上就是在进行互斥访问。
问题:主机如何判断数据是否是发送给自己的?
- 发送出去的数据包会带有源 MAC 和目的 MAC 地址,其中源 MAC 地址表示的是发送数据的主机,目的 MAC 地址就不用说了。
- 主机在收到数据包后,会对比该数据包中的目的 MAC 地址和自己的 MAC 地址,如果不一致则该数据就不是发给自己的。
局域网通信原理总结:
- 局域网中,有多台主机直接通信,有可能会发生数据碰撞,这样就会影响其它主机间的通信,所以一个局域网可以看作是一个碰撞域。
- 碰撞后的数据就是垃圾数据量,局域网中的所有主机都可以收到发出去的数据,包括发数据的主机本身也是如此。
- 该主机会将收到的数据和此前发出去的数据进行对比,如果不同,代表此前发出去的数据发生了碰撞,这就是碰撞检测
- 数据发生碰撞后,发送方不会立即将数据进行重写发送,而是等一段数据,在重新发生,这就是碰撞避免算法,也是碰撞避免的一种机制
- 所以说,局域网的数据通信时在一个碰撞域中不断地碰撞,然后进行碰撞检测,碰撞避免。
- 局域网通信的本质就是基于碰撞域、碰撞检测和碰见避免实现通信,局域网内主机越多,碰撞几率越多,交换机在局域网中的作用就是划分碰撞域,解决碰撞问题,降低碰撞几率
3 . 跨网络通信
- 跨网络通信就是分别处于不同局域网的两台主机之间进行通信。
- 根据前面的知识我们可以知道,两个局域网之间是通过路由器进行通信的。
- 所以这两台主机进行通信要经过至少一台路由器,更多的时候是多台路由器。
- 下面是跨网段的两台主机的文件传输,中间会经过很多台路由器。
下面的过程只经过一台路由器:
问题:路由器如何知道数据应该转发到哪一个局域网?
- 路由器会通过 IP 地址来确定数据的转发方向。
- 互联网中的每一台主机都有一个唯一的 IP 地址,而在数据自定向下进行封装时,在网络层封装的报头中会包含两个字段,分别是 源 IP 地址和目的 IP 地址。
- 网络中有很多的路由器,数据在每经过一个路由器时,路由器都会分析这个数据的上一站从哪来,然后根据这个数据包中得目的 IP 地址,选择这个数据下一站该到哪去最终才能走到目的地,这个一直会变的地址就是 MAC 地址。
- 数据包在路由器中不断调整mac帧协议报头,也就是,数据包的源mac地址和目的mac地址是在不断变化的,但是源IP和目的IP是不变的。可以看到的是IP层往上的数据报头信息是不变的,变的是IP层往下的协议报头信息
- IP 地址的意义就在于路径选择,只要有了目标,途中的路由器就能够为数据包指定越来越靠近目的 IP 地址的下一站路由器。
- 通过IP地址虚拟化了底层协议的差异,这样就不需要关心底层使用的是那种通信协议,只要有源IP地址和目的IP地址就可以将数据转发出去
四、网络中的地址管理
1 .IP地址
IP 协议有两个版本 , IPv4 和 IPv6. 我们整个的课程 , 凡是提到 IP 协议 , 没有特殊说明的 ,
默认都是指 IPv4
- IP 地址处在 IP 协议中,用来标识网络中唯一的一台主机。
- 对于 IPV4 来说,IP 地址是一个 4 字节,32 位比特的整数。
- 对于 IPV6 来说,IP 地址是一个 16 字节,128 位比特的整数。
- 通常会使用 "点分十进制" 的字符串来标识 IP 地址。
- 例如 192.168.0.1 ; 用点
分割的每一个数字表示一个字节 , 范围是 0 - 255;
- 例如 192.168.0.1 ; 用点
- IP地址可以由人手动静态分配,也可以让路由器来动态分配
Linux 中查看自己的 IP 地址
- 输入
ifconfig
指令查看当前主机的配置信息,其中 inet 对应的就是当前主机的 IP 地址。
windows中查看自己ip地址
- 在命令行中,输入ipconfig指令
2 . MAC 地址
- MAC 地址用来识别链路层中相连的结点,用来表示上一跳路由和下一跳路由。
- 每张网卡上的 MAC 地址都是唯一的,不能被修改。
- MAC 地址的长度一般为 6 字节,48 位比特,一般用 16 进制 + 冒号的形式标识 (如:08:00:27:03:fb:19) 。
Linux 中查看自己的 MAC 地址
- 输入
ifconfig
指令查看当前主机的配置信息,其中 ether 对应的就是当前主机的 MAC 地址。