一、计算机网络背景
1、独立模式:计算机之间相互独立
可是这样的话,如果我们想要做协作就必然需要交互数据,就必须得使用U盘进行拷贝,效率很低,所以我们需要网络互联,将计算机连向同一台服务器,实现数据共享------网络的雏形
2、网络互联:多台计算机连接在一起,完成数据共享
我们如果在一个实验室一起办公的话,我们可以将所有的主机都用线连起来,这样我们想要进行数据的交互的时候,我们就可以直接在电脑上进行数据的传送,但是这样虽然在一个地方的时候可以交互,但是实验室和实验室之间交互就不可能用线连接了!这就要求一个区域的子网和另一个区域的子网也要能连接起来(但是这样也会伴生数据长距离传输问题,以及如何定位的问题)
3、局域网LAN: 计算机数量更多了, 通过交换机和路由器连接在一起
当我们分隔两地的时候,就需要跨网进行数据交互,所以这个时候我们需要用光电信号来传播,就需要用到交换机和路由器,将局域网由路由器连接起来
4、广域网WAN: 将远隔千里的计算机都连在一起;
所谓 "局域网" 和 "广域网" 只是一个相对的概念. 比如, 我们有 "天朝特色" 的广域网, 也可以看做一个比较大的局域 网.
二、协议基础
2.1 应用问题引入
因为传输距离变长了,所以必然引发以下问题!!
1、怎么保证你的数据能够准确地到达下个设备??(数据链路层)
2、如何定位应该发送给那个主机??(ip网络层)
3、长距离传输的数据丢失问题(tcp传输层)
4、如何处理发来的数据(应用层)
所以协议分层的本质是:1、规模太大了 2、问题本身就是分层的!!
2.2 认识协议
"协议"其实是一种约定
生活例子:比如你是南方的,但是你考上了北方的大学,你为了给家里节省话费,你就跟家人做个约定,如果电话响了1声就是报平安,2声就是记得打生活费,3声就是有事情需要当面聊...... 而这种基于约定某种信号的决策,就是协议。
网络例子:计算机之间的传输媒介是光信号和电信号. 通过 "频率" 和 "强弱" 来表示 0 和 1 这样的信息. 要想传递各种不同的信息, 就需要约定好双方的数据格式 不同的光电信号对应的二进制组合序列究竟代表什么含义,是由双方协议遵守的源代码决定的,说白了就是网络的定制者对网络做解释,赋予他含义!!
但是显然光两台主机约定好是不够的!因为(1)计算机厂商有很多 (2)计算机OS也有很多 (3)计算机网络硬件设备也有很多 那么为了能够让不同厂商设计出来的计算机都能够相互顺畅的通信,这时候就需要有人站出来约定一个共同的标准,大家必须去遵守!这就是网络协议!
快递例子:快递单就是寄快递和收快递双方所定义好的协议,就好比你买了一个洗面奶,但是其实他的外面会包着一个盒子,上面贴着一张快递单号,你必须通过这个快递单号才能确认这个快递是不是你的,这种多出来的信息字段,就是协议的报头!!而他的表现形式就是结构体对象!(双方能够认识是因为做了一个规范,可能是源代码层面上都是约定好的)!
2.3 协议分层
以打电话举例:
在逻辑上,我们认为是人和人,电话和电话在沟通
可真实情况是人其实是和电话在沟通
这样某一层的协议出现了问题或者设备发生了更换,那么只需要处理那一层就可以了!!
2.4 关于协议引发的价值思考
1、推动技术发展以及标准被广泛接受,本质上不是搞技术的人做的,而是被一些人把这个技术的价值给挖掘了,然后倒逼这那些看不到价值的人也参与进来,而当规模越来越大的时候,想进来的人就很自然地得去遵照这条准则了---------科技推动社会进步内驱力
所以为什么我们的windows上会有很多内置办公软件啊??因为免下载其实方便了很多人去使用,同时他们跟别人做数据交互的时候,别人也就必须得使用相同的OS否则打不开软件,而这就是通过内置软件来让用户对该操作系统形成依赖,从而不断扩大产品的影响,让大家都离不开他!
2、为什么说科学技术是第一生产力呢??不仅仅得是这个科学技术很成熟,其次他还得能够被广泛使用(成熟但是无法落地的科技也是没有太大意义的!),这样他的价值才能凸显出来,而这些技术都在寻找自己的应用场景,只要场景找到了落地了创造了价值,自然就会有很多人去使用你!---------所以不能只是单纯搞技术,而是应该挖掘这个技术背后的价值和能量,从而让更多人使用这个技术!!
2.5 软件分层的价值
1、结构体、类-----------在数据层面做分离---------(c++继承)
2、代码用回调的方式在软件逻辑上做分层 --------(c++多态)
大多数情况下是两种的组合
目的:方便维护,相当于可以把一个大项目分成很多小项目,一层出问题不会影响其他层,而不同小项目之间只需要提供相关接口即可(层与层需要低耦合),而同一层的代码数据必然是强相关的(高内聚)!!
三、OSI七层模型(理论标准)
(1)OSI(Open System Interconnection,开放系统互连)七层网络模型称为开放式系统互联参考模型, 是一个逻辑上的定义和规范;
(2)把网络从逻辑上分为了7层. 每一层都有相关、相对应的物理设备,比如路由器,交换机;
(3)OSI 七层模型是一种框架性的设计方法,其最主要的功能使就是帮助不同类型的主机实现数据传输;
(4)它的最大优点是将服务、接口和协议这三个概念明确地区分开来,概念清楚,理论也比较完整. 通过七 个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯;
四、TCP/IP五层模型(工程标准)
OSI七层模型理论是好的,但是工程角度既复杂又不实用,所以我们把他变成了5层(其实7层都是需要的,只不过把上三层压缩成了一层) 名字叫做TCP/IP是因为这两层最重要!!
1、 TCP/IP是一组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇.
2、TCP/IP通讯协议采用了5层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求.
**物理层:**负责光/电信号的传递方式. 比如现在以太网通用的网线(双绞线)、早期以太网采用的的同轴电缆(现在主要用于有线电视)、光纤, 现在的wifi无线网使用电磁波等都属于物理层的概念。物理层的能力决 定了最大传输速率、传输距离、抗干扰性等. 集线器(Hub)工作在物理层.
**数据链路层:**负责设备之间的数据帧的传送和识别. 例如网卡设备的驱动、帧同步(就是说从网线上检测 到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作. 有以太网、令牌环网, 无线LAN等标准. 交换机(Switch)工作在数据链路层.
**网络层:**负责地址管理和路由选择. 例如在IP协议中, 通过IP地址来标识一台主机, 并通过路由表的方式规划出两台主机之间的数据传输的线路(路由). 路由器(Router)工作在网路层.
**传输层:**负责两台主机之间的数据传输. 如传输控制协议 (TCP), 能够确保数据可靠的从源主机发送到目标主机.
**应用层:**负责应用程序间沟通,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问 协议(Telnet)等. 我们的网络编程主要就是针对应用层.
物理层我们考虑的比较少. 因此很多时候也可以称为 TCP/IP四层模型.
一般而言
(1)对于一台主机, 它的操作系统内核实现了从传输层到物理层的内容;
(2)对于一台路由器, 它实现了从网络层到物理层;
(3)对于一台交换机, 它实现了从数据链路层到物理层;
(4)对于集线器, 它只实现了物理层;
但是并不绝对. 很多交换机也实现了网络层的转发; 很多路由器也实现了部分传输层的内容(比如端口转发);
TCP/IP四层模型和OSI七层模型的概念_网络7层模型之间的关系-CSDN博客
五、OS和网络协议栈的关系
这其实就相当于一台主机,而两台主机之间做交互比如得通过网卡(硬件),所以发送方要通过用户层贯穿协议栈到物理层,而接收方又要从物理层贯穿协议栈到用户层
所以网络通信的本质就是贯穿网络协议栈的过程!!
六、网路中的地址管理
可以用ifconfig命令查看自己主机的mac和ip
6.1 mac地址
MAC地址用来识别数据链路层中相连的节点;
长度为48位, 及6个字节. 一般用16进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19)
在网卡出厂时就确定了, 不能修改. mac地址通常是唯一的,但其实他只要保证主机在局域网具有唯一性就够了(虚拟机中的mac地址不是真实的mac地址, 可能会冲突; 也有些网卡支持用户配置mac地址).
6.2 ipv4
IP协议有两个版本, IPv4和IPv6. 我们整个的课程, 凡是提到IP协议, 没有特殊说明的, 默认都是指IPv4
IP地址是在IP协议中, 用来标识网络中不同主机的地址(让主机在全网具有唯一性);
对于IPv4来说, IP地址是一个4字节, 32位的整数;
我们通常也使用 "点分十进制" 的字符串表示IP地址, 例如 192.168.0.1 ; 用点分割的每一个数字表示一个 字节, 范围是 0 - 255;
6.3 ipv6
IPv4已经严重不足了,所以现在出现了ipv6,但是ipv4出现得太早了,所以不能这么早就把他全部都换掉,必须一步一步来!
ip6要想广泛实行,就需要孵化出更大的互联网应用场景,才能更快膨胀,吸引其他人为了加入而更换ip地址,比方说未来的物联网时代,很多家电慢慢都要入网,这个时候如果都采用ipv6的话,一旦市场份额大了,你其他ipv4的想要介入这个场景,那就必须换成ipv6
七、网络传输的基本流程
7.1 两种形式的流程图
同一个网段内的两台主机进行文件传输.
跨网段的主机的文件传输. 数据从一台计算机到另一台计算机传输过程中要经过一个或多个路由器.
7.2 封装和解包分用过程
每一层都会需要不同的协议报头! 层层往下其实就是对有效载荷进行封装
(1)用户层:需要版本号
因为很可能对方虽然跟你使用的是同一个软件,但是版本并不一定一样(有的人可能并不会经常更新),而版本不同的话可能功能也不一样,所以我们需要一个能够标识版本的字段,来让另一方做出区分从而根据不同的版本推送不同的信息!!
(2) 传输层:需要序号
同时传输的时候,可能我们说话的顺序会导致不同的意思,所以我们消息传输的可靠性其中之一必须得保证有序!!所以我们传输信息的时候需要有序号信息。
(3) 网络层:需要知道当前ip和目标ip
信息在传输的时候总得知道自己从哪来,且该去往哪里吧,这样对方在接受的时候才能知道当前的信息是发给自己的。
(4) 链路层:需要有当前mac地址和目标mac地址
这样才能知道我当前的局域网内有那么多主机,我怎么知道要去往哪个主机呢?? mac地址是每个网卡出厂的一个唯一标识,机器启动的时候OS会读取网卡的属性信息就可以获得,他存在的意义就是保证在局域网内具有唯一性!!
而当传送给另一端的时候,又会自下而上贯穿协议栈,每一层都之后认得自己的那部分报文信息,识别之后丢弃自己的那部分再往上传递(如何得知交给哪一层 是通过分用决定的),直到用户层就可以变成我们需要的有效信息了,所以层层往上就是在进行解包!
------>
1、通信的过程,本质就是不断封装和解包的过程!!
2、封装过程中每层都要添加报头,报文=报头+有效载荷
3、解包的过程会不断丢弃报头,然后根据报头的信息进行分用并向上传递!!
那么封装、解包、分用又是具体如何做到的呢??目前我们可以给出宏观的视角
(1)几乎任何层的协议,都要提供一种能力,将报头和有效载荷分离的能力
(2)几乎任何层的协议, 都要在报头中提供,决定将自己的有效载荷交付给上层哪一个协议的能力
7.3 以太网通信原理
讲个故事:老师在班级上课的时候,叫张三站起来,此时其实其他同学也听到了,但是最后只有张三理会了 --------->所以其实所有人都会接收到信息,但是并不叫张三,所以其他人在对比报文信息的时候发现该报文不是自己的于是就丢弃了!
所以发送的信息是有可能被其他非目标主机捕捉的,只不过一般情况下都会被丢弃,但是如果有人刻意为之的话还是可以被上层看到的,所以我们一般来说要对数据进行一定的加密保护,如果没有任何保护就发送数据就可能会泄漏信息!!
每个主机都有自己的mac地址,在局域网中具有唯一性
因为所有主机都可能会发送信息,所以有可能会发生数据碰撞问题!!尤其是如果有人不断往局域网发送垃圾数据的时候。
------>发送主机都要执行碰撞避免算法,他的算法原理就是每个主机在发送的时候都会等上随机的延迟时间,相当于是错峰发送!!
------>但是局域网越大碰撞概率就越大,所以一般不建议太大,否则会影响传输效率,但是如果实在需要这种场景,就需要用交换机来划分碰撞域!!
------>局域网是属于多台主机的共享资源,因为任何时刻都只能有一个主机发送消息,所以我们必须保证他的互斥性,只不过不是用加锁完成的,以太网是用碰撞避免算法来控制每个时刻都只有一个主机在发送信息,而还有一种令牌环网他所使用的方法就是通过持有某种标识(有点像令牌)才能具备发送的能力,且该资源只有一份!
八、局域网间通信过程(跨网)
8.1 再度理解ip和mac
mac地址是保证局域网中主机的唯一性
ip地址是保证主机全网的唯一性
可是他们的具体意义是什么呢??
讲个故事,假设我们要自驾从黑龙江到云南去玩,我们始终知道我们从哪来且要到哪去(源和目一直不变的,其实就是ip地址),但是我们的这个过程有很多省份,所以我们需要做路径规划,上一站从哪来,下一站又到哪里是会(源和目会一直变化,依据是我接下去要去哪里,其实就是mac地址)
IP地址,尤其是目的IP,一般是不会改变的,协助我们进行路径选择
Mac地址,出局域网后源和目都要被丢弃,让路由器重新封装
8.2 跨网流程分析
我们究竟如何进行跨网呢??
(1)首先是我们的信息到达链路层的时候,我们的链路层会看看我们的当前ip地址和目标ip地址是不是跨网了,如果跨网了就会通过包装mac地址的报文传送给自己局域网中的路由器,mac地址的目的就是将报文从局域网内部的a主机发送到b主机,只不过需要跨网的时候会指定发给路由器
(2)路由器不仅有以太网的驱动、令牌环的驱动、无线wlan......的驱动,所以他会帮我们直接解包老的报头换上新的报头,这样底层的差异化就被屏蔽了,而上三层是保持一致的。
(3)这也是为什么无论是手机还是电脑都可以入网,只要路由器能够提供他们不同的mac帧的报头,就可以把底层的差异全部屏蔽掉!
结论:
1、局域网通信的本质就是把数据交给路由器
2、IP协议屏蔽了底层网络的差异化,靠的就是工作在IP的路由器!!
3、IP实现了全球主机的软件虚拟层,一切皆是IP报文