操作系统网络__网络基础
OSI七层模型
OSI:开放系统互联模型,是一套较为完整的网络体系结构。
自底向上共有七层,依次是 物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。其中前四层是涉及到操作系统层面涉及到数据传递服务的,后三层是用来对用户提供服务的。
物理层:物理层最底层的,属于硬件层面,设计到的主要是电信号的传递、物理接口、电气特性等
数据链路层:数据链路层主要是负责在传输数据的过程中,向数据包添加MAC【1】包头等信息;同时数据链路层还兼具错误检测和修正的功能(载波监听多路访问),一旦数据传输错误,可以要求重新传输数据包,来进行数据修正。
网络层:网络层负责在数据包中添加IP【2】包头,收发的IP都需要添加,用来选择通路,即数据发送的路径。因为数据的发送可能跨多个网段,中间要经过多个路由器的中转。
传输层:传输层要做的是确定传输协议的可靠性,常见的传输协议有 TCP 和 UDP 【3】 。同时还要确定端口号 ,每种传输协议都有自己特定的端口号,Linux下有65525个端口
会话层:确定网络服务是否要经过会话层
表示层:数据进行数据化,转变为计算机可以是被的信息,同时实现加密、压缩等功能
应用层:提供用户接口
【1】:MAC地址是用来确定局域网内的某一台主机的,局域网之间的通信由交换机实现,交换机只能识别MAC地址。
【2】:IP地址是网络上主机的唯一标识,网络上的通信由路由器实现,通过对IP的判断实现。
【3】:TCP(传输控制协议)和UDP(用户数据报协议)都属于传输协议。UDP的传输速度要更快,但不面向连接,也不保证可靠性,会导致数据丢失。使用UDP协议的应用程序需要自己完成丢包重发、消息排序等过程;TCP是一种面向连接的,可靠的协议,传输更加的安全可靠。这就好比QQ上发送消息,通常采用的是UDP协议,因为它不在乎是否发送成功,不进行检测,没有网络之后信息发送失败;而像大型网络游戏,数据的传输采用的是TCP协议!
尽管OSI模型相当的完善,但由于OSI协议实现起来太过复杂,而且效率很低,而且层析划分不太合理,有些功能在多个层次中重复出现,导致了OSI模型最终也仅仅是一个理论模型,并没有付诸时间。当然还有一些其他的商业管理方面的原因。
与此同时,TCP/IP协议随着因特网在全世界的覆盖,慢慢成了实际上的国际标准,TCP/IP协议是四层的,但也有一种五层模型,将物理层也划入该模型,这里我们是基于协议栈的讨论,不和硬件相关,所以这里以四层模型为准。(我们可以简单的认为这里的协议栈是纯软件的概念,只涉及了逻辑和数据)
TCP/IP四层模型
OSI模型到TCP/IP四层模型的对应关系如上。每一层都呼叫它的下一层所提供的网络来完成自己的需求,每一层的功能如下:
应用层:应用层是面向用户的,属于应用程序之间沟通的层,它要求数据通信必须符合某种逻辑 。常见的服务或协议有 http与https、talnet、DNS、SMTP、FTP 、代理服务器 等;
传输层:传输层与OSI模型中对应的传输层功能基本一致,用来确保数据传输方式,TCP或UDP,并且确定数据已经被送达并接收,保证了数据包的顺序传送及数据的完整性;
网际层:提供基本的数据封包,对包头进行封装,实现数据包可以发送到目标主机(实现跨网段,但不保证是否被正确接收),有三个重要的协议:IP、IGMP、ICMP【1】;
网络接口层/链路层:网络接口层是实际发送数据的,对数据封装了MAC地址包头,该层是对实际的网路媒体的管理,解决了局域网 之间的数据传输。(实际上,TCP/IP并未定义该层的协议,由参与互联的各网络使用自己的物理层和数据链路层协议,然后与TCP/IP的网络接口层进行连接)
地址解析协议 ARP 工作在该层。
【1】:IGMP-->互联网组管理协议; ICMP-->互联网控制报文协议; IP-->网际协议
ICMP:通常我们使用的ping命令,向某一IP地址发送一个数据包,通过接收回应,判断本地与该IP二者是否相通。
局域网
局域网内的所有主机共享同一根主线,所有信息都会发送到线上,这些信息可以被所有主机收到,当主机分析数据包不是给自己的,直接丢弃,丢弃过程对上层不可见。
局域网有以太网和令牌环网之分。
以太网:所有主机都可以向共享线上发送数据;数据发生冲突通过算法调度发送顺序;
令牌环网:谁有令牌谁可以向线上发送数据,类似于线程通信中的锁。
每个局域网都可以叫做一个碰撞域,交换机可以将局域网一分为n,每个小局域网之间任然可以通信,但可以减小碰撞。
两个局域网之间的通信通过路由器实现。
TCP/IP协议栈与数据包的封装
1、局域网内部的通信
TCP/IP协议栈分为四部分,应用层、传输层、网际层、链路层。
每一层都有着自己的协议,上面已经说过。这里以FTP文件传输协议为例,剖析局域网内基于TCP/IP协议的通讯过程。
数据发送的过程:
对于四层模型而言,传输层以下机制都是有内核提供,应用层由用户进程提供。由于两台主机之间的通信必须依靠到最底层的bit流,因此在应用层的信息,需要从最上层依次传递到最下层,期间的每一次协议都会对应用层要发送的信息进程封装(在数据前加上各自的包头).
任何一层都认为上层交给自己的内容都是数据,我们把上一层交给自己的所有数据叫做该层的有效载荷。
Appl包头与用户数据类型相关,如果用户使用的是FTP文件传输协议的话,Appl就是FTP头。
不同的协议层对数据包有不同的称谓,
在传输层叫做 段(segment);
在网络层叫做 数据报(datagram);
在链路层/网络接口层叫做 帧(frame)。
当数据被封装成帧之后,会发送到传输介质上,至此,数据发送过程结束;到达目的主机之后,每层协议再剥离相应的首部,最后将应用层用户数据交给应用程序处理,这个过程叫做数据接收。
数据接收的过程:
数据的发送过程,由于是自上而下进行封装,因此当应用程序确定好发送数据之后,封装流程是唯一,采用的协议也是确定的。
数据接收的过程中,从下向上,可能是一对多的关系,这是因为当下层获得数据之后,不知道该给交给上层的哪个协议来进行解包,所以下层解包之后,向上传传输有效载荷时,必须判断该有效载荷对应的协议。
当网络接口层接收到数据之后,首先根据以太帧头首部中"上层协议"字段,确定该数据帧的有效载荷,然后交给相应的协议去处理。之后的解包过程都是如此,换句话说,以太帧包头,IP包头,都包含了"上层协议 "字段。当解包到TCP包头之后,根据TCP包头收首部的"端口号"字段确定该该将数据交给哪个进程,也就是说,用户层的每个协议都对应着一个端口号,端口号是同一台主机上标识不同进程的地址。
注意:
1、相同的协议层,都认为和彼此直接沟通,上层不知道下层做了哪些事。
2、应用层属于用户层,由用户提供;下三层属于Kernel层,即内核层。下三层接口之间属于系统调用。下三层是真正用来处理通信的过程。
2、跨网段之间的通信
为了完整性,这里还是以FTP文件传输协议为例,这里的跨网段使用的是以太网和令牌环网之间。
首先我们要知道的是,如果需要跨网段进行通信,需要路由器来实现。以太网和令牌环网之间除了在向共享线上发消息时防止冲突的机制不同,其他的并没有太大的区别。
链路层:
链路层 有着以太网和令牌环网等标准。交换机是工作在链路层的设备,可以在不同的链路层网路之间转发数据帧,但不同标准下的帧格式不同,因此交换机要将进来的数据包拆掉链路层,并重新封装新的链路层之后再发出。
链路层 的主要任务:负责网卡设备的驱动,帧同步(网线上检测什么信号算作新帧的开始),冲突检测(如果检测到冲突,数据自动重发),数据差错校验
网络层:
网络层的IP协议是构成Internet的基础,在Internet上有着大量的路由器,负责根据IP地址选择合适的路径转发数据包。路由器兼具交换机的功能。需要解掉链路层和网络层的包头,并重新封包。
IP协议不保证传输的可靠性,数据包在传输过程中可能丢失,可靠性可以在上层协议或应用程序中提供支持。(传输层的TCP,或应用程序)可靠性是综合的,安全到达,顺序到达,完整到达,不可重复。
IP:能够提供主机到主机的服务,提供了软件层面上的虚拟化,站在用户的角度,任然觉得是在直接和同一层通信。类似的虚拟化功能还有(虚拟内存,Linux下一起皆文件)IP可以通过网路路由跨网段通信。对于使用者而言,感觉不到底层的网络差异。
网络层负责点到点的通信,即在主机和路由器,路由器和路由器之间进行通信,而再向上的传输层负责的是端到端之间的通信,即主机和主机之间的通信。传输层通过TCP协议可以实现IP层传输的可靠性,如果在传输层使用UDP,则需要应用程序需要自己完成丢包重发、消息排序等工作。
--------muhuizz整理