在介绍网络之前,先讲一个概念,一台计算机的内部本质也是一个小型网络结构,CPU、内存、外设都是通过线连接起来的,并且它们之前也有协议,一台计算机各个功能用多台计算机构建起来,用网络及链起来,就有了存储集群的概念,各个存储集群合起来就是一个大型计算机
这段话如果不理解没关系,等看完这篇文章在回过头来看看
协议
概念
协议就是一种**“约定”**
它是多方协商出来的一种通信方案,达成一种“共识”。双方想要进行通信,就需要按照双方事先都知道的约定进行通信。例如:两方之间发送电报,事先约定了0代表收到,1代表发起进攻等,这个约定是两方都知道的。
协议的好处:
- 统一标准,通信双方能够通过某种标识把数据识别出来
- 提高通信的效率和可靠性,减少通信成本
计算机之间想要传递各种不同的信息,就需要约定好双方的数据格式。
协议分层
整个网络协议栈被分成层状结构的一个个的小模块,具体到实例有OSI七层参考模型和TCP/IP五层模型
协议分层的好处:
每一层做不同的工作,下一层为上一层提供特定的服务,同一层之间交互使用相同的“协议”
同一层之间进行交互会使用下一层提供的服务(接口服务),且不会关心下一层的实现细节,层与层之间通过接口实现通信,实现了“解耦”
举例: 两个人在打电话,都是用汉语进行交流,表面上看是两人直接进行通信。仔细思考会发现,在人通信层的下一层在为两人通信提供服务,电话层与对端的电话层通过电话协议进行通信,电话层需要将人说话的声音进行处理,转为电信号,然后发送给对端的电话层,对端的电话层收到电信号之后进行处理,转为人的声音,这样,对端的人就听到的是人的声音。两个人通信的时候是不会关心下一层服务细节,就可以直接进行通信。
协议分层的本质: 实现了软件工程上的解耦(低内聚),一层都是相关的内容(高内聚)
OSI七层模型和TCP/IP模型
为什么会有网络模型这样的东西呢?在网络通信中,我们必须经历几个过程才能从A主机到B主机,例如我们在南京,要去北京,在不直达的情况下,我们要一个一个城市的去才能到达北京,所以网络通信中要解决的第一个问题:1.如何把数据交给和自己直接相连的下一台主机 我们的目标是准确的,但是路径不确定,第二个要解决的问题:2.要有路径选择的能力 如果我们在路中不认识路了怎么办?所以第三个要解决的问题:3.容错纠错的能力 有了这3点我们就可以到达目的地,但是到了任务就完成了嘛?并没有,因为我们到北京是要去玩的!第四个要解决的问题:4.解决应用方面的问题
所以每一次都有每一层都有自己匹配的协议,每一层协议都解决自己的问题
上述四个问题分别对应数据链路层、网络层、传输层、(会话、表示、应用)这3个在TCP/IP中对应的是应用层,因为这三层在工程实践中,没有办法提出一种可以容纳所有场景的应用层协议能把所有的应用的场景全部覆盖,所以工程实践里把他们变为一层,物理层比较底层,不在我刚刚提的4个问题中
所以我们平常使用的是TPC/IP模型
- 物理层: 负责光/电信号的传递方式. 比如现在以太网通用的网线(双绞 线)、早期以太网采用的的同轴电缆(现在主要用于有线电视)、光纤, 现在的wifi无线网使用电磁波等都属于物理层的概念。物理层的能力决定了最大传输速率、传输距离、抗干扰性等. 集线器(Hub,加强信号,让数据传的更远)工作在物理层.
- 数据链路层: 负责设备之间的数据帧的传送和识别. 例如网卡设备的驱动、帧同步(就是说从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作. 有以太网、令牌环网, 无线LAN等标准. 交换机(Switch)工作在数据链路层.
- 网络层: 负责地址管理和路由选择. 例如在IP协议中, 通过IP地址来标识一台主机, 并通过路由表的方式规划出两台主机之间的数据传输的线路(路由). 路由器(Router)工作在网路层.
- 传输层: 负责两台主机之间的数据传输. 如传输控制协议 (TCP), 能够确保数据可靠的从源主机发送到目标主机.
- 应用层: 负责应用程序间沟通,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等. 我们的网络编程主要就是针对应用层
图解:
利用我们之前所学的知识,应用程序和操作系统之间会存在系统调用接口!所以应用层协议底层调用的一定是系统调用,并且传输层和网络层的协议不管在任何操作系统中都是统一的标准
网络传输的基本流程
- 不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据(datagram),在链路层叫做帧(frame),应用层叫做请求和响应
- 应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装(Encapsulation).
- 首部信息中包含了一些类似于首部有多长, 载荷(payload)有多长, 上层协议是什么等信息.
- 数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部, 根据首部中的 “上层协议字段” 将数据交给对应的上层协议处理
思考几个问题:
1.报文
报文**=报头+有效载荷**
2.为什么会有报头
举一个生活中的例子,我们发快递的时候,快递公司会打包你的物品,在上面有一个快递单,这个快递单上面有目的地址等,即网络中的报头
3.协议的共性是什么?
几乎所有的协议都需要解决两个问题:
1.如何将数据包中的报头和有效载荷分离的问题,这个过程叫做解包。
2.自底向上,要确认自己的有效载荷交付给上层的那个协议,这个过程叫做分用。
4.如何解决将数据包中的报头和有效载荷分离的问题?(解包过程)
通常有两种方法:
1.定长报头。报头的长度是确定的,这样就可以实现二者分离。
2.自定义描述符字段。报头中添加一个字段,表示报头的长度。
5.如何判断自己的有效载荷要交给上层的哪一个协议?(分用过程)
报头中有一个字段,包含了要交给上一层的哪个协议
数据封装的过程:
数据分用的过程:
局域网通信
局域网内的主机是通过路由器和交换机连接在一起的,局域网内的两台主机通信本质就是两个协议栈之间在进行通信,下面是两台主机通过TCP/IP协议进行文件传输的过程:
数据在自身协议栈自顶向下进行封装:
- 数据包交给应用层,应用层添加上对应的应用层协议报头,然后把整个数据包向下交付给传输
- 传输层再添加上对应的传输层协议报头,然后把整个数据包向下交付给网络层
- 网络层再添加上对应的网络层协议报头,然后把整个数据包向下交付给数据链路层
- 数据链路层再添加上对应的数据链路层协议报头,然后把整个数据包通过网络交付给对端数据链路层
数据在对端协议栈自底向上进行分用:
- 数据链路层将数据包的报头和有效载荷进行解包分离,然后将有效载荷交付给上层的网络层
- 网络层将数据包的报头和有效载荷进行解包分离,然后将有效载荷交付给上层的传输层
- 传输层将数据包的报头和有效载荷进行解包分离,然后将有效载荷交付给上层的应用层
- 应用层将数据包的报头和有效载荷进行解包分离,将最后的数据进行相关处理然后交付给用户
- 局域网中,所有的主机可以直接通信,它们是如何确定数据是发给哪一台主机,目标主机又是如何确认数据是发给自己的?
在数据链路层,有一个MAC地址(48位),网卡硬件地址或者序列号,是全球唯一的,用来标识主机的唯一性。每一台主机都要一个MAC地址,且都知道,发送方将数据发出去,这个数据里面包含目标主机的MAC地址信息,每个主机都可以收到这一份数据,且用自己的MAC地址与数据中的目标主机MAC地址进行比较,如果不同,表明该数据不是发给自己的,就将数据丢掉,相同就表明该数据是发给自己的,就收下。
2.局域网通信的标准
有以太网、令牌环网、无限LAN,我们之前说过部分的层是统一的标准,但是局域网所在的物理层并不是统一的标准
3.以太网标准如何通信?
主机发送数据是,将MAC地址设置为一个广播地址,这样所有的主机都认为这个数据是发给自己的
4.令牌环网标准如何通信
因为任何一个时刻只允许一个主机在局域网中发送消息,而令牌环网正是使用此方法,所以局域网在这里可以使用操作系统的术语,即临界资源
跨网络通信
跨网络通信就是分别处于不同局域网的两台主机之间进行通信,根据前面的知识我们可以知道,两个局域网之间是通过路由器进行通信的,所以这两台主机进行通信要经过至少一台路由器,更多的时候是多台路由器,下面是跨网段的两台主机的文件传输,中间会经过很多台路由器,下面的过程只经过一台路由器:
注意红色框!其他的报头对应层是一样的,但是在红色框中不一样!
可以看到的是,这里的通信比局域网内通信多了一个解包和重新封装的过程,数据封装完毕不是把数据包直接通过网络交付给对端的数据链路层,而是交付给路由器,这是为什么呢?
路由器横跨两个局域网,两个局域网负责设备之间的数据帧传送的网络协议可能是不同的,有以太网、令牌环网和无限LAN等通信协议标准。在上面的图片中显示,一个局域网使用的是以太网协议标准,一个局域网使用的是令牌环网,双方的标准有差异不能够直接通信,所以就需要有中间媒介处理进行处理,这个媒介就是路由器,它可以屏蔽底层网络的差异。前面说过了,路由器是从网络层到物理层,所以数据封装完毕会把数据包交付给路由器,最后一次封装会添加路由器的mac帧(这样局域网内的主机就可以找到对应的那一台路由器,局域网的主机都认为路由器是自己所在局域网的一台主机)。
路由器处于数据链路层的以太网驱动会把数据包中的以太网协议(路由器mac帧)报头去掉,将剩下的有效载荷交付给路由器的网络层,路由器根据目的IP地址,查询路由表进行路由转发,然后将数据包进行向下交付给令牌环网的驱动程序,它会给数据添加上对端的令牌环网协议报头信息,最后将数据包传送给对端协议栈的数据链路层
MAC地址和IP地址的区别
- IP地址既可以在局域网也可以在公网中使用,MAC地址只能在局域网中使用
- IP地址(源IP、目的IP)为我们未来每一个阶段提供方向目标,方便路径选择,**给我们提供方向,MAC地址一直在变化,MAC沿着我们的方向往后跳,**例子:我从南京来(源IP),到北京去(目的IP),中途经过上海等城市(MAC地址)