文章目录
一、计算机网络背景
1 历史背景
从历史发展上来看,计算机、操作系统和网络的发展顺序是计算机->OS->网络。
现在使用的计算机一般认为起源于冷战时期的美国军方,后续流入了欧美高校。
各大高校使用计算机进行很多的数据处理,但是数据交互这个需求是客观存在的,在没有计算机网络的时候,需要让人亲自去带着数据到对应计算机去拷贝,这样是效率很低下的。
因此最早的场景,我们是把多台计算机通过物理线路链接起来,一起链接到一个计算机上,然后处理完数据后都把数据扔到公共计算机上,需要其他机器数据时去计算机拉去数据,这样效率有了一定的提高。
![](https://i-blog.csdnimg.cn/blog_migrate/4a646f5404f39eb082744341369db121.png)
后来需要链接这种“网络”的计算机越来越多了,为了方便提供了一种交换机—路由器的局域网LAN,一些计算机连接到一个交换机上,这些计算机就可以互相通信,然后不同的交换机通过路由器链接到一起,使得它们之间可以互相通信。
![](https://i-blog.csdnimg.cn/blog_migrate/bace98881a25a7b2fdab55c15936a848.png)
这样我们就从最早的机器直连的网络传送进步到了局域网LAN的网络传送。
后来局域网越来越多,为了使这些局域网能够互相通信,通过路由器将这些局域网链接起来就形成了所谓的广域网。
![](https://i-blog.csdnimg.cn/blog_migrate/d0e48d1f7389b87dfe862649f7e37209.png)
所谓局域网和广域网(以及什么城域网)只是相对的概念,广域网也可以看做是一个比较大的局域网。
2 网络“在哪呢”
3 初步认识计算机协议
所谓计算机协议就是一种约定,是程序员根据标准文档或者是一些出于需求而制定的特性,所定义好的传输信息的约定。
但是我们仅仅是遵守一些协议完全是不足以足够达到通信的目的,因为不同厂家的协议的实现细节可能也不同,这些差别可能导致我们无法通信,因此会有大佬站出来,约定一个协议,并且规定这个协议的实现细节都标准化,这样不管是什么厂商的计算机,只要是遵守这个标准规定,就可以相互通信,这就是网络协议。
那么大家为啥都会去遵守协议呢?是因为这套协议足够好,技术效率很高,如果不用这套协议,速度等效率指标上就会变差。
二、协议分层
协议为什么要分层呢,举一个例子,比如张三和李四打电话,他们通过座机通话,因此座机之间传输有一个协议,他们都讲汉语,因此还有一层汉语的协议,如果未来它们更改了用手机进行通话,那么底层协议只需要改成手机之间的通信协议即可,另外,如果他们未来使用其他语言进行交流,比如都说英语,那么只要他俩更改成英语协议即可,底层协议不用动,这就是协议分层的具体例子与好处。
通过分层完成了解耦,任何一层想要替换,都可以单独替换,不会影响其它层。
三、OSI七层模型
- OSI(Open System Interconnection,开放系统互连)七层网络模型称为开放式系统互联参考模型,是一个逻辑上的定义和规范;
- 把网络从逻辑(硬件上并不真实存在 通过代码等软件方法模拟出来的)上分为了7层. 每一层都有相关、相对应的物理设备,比如路由器,交换机;
- OSI 七层模型是一种框架性的设计方法,其最主要的功能使就是帮助不同类型的主机实现数据传输;
- 它的最大优点是将服务、接口和协议这三个概念明确地区分开来,概念清楚,理论也比较完整. 通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯;
- 但是, 它既复杂又不实用; 所以我们按照TCP/IP四层模型来讲解.
四、TCP/IP四层模型
TCP/IP是软件上的层次,物理层仅仅是来凑数的,所以说TCP/IP是五层的是有点错误的。
TCP/IP是一组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇.
TCP/IP通讯协议采用了5层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求.
- 物理层: 负责光/电信号的传递方式. 比如现在以太网通用的网线(双绞 线)、早期以太网采用的的同轴电缆(现在主要用于有线电视)、光纤, 现在的wifi无线网使用电磁波等都属于物理层的概念。物理层的能力决定了最大传输速率、传输距离、抗干扰性等. 集线器(Hub)工作在物理层.
- 数据链路层: 负责设备之间的数据帧的传送和识别. 例如网卡设备的驱动、帧同步(就是说从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作. 有以太网、令牌环网, 无线LAN等标准. 交换机(Switch)工作在数据链路层.
- 网络层: 负责地址管理和路由选择. 例如在IP协议中, 通过IP地址来标识一台主机, 并通过路由表的方式规划出两台主机之间的数据传输的线路(路由). 路由器(Router)工作在网路层.
- 传输层: 负责两台主机之间的数据传输. 如传输控制协议 (TCP), 能够确保数据可靠的从源主机发送到目标主机.
- 应用层: 负责应用程序间沟通,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等. 我们的网络编程主要就是针对应用层
初步认识:物理层就是怎么把这堆01二进制给传到实际物理世界的线路上;数据链路层就是硬件的驱动软件;网络层负责网络中的地址管理与寻址,比如用一个IP地址唯一的标识一个连入网络的计算机,路由器,也就是我Router就工作在这一层;传输层负责两台主机之间数据通信的可靠性,比如TCP(传输控制协议)就工作在这一层;应用层就是负责应用程序之间的传输,比如电子邮件传输协议SMTP、文件传输协议FTP,他们工作在应用层。
它把OSI模型简化为了五层,它们之间的对应如下:
五、网络传输的大致流程
如两台主机在局域网中通信时,信息可以认为是这样贯穿网络的层次结构的:
那么什么是报头呢?如何理解报头?为什么要有报头?
首发快递时,快递单的作用就和报头比较像,如果没有快递单的话,就不知道怎么派发这个快递,所以报头的作用是:需要报头中的数据去指导当前层进行协议决策。
可以把网络中传输的东西分为报头和有效载荷(有效载荷中可能有上一层的报头),报头它也是一种数据,对应到C语言中其实它就是一个结构(更详细的来说,可能是一个位段),用于表示一些当前层有关的信息,封装过程就是 memcpy
或 memmove
去把报文数据拷贝到我们数据的前面,解包就是把报头的信息拿走,通过void类型指针强转成报文类型指针得到报文,然后++这个指针丢掉报文得到它要传的数据,再转成对应的指针类型。
几乎每个报头都要包含两种字段:
- 当前报文的有效载荷要交给上层的哪个协议,比如IP的报头中可能要给上层问问要给TCP还是UDP;
- 几乎每个报头都要包含明确报头和有效载荷的边界。
这是后面我们学习各种协议的共性。
那么如果我们跨局域网传输呢?
当你向一个局域网发消息的时候,就好像作为老师在教室里根一个同学说话一样,很可能这个教室的其他人同时也要说话,去“占用”资源,既然所有人都能听到我说话,正如局域网中所有机器都能得到这个消息,那么他怎么知道说的谁呢?没错,正如我们每个人都有名字一样,每个局域网对应的连入设备都有Mac地址,他用来区别这些连入设备,所以虽然所有的连入设备都收到了消息,但是解析报文中的Mac地址发现发的不是我,那么就丢弃掉了这个包。
正如教室里头疯狂说话会导致大家都听不清楚话一样,一个局域网中也可能存在数据碰撞的问题,为了处理这种问题,所以每台主机都要有检测是否发生数据碰撞的能力,并且有碰撞避免算法防止错误一直发生。
我们这里局域网就可以看做是一个所有连入局域网的计算机共享的资源,这个局域网同时只允许一个计算机在收发消息,就是一种互斥关系,所以这些碰撞避免算法其实和多线程中用锁保护邻接资源的道理很像。
所以如果要攻击这个局域网,我们就可以频繁的占有这个局域网的资源,一直给这个局域网发消息,其他主机就会出现饥饿问题。
Mac是每个网卡上的一个全球唯一标识的东西,但是它通常不用来标识,通常只用在局域网中标识,在整个网络中标识通常使用IP地址。
对于一个正在传输的包,它有两套地址:上一站从哪来,下一站往哪去;最开始从哪里来的,最终要去哪。后者是几乎一直不变的,前者是随着传输不断变化的。IP和Mac的区别就是这样,传输中一直在变化的地址是Mac地址,记录最开始从哪来,最终要去哪的地址是IP地址。
所以路由器就是根据传输中的包的IP地址,去具体告诉这个包它下一步要去哪台主机的Mac地址。
所以就算我们上面那个例子里头局域网用的东西都是不同的,但是站在IP的上层,大家发的是IP地址,收的也是IP地址,IP的意义就在于它对顶层屏蔽了底层的差异化细节,
六、Mac地址和IP地址的常识
IP地址
IP协议有两个版本, IPv4和IPv6. 我们这里, 凡是提到IP协议, 没有特殊说明的, 默认都是指IPv4;
IP地址是在IP协议中, 用来标识网络中不同主机的地址;
对于IPv4来说, IP地址是一个4字节, 32位的整数,IPV6是以128位来表示地址的。
我们通常也使用 “点分十进制” 的字符串表示IP地址, 例如 192.168.0.1 ; 用点分割的每一个数字表示一个字节, 范围是 0 - 255;
MAC地址
MAC地址用来识别数据链路层中相连的节点;
长度为48位, 即6个字节. 一般用16进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19)
在网卡出厂时就确定了, 不能修改. mac地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址, 可能会冲突; 也有些网卡支持用户配置mac地址)