这两天把计算机网络复习了一遍,总结一下,方便以后查看;
说起计算机网络,离不开IOS七层模型和TCP/IP四层模型,这里我会以IOS七层模型,逐层解释
一、物理层(这一层偏硬件,没有什么讲的)
二、数据链路层
首先介绍这一层主要三个功能:封装成帧、透明传输和差错监测;
封装成帧:是在数据首尾加上帧首部(SOH)和帧尾部(EOT),然后交给物理层传输,这里会涉及到一个最大传输单元MTU(Maximum Transmission Unit)的概念,数据链路层的数据帧不是无限大的,以太网MTU一般为1500字节;
透明传输:其实就是解决如果在帧数据中也出现了帧首部(SOH)和帧尾部(EOT)标记时,怕引起误差,破坏数据完整性,加上类似转义字符,实际处理是,如果提前出现EOT字符,则在前面加上一个ESC字符,如果数据中本身出现了ESC,则多加上一个ESC,类似在windows系统下编程时,字符中用两个“\”来处理“”的问题;
差错监测:最简单的监测方法就是采用奇偶校验码,就是简单的将一个数据的所有0,1比特位求和,看最后是奇数还是偶数,这种监测比较粗糙,比如如果出现了偶数次差错,最后的检验码仍然是正确的,针对这个问题,就引入了精确度更加高的循环冗余校验码CRC,首先要选定一个用于校验的多项式G(x),然后用多项式的系数采用模“2”除法,简单点理解。就是一次计算多项式最高项次数个比特位,显然,最高项次数越高,检测结果越准确,但是计算成本也高,具体计算细节在这就不多介绍了;
数据链路层主要是管理相邻节点间的数据通信,利用以太网协议解决数据当前一跳的问题
简单来说,就是在帧数据报首部加上目标MAC地址和源MAC地址,每一个路由器内部都有一个MAC地址表,可以查询到MAC地址对应的硬件接口,这样就可以完成将帧数据从此节点传送到下一节点的动作;
三、网络层
- IP协议
网络层主要解决数据在网络中具体传输路径的问题,首先看IP协议的位置和具体组成:
我们来依次解释各关键部分代表的意思:
4位版本:指的是IP协议的版本,通信双方必须版本一致,当前主流版本是4,即IPv4,也有IPv4;
4位首部长度:可以表示的最大数值是15,表示的是IP协议首部长度,单位是“4字节”,也就可以计算出IP协议首部最长也只能是60字节;
16位总长度:最大数值是65535,表示的是IP数据报的总长度(IP首部+IP数据);
16位标识:用来唯一地标识主机发送的每一份数据报。通常每发一份报文,它的值会加1;
3位标识:标志一份数据报是否要求分段。
13位位偏移:如果一份数据报要求分段的话,此字段指明该段偏移距原始数据报开始的位置。
8位生存时间(TTL:Time to Live):用来设置数据报最多可以经过的路由器数。由发送数据的源主机设置,通常为32、64、128等。每经过一个路由器,其值减1,直到0时该数据报被丢弃。
8位协议:占8比特。指明IP层所封装的上层协议类型,如ICMP
、IGMP
、TCP
、UDP
等。
源IP地址、目标IP地址:各占32比特。用来标明发送IP数据报文的源主机地址和接收IP报文的目标主机地址。
可选项:占32比特。用来定义一些任选项:如记录路径、时间戳等。这些选项很少被使用,同时并不是所有主机和路由器都支持这些选项。可选项字段的长度必须是32比特的整数倍,如果不足,必须填充0以达到此长度要求。
总的来说,IP协议主要包含了我从哪里来(源IP),要到哪里去(目标IP),我能存活多久,我是什么等这些问题,这里的IP地址和以太网的MAC地址不同,在以太网协议中,在每一跳中,MAC地址都是变化的,指向当前节点和下一节点,但是IP协议的地址不发生变化,一直是发送方和接收方的IP地址;
- ARP协议和RARP协议
那么我知道了目标的IP地址,但是我不知道他的MAC地址,如何解决IP地址和MAC地址相互映射的问题呢?接下来就要谈到ARP协议(地址解析协议)和RARP协议(反向地址转换协议)协议了;
这里就要介绍ARP缓存表了,ARP缓存表记录了IP地址和MAC地址的映射关系,当某一节点接收到消息之后,就会从IP协议中得到目标的IP地址,此时查询ARP缓存表,如果其中有对应的MAC地址,就直接得到了MAC地址,如果没有找到,则会广播发出包含ARP协议的信息,直到信息传达到目标的IP地址,此时接收方就会对该节点单一回传一个包含自己MAC地址的信息,然后再在ARP缓存表中记录上此条映射关系,简单点说,就是兄弟(接收方),我想给你寄快递,但是我不知道你的地址,我只知道你叫什么,可以把你的地址告诉我么,然后把这条信息广播出去,等到你兄弟接受到这条信息之后,他会偷偷告诉你一个人,他的地址;
而RARP协议主要是设置一台新的机器时,只有新机器的MAC地址,而没有IP地址时,向路由器发送一个包含RARP协议的信息,然后路由器返回他的IP地址给你,就是你的IP地址了。比如我们的电脑在家,在办公室,在公共场所连入WIFI时,都会使用到这个协议,简单点说,就是兄弟(路由器),我买新房子了,但是我不不知道我这小区叫什么名字,你告诉我一下呗,然后兄弟告诉你,这个小区叫什么;
- ICMP协议
从上面我们可以知道IP协议并不提供可靠传输,发送方传送出去的东西,并不知道接收方到底是否接收到了,如果没接收到,那么没接收到的原因是什么,比如关机等等,此时就要用到ICMP协议了,
一个新搭建好的网络,往往需要先进行一个简单的测试,来验证网络是否畅通;但是IP协议并不提供可靠传输。如果丢包了,IP协议并不能通知传输层是否丢包以及丢包的原因。 所以我们就需要一种协议来完成这样的功能–ICMP协议。
ICMP协议的功能主要有:
- 确认IP包是否成功到达目标地址
- 通知在发送过程中IP包被丢弃的原因
简单点说,就是兄弟,我想给你寄快递,你那边可以收到么?要是不能收到,是什么原因呢?是你不在家,还是怎么?
对于ICMP协议最常的应用就是Ping命令和Traceroute命令(Windows 系统下是Tracert);
- 路由表
最后,我们来解决最关键的问题,知道了目标IP地址,目标MAC地址,网络情况良好,万事具备了,那我们的信息在网络层到底按照什么路线来传递呢,接下来我们介绍路由表和相应的路由算法;
路由表主要记录目的IP地址和下一跳的IP地址的映射关系,在网络层中,每一个点代表一个网络、路由器或者计算机,每一条边表示一条网络路径,路由算法实际就是图论算法,但是由于网络环境复杂,所以比图论算法要复杂一些,
首先引入自治系统(AS:autonomous system)的概念,一个自治系统就是处于一个管理机构控制之下的路由器和网络群组,在自治系统内部的网关协议称为内部网关协议(RIP、OSPF),在自治系统外部的网关协议称为外部网关协议(BGP);
- RIP协议
RIP协议采用的距离矢量(DV)算法,此算法的核心公式就是Dij = min(Dix+Dxj) = Dix + min{Dxj};这个公式的含义就是从节点i到达节点j,路径节点x时,此时的距离等于从节点i到达节点x的距离加上从x到达j的所有路径中的最短距离;
不过RIP协议是将网络的跳数作为DV算法的距离,RIP协议认为跳数大于15时的路由为不可达路由,DV算法实现简单,开销也很小,具体算法细节就不在这里展开了,不过这个算法的缺点也是显而易见的,跳数最多为15,限制网络的规模,“坏消息”(如某处节点损坏),需要跳数大于15时,才将此节点设置为不可达,更新收敛时间过长;
- OSPF协议
OSPF协议采用的算法是Dijkstra算法,它是一个著名的图算法,其实核心就是广度优先搜索(BFS)算法和贪心算法的结合,简单点说就是划分连个集合S1、S2,初始时以发送方单一节点为集合S1,其他所有节点为集合S2,为发送点为中心的可见点(仅一跳可达的节点)中,距离最近的点,加入到集合S1中,然后再以集合S1中的节点的所有可见点中,重复此操作,直到S2为空集时停止;
OSPF协议使用的是链路状态协议(LS),链路状态协议就是基于Dijkstra算法,如果说距离矢量路由协议提供的是路标,那么链路状态路由协议提供的就是地图,每一个路由器都包含整个网络拓扑信息,而地图的搭建就是通过OSPF协议完成的,
OSPF的包类型:
- Hello包:用于发现和维护邻居关系。选举DR(指定路由器)和BDR(备用指定路由器)
- 数据库描述包(DBD):用于向邻居发送摘要信息以同步链路状态数据库
- 链路状态请求包(LSR):在路由器收到包含新信息的DBD后发送,用于请求更详细的信息
- 链路更新包(LSU):收到LSR后发送链路状态通告(LSA),一个LSU数据包可能包含几个LSA
- 链路状态确认包(LSAck):确认已经LSU,每个LSA需要被分别确认
RIP协议和OSFP协议的对比
- BGP协议
外部网关协议就是在每个自治系统内部,选出两个BGP发言人,简单点说,就是选两个话事人,信息能不能传输进我的自治系统,按照什么规则传入,都是由这两个话事人说了算;
最后总结一下,在网络层中一共提到三个表:
- MAC地址表:MAC地址和对应硬件接口的映射关系
- ARP缓存表:IP地址和MAC地址的映射关系
- 路由表:目的IP地址和下一跳IP地址的映射关系
某条数据到达某一节点,该节点先从IP协议头部得到目的IP地址,查询路由表得到下一跳的IP地址,然后查询ARP缓存表得到下一跳的MAC地址,然后封装成帧,查询MAC地址表得到对应的硬件接口,这三个表的配合使用,就能完成一条数据从发送方传送的接收方的完整操作。
四、传输层
传输层是管理端到端的通信连接,这里的端是端口的意思,不是指物理端口,而是指每一个进程的端口号,所以传输层解决的是进程与进程之间通信连接的问题,常用的端口号:FTP(21),HTTP(80),HTTPS(443),DNS(53)等等。
传输层的两大协议分别是UDP(User Datagram Protocol)协议和TCP(Transmission Control Protocol)协议;
- UDP协议
UDP协议是一个非常简单的协议,它是一种无连接协议,不能保证可靠的交付数据,“想发就发”,无法保证数据是否在网络中丢失,它是一种面向报文传输的,首部开销很小。
- TCP协议
TCP协议是计算机网络中非常复杂的一个协议,他是一个面向连接的协议,提供可靠的传输服务,TCP协议是面向字节流的协议。
关于TCP头部各部分的解释细节,网上有很多,我就简单的说一下,源端口,目的端口号没啥说的,序号,指的是此条数据是相对于字节流的首字节序号,确认号是相对于发送方的,TCP是双向连接的协议,发送方和接收方是相对的,确认号就是告诉对方,在这个确认号之前的信息我已经收到了,我期望收到确认号之后的信息,数据偏移是指数据偏离首部的位置,其实也就是表明了TCP首部的实际长度,保留字段是预留出来的字段,方便以后开发新功能,TCP标记,URG=1表示紧急数据,优先传送,ACK=1表示确认号生效,RST=1表示重新建立连接,SYN=1表示连接请求报文,FIN=1表示释放连接,窗口大小表示允许对方发送的数据量,检验和是检验TCP头部是否传输错误,紧急指针是配合URG标记使用的,指定紧急数据在报文中的位置;选项最多40字节,支持未来拓展。
这里介绍两个概念:停止等待协议和连续ARQ协议
停止等待协议简单来说就是发送方传送一条数据,然后停下来等待,等接收方接收到消息之后,回传确认信息,发送方接收到确认消息之后,再接着传送下一条信息,如此反复,显然这个对信道的利用率很低,而连续ARQ协议则不同,它会设置一个滑动窗口,在窗口大小内的数据都能传输,采用累积确认的方式,这样极大提高的对信道的利用效率,TCP协议采用的就是连续ARQ协议,滑动窗口以字节为单位;
接下来介绍TCP协议的几个重要功能:
- 流量控制:通过调整滑动窗口大小,来控制发送方的发送速率(这里添加一个坚持定时器介绍,当某个滑动窗口为0时,发送方启动坚持定时器,坚持计时器重要是为了防止接收方发送的调整窗口的大小信息丢失,接收方和发送方同时进入等待状态,形成死锁的局面,发送方每隔一段时间向接收方发送窗口探测报文);
- 拥塞控制:采用慢启动算法,由小到大逐渐增加发送数据量,采用指数增长,当到达慢启动阈值时,启动拥塞避免算法,维护一个拥塞窗口变量,只要网络不拥塞,就试探性的增大窗口,每次加一;
最后是TCP连接的建立,也就是经常说的“三次握手,四次释放”;
男:我想你谈恋爱;(一次握手)
- 重传计时器:发送方发送数据后,等待接收方的回复,如果在2RTT(Round-Trip Time:往返时延)内未收到回复消息,就会启动超时重传机制,认定该条数据丢失,重新发送该条数据;
- 坚持计时器:是TCP协议在流量控制中,当滑动窗口设置为0时,启动坚持定时器,询问窗口是否开启;
- 时间等待计时器:确保第四次释放能顺利完成,等待2MSL时间;
- 保活计时器:具体介绍一下,每当服务器收到客户的信息,就将保活计时器复位,超时通常设置2小时,若服务器超过2小时还没有收到来自客户的信息,就发送探测报文段,若发送了10个探测报文段(没75秒发送一个)还没收到响应,则终止连接。比如某一方突然死机了,等到保活计时器到时间了,就会发送探测报文,来决定是否释放连接;
参考:
- 慕课网精英讲师咚咚呛课件
- 百度百科
- 以及遇到不懂问题时,查阅的各路大神的博客