文章目录
OSI将计算机网络分为七层,自底向上分别是:
物理层->数据链路层->网络层->传输层->会话层->表示层->应用层
虽然该分层没有被广泛应用,但是仍然是最值得学习和研究的网络体系结构。之前在《深入理解计算机网络》第二到四章读后感中大略讲解了各个层次的作用,但是比较简略,没有讲出各个层次的联系以及详细的职能。所以我还参考了哈工大计算机网络课程,以及网上的资料,由自己对计算机网络的分层做个总结。
一、物理层
物理层的主要目的是构建物理链路,实现最底层的传输信道,主要任务是定义了与传输介质,连接器及其接口相关的机械特性,电气特性,功能特性,规程特性(也就是物理层协议)。包括功能:
1. 构建物理链路
物理层最基本的功能就是构建用于计算机网络中进行数据传输的物理链路,由传输介质,网络接口,网络设备,通信协议等组成。
2. 透明传输(隐藏实现细节):
既然计算机网络体系结构是分层实现的,每层之间都是相对透明的,即每层没必要知道另外的层次具体做了什么,只要利用相邻层所提供的接口实现自己该做任务即可。这里的透明传输指的是物理层隐藏了传输介质的差异以及相关的物理层通信协议等。
3. 传输数据
由上层传来的数据最终都是通过物理层传输出去的,物理层的传输单位为比特,负责在发送端通过网络接口和传输介质将数据按比特流的顺序一位位地传输到接收端的物理层。
4. 数据编码
为了使上层传来的数据能在物理链路上有效,可靠的传输,物理层需要将上层数据进行编码为链路所能区分的形式,比如归零码,曼彻斯特编码等。
接口:
它向上层协议提供了隐藏物理传输介质传输比特流的能力。
二、数据链路层
数据链路层的作用和物理层类似,都是用于构建信道的,物理层提供了一条隐藏传输介质差异的物理链路,而数据链路层则提供了一条能可靠传输数据,对数据的传输有一定控制能力的逻辑链路。
它存在的必要性是因为物理层所建立的物理链路是依赖于具体物理设备上的,是实实在在的实体。而数据链路层所建立的逻辑链路是存在于实体之上,使之更好工作的一层。它是在数据链路层设备和相应的通信规程的作用下建立的。而更上一层的网络层的主题是放在互连,路由上的,不适宜处理过多的该层的功能,所以它的存在性的必要的。在TCP/IP协议栈中,物理层和数据链路层被合并成网络接口层,也是将这些功能和网络层分离的一个体现。
它的主要任务有:封装成帧,可靠传输,流量控制。
它可分为两个子层:
MAC子层(介质访问控制):基本功能为控制不同用户数据对物理层传输介质的访问,包括访问时的寻址以及解决可能发生的介质冲突。
LLC子层(逻辑链路控制):基本功能是负责逻辑链路的建立和释放,控制信号交换,数据流量控制,可靠传输以及通过服务访问点(SAP)和高层协议进行通信等。
根据数据链路层协议的不同,所建立的数据链路类型也会有所不同,总体上可以分为以下四类:
TYPE 1:无确认的无连接服务,如以太网服务。
TYPE 2:有确认的面向连接的服务,如PPP、HDLC等服务。
TYPE 3:有确认的无连接服务,如令牌网服务。
TYPE 4:可同时提供TYPE 1~3 类服务。
接口:
它向上层协议提供了可靠的点到点传输的能力(基于MAC子层)
它向上层协议提供了对流量传输的控制能力(基于LLC子层)
PS:网卡实现了物理层和数据链路层的功能
三、网络层
网络层的作用是计算机网络中非常的一层,是协议栈的中心,用于计算机网络系统的互连和路由。如果将物理层比作士兵,数据链路层比作有一定规章制度的士兵的话,网络层更象士兵的指挥官。引导士兵的方向。网络层最基本的两个功能便是转发与路由。转发是指将分组从路由器的输入端口转移到合适的输出端口。路由是指确定分组从源主机到达目的主机的路径。也就是路由/转发表的构建。从服务模型来看,网路层可分为无连接服务和有连接服务,无连接服务的实现有数据报网络,有连接服务的实现有虚电路网络。需要注意的一点是,网络层的面向连接是主机到主机的物理路径的连接。传输层的面向连接是进程到进程的逻辑性连接。IP协议就是无连接服务的数据报协议。
在TCP/IP网络中,网络层一般由路由协议,IP协议,ICMP协议组成。其中路由协议用于选择具体路径,生成转发表(路由表),IP协议作用于寻址规约,数据报格式。ICMP协议用于差错报告以及传递控制信息。一般IP数据报如下所示:
版本号为IP协议的版本号,比如4->IPV4 6->IPV6
首部长度以4字节为单位,因为选项字段长度是可变的,所以首部长度一定是4字节的倍数,若不够则填充到选项字段。
服务类型指示期望获得哪种类型的服务,只有在网络提供该功能时才使用,一般情况下不使用,通常该值为00H。
总长度占16位,表示IP分组的总字节数(首部+数据)。最大IP分组总长度为:65535B,最小为:20B,可以封装的最大数据为:65535-20=65515B。
生存时间表示IP分组可以通过的路由器数量(跳步数)
上层协议标识字段表示IP分组封装的是哪个协议的数据包,实现复用/分解。比如 6->TCP 17->UDP
首部校验和实现对IP分组首部的差错检验,逐跳计算,逐跳校验。
由于网络链路存在MTU(最大传输单元),也就链路层数据帧可封装的数据上限。不同链路的MTU不同,较大的IP分组向较小的MTU链路转发时可以被"分片", IP分片后到达目的主机后才会进行重组。
IP首部的相关字段用于标识分片以及确定分片的相对顺序,比如总长度,标识,标志和片偏移。
标识字段占16位,用于标识一个IP分组。每产生一个IP分组,标识计数器加一,作为该分组的标识。
标志字段占3位,分别是 保留,DF(Don’t Fragment),MF(More Fragment),其中DF=1表示禁止分片,否则表示允许分片。MF=1表示还有更多分片,否则表示最后一片或者未分片。
片偏移占13位,以8字节为单位,表示原IP分组的相对偏移量。
IP地址占32位,编址为网络号和主机号,用子网掩码来区分。IP地址被分为以下几类:
其中D类地址用于命名或者标志互联网的一组主机,只能作为目的地址。通常也叫做多播/组播地址。
E类地址用于保留研究。
IP地址中还有一些特殊地址:
ABC类地址中,有一部分是作为私有地址使用的,也就是外网中没有这些IP地址,只能作为NAT后的内部网络使用,分别是:
Class NetIDs Blocks
A类 10 1
B类 172.16 to 172.31 16
C类 192.168.0 to 192.168.255 256
为了避免地址的浪费,IP地址还能用于子网划分。也就是将主机位的部分高位用作子网号。同样的是,每个子网都有代表整个子网的网络IP,以及代表整个子网所有主机的广播IP。
ICMP协议也就是互联网控制报文协议,用于差错/异常报告和网络探询,ICMP报文分为
未来的网络层协议:IPV6
在IPV6中,优化了对网络层的设计,使之处理/转发更快捷,地址空间更加庞大,并且支持Qos控制。IPv6数据报格式对比IPv4简化了很多,不允许分片,移除了校验和和选项字段,基本首部固定为40字节。原先选项的功能移交到扩展首部中,具有单播,多播,任意播能力。在IPV4与IPV6的过度时期,使用隧道技术实现兼容。
IPv6数据报首部如下:
网络层的路由算法可以转换为求图的两个结点之间的最短路径算法,案例有迪杰斯特拉算法,距离向量路由算法,层次化路由算法等。在实际情况中,将任意规模的网络抽象成一个图计算路由过于理想化,所以在实际网络中,使用了层次化的思想。即聚合一个区域的路由器为一个自治系统(AS),同一个AS内的路由器使用相同的路由算法,不同AS内的路由器可以运行不同的AS内部路由协议。而AS之间的网关路由器(即AS中的边缘路由),使用外部路由协议。以下列举部分可以进行参考的路由协议:
内部路由协议有:RIP协议,OSPF协议
外部路由协议有:BGP协议
四、传输层
传输层的作用是提供应用进程之间的逻辑通信机制,在Internet中,有两种常用的传输层协议,也就是UDP和TCP,两者的特点是:
UDP:无需建立连接,实现简单。头部开销少,没有拥塞控制,用户可以在应用层对其进行深度定制
TCP:需要建立连接,拥有可靠传输,流量控制,拥塞控制的特点,对上层用户提供稳定,可靠的网络连接。
4.1 可靠传输
可靠传输是指保证数据的完整性,顺序性。这样一来,在不可靠的网络传输中需要解决的主要问题就是:数据错误,分组丢失,分组乱序。因为解决分组丢失/数据错误问题时可能造成分组重复的问题,所以分组重复也是需要解决的问题。
4.1.1 数据错误/分组丢失的原因和解决
原因:在不可靠的网络传输中,分组丢失和位翻转是由于网络的不可靠性直接导致的问题。
解决:该问题在分组首部加上校验和和确认标志(ACK/NAK)以及使用定时器设置超时时间即可解决。如果接收方收到正确的分组则返回ACK,让发送方继续发送之后的分组。如果接收方收到错误的分组或者等待超时就发送NAK,让发送方重新发送分组。
4.1.2 分组重复的原因和解决
原因:由于ACK和NAK的发送过程中也可能出错,所以发送方在收到错误的确认标志或者没有收到标志等待超时后可以直接重新发送未收到正确的确认标志的分组,这样一来,发送方就可能出现分组重复的问题。
解决:该问题可以使用序列号的方式解决,接收方收到重复的序列号分组时可以直接丢弃该分组。
4.1.3 分组乱序的原因和解决
原因:在之前的模型中,都是每接收一个分组就要发送一个确认标志(ACK/NAK),这样一来网络的利用率会比较低,所以之后使用了流水线机制和累积确认:如果正确收到了序列号为n之前的所有分组,就发送ACK_n,并且期待发送方发送由Seq_n+1开始的多个分组。由于发送方每次发送多个分组,而每个分组到达接收方的时间是不一致的,这样就会出现分组乱序的问题。
解决:该问题的解决方案需要更大的缓存,暂时存储接收过来的正确分组。使用滑动窗口协议限制发送-确认的分组数量,使发送方和接收方正常的协作。
滑动窗口协议就是一种灵活使用空间和序列号的一种协议,在一组序列号空间中,使用一个窗口从序列号空间某点开始进行滑动,窗口空间中的序列号分为已发送未确认和未发送两种状态,每次接收到某序列号的ACK则窗口向右进行滑动 到ACK+1的位置,也就是窗口减少了n个已确认发送的序列号空间多了n个未发送的序列号空间。具体实现还可以参考GBN协议和SR协议
4.2 流量控制
由于上层应用可能处理网络数据的速度较慢,如果发送方发送太快可能淹没接收方,流量控制,也就是解决发送方和接收方速度不匹配的一个问题。针对该问题,在之前使用的方法中已经给出了解决方案,也就是滑动窗口协议。接收方通过返回的自己的RcvWindow字段可以限制发送方发送未确认的数据不超过RcvWindow。需要注意的是,如果接收方返回的RcvWindow字段为0,也就是缓冲区满的情况,发送方也会持续发送比较小的数据段以获取RcvWindow的更新。
4.3 拥塞控制的实现
相对于流量控制,拥塞控制是用于整个网络的,因为网络拥塞程度高会造成缓存溢出,延迟过大的问题,会造成网络资源的浪费。
TCP的拥塞控制采取的是 加性增乘性减。发送方维持一个叫做拥塞窗口的状态变量(这个和之前的滑动/发送窗口不同),拥塞窗口的大小取决于网路的拥塞程序,并且动态的进行变化,发送方让自己的发送窗口等于拥塞窗口,考虑到接收方的接收能力,发送窗口可能小于拥塞窗口。也就是说拥塞窗口和接收端共同决定发送端的发送窗口。
拥塞窗口的变化规律:
1.启动时先由1指数级增长到thresh变量
2.然后到达拥塞避免状态,开始线性增长,直到重复收到3个ACK则跳到3或者发生Timeout跳转到1
3.将窗口设置为发生拥塞事件时的一半,然后跳转到2.
五、应用层
最常用的应用层协议应该就是HTTP协议了。当然,除了HTTP以外,还有SSL,SMTP等应用层协议。在RPC(远程过程调用)的实现中可能也会涉及到自己编写应用层协议。
遇到的疑问
一、MAC地址和IP地址的区别以及存在的必要性
开始我是对这两个地址有疑惑的,为什么不能全用IP地址或者全用MAC地址呢?只要地址设计得当,不是也能进行路由吗?IP地址和MAC地址是分别运行在网络层和数据链路层。不妨我们对其进行思考:
首先,网络层的基本任务的路由和转发,是肯定需要使用地址的。而数据链路层的任务是封装成帧,透明传输,差错检验。简单点说就是在物理层之上保证数据的可靠性。暂且看起来不需要地址呢。因为网络层已经处理好了数据流向问题,数据链路层只需要保证其安全可靠地传输到目的主机即可。
但是在计算机网络发展早期,有个叫交换机的东西用来小规模组网,并且他没有网络层,只有物理层和数据链路层两个层次。只拥有简单的转发功能,和路由器相似,以太网交换机拥有MAC转发表,但它比较简单,如果找不到目的MAC的转发路径就会直接进行广播,然后根据响应进行MAC地址表的学习。交换机的流行使用使之后的TCP/IP网络协议不得不考虑分层,将网络层和数据链路层分离开来。使只有二层交换功能的交换机能正常工作。PS:现在已经有了三层交换机,可以进行网络层的交换。
再者,MAC地址是物理地址,IP地址是逻辑地址。物理地址是出厂硬编码的,逻辑地址是和主机无关的。所以MAC地址的设计天生只适合局域网,不适合广域网。因为它的地址和主机是硬编码的,不适合做分层,因此使用MAC代替IP进行路由转发,也只会造成广播风暴的后果。
更多学习资料:https://blog.csdn.net/yaopeng_2005/article/details/7064869