zoukankan      html  css  js  c++  java
  • 计算机网络总结(一)

      这两天把计算机网络复习了一遍,总结一下,方便以后查看;

      说起计算机网络,离不开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层所封装的上层协议类型,如ICMPIGMPTCPUDP等。

      源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协议的功能主要有:

    1. 确认IP包是否成功到达目标地址
    2. 通知在发送过程中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的包类型:

    1. Hello包:用于发现和维护邻居关系。选举DR(指定路由器)和BDR(备用指定路由器)
    2. 数据库描述包(DBD):用于向邻居发送摘要信息以同步链路状态数据库
    3. 链路状态请求包(LSR):在路由器收到包含新信息的DBD后发送,用于请求更详细的信息
    4. 链路更新包(LSU):收到LSR后发送链路状态通告(LSA),一个LSU数据包可能包含几个LSA
    5. 链路状态确认包(LSAck):确认已经LSU,每个LSA需要被分别确认

        RIP协议和OSFP协议的对比

    •  BGP协议

      外部网关协议就是在每个自治系统内部,选出两个BGP发言人,简单点说,就是选两个话事人,信息能不能传输进我的自治系统,按照什么规则传入,都是由这两个话事人说了算;

      最后总结一下,在网络层中一共提到三个表:

    1. MAC地址表:MAC地址和对应硬件接口的映射关系
    2. ARP缓存表:IP地址和MAC地址的映射关系
    3. 路由表:目的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协议的几个重要功能:

    1. 流量控制:通过调整滑动窗口大小,来控制发送方的发送速率(这里添加一个坚持定时器介绍,当某个滑动窗口为0时,发送方启动坚持定时器,坚持计时器重要是为了防止接收方发送的调整窗口的大小信息丢失,接收方和发送方同时进入等待状态,形成死锁的局面,发送方每隔一段时间向接收方发送窗口探测报文);
    2. 拥塞控制:采用慢启动算法,由小到大逐渐增加发送数据量,采用指数增长,当到达慢启动阈值时,启动拥塞避免算法,维护一个拥塞窗口变量,只要网络不拥塞,就试探性的增大窗口,每次加一;

      最后是TCP连接的建立,也就是经常说的“三次握手,四次释放”;

      

        

     

     
      上面的两幅图完整解释了整个过程,简单点来说,打个比方,就是两个人建立恋爱关系和分手的过程;
      男:我想你谈恋爱;(一次握手)
      女:好吧,我也想和你谈恋爱;(两次握手)
      男:可以,那我们开始恋爱吧;(三次握手)
      等到整个恋爱过程结束后;
      男:我想你和分手了,可以吗?(一次释放)
      女:好的,我知道了;(两次释放)
      女:我也想和你分手了。可以吗?(三次释放)
      男:好的,我知道了;(四次释放)   
      这就是整个过程,这里面试常问的问题就是为什么要三次握手,因为发送方最早建立连接的请求可能在网络中传输很久才到达接收方,也就是已经失效的连接请求传送到接收方,两次握手就形成连接的话,就会发生错误,如果两边实际都没有发送数据的需求,两边就会一直处于建立连接的状态,造成资源浪费;
      还有就是为什么要四次释放,因为某一方数据传输完成后,发送FIN=1的释放请求,另一方回复后,但是另一方不一定完成了数据的传输,一直等到另一方数据传输完成之后,再发送FIN=1的释放请求,并对这个请求回复后,才完成关闭连接的操作,
      这里介绍主动释放连接的一方有一个等待计时器(Time-Wait),持续的时间是2MSL(Maximum Segment Lifetime:报文最大生存时间),一般网络是2min,为了防止第四次释放的信息接收方并未受到,接收方会启动超时重传的机制,重新发送第三次释放的报文,在2MSL里面,可以保证接收方仍然能就收到此条报文,再次进行第四次释放的操作,同时,等待2MSL,可以确保当前连接的所有报文都过期。
      总结一下其中涉及到了几个计时器:
    1. 重传计时器:发送方发送数据后,等待接收方的回复,如果在2RTT(Round-Trip Time:往返时延)内未收到回复消息,就会启动超时重传机制,认定该条数据丢失,重新发送该条数据;
    2. 坚持计时器:是TCP协议在流量控制中,当滑动窗口设置为0时,启动坚持定时器,询问窗口是否开启;
    3. 时间等待计时器:确保第四次释放能顺利完成,等待2MSL时间;
    4. 保活计时器:具体介绍一下,每当服务器收到客户的信息,就将保活计时器复位,超时通常设置2小时,若服务器超过2小时还没有收到来自客户的信息,就发送探测报文段,若发送了10个探测报文段(没75秒发送一个)还没收到响应,则终止连接。比如某一方突然死机了,等到保活计时器到时间了,就会发送探测报文,来决定是否释放连接;

      下接计算机网络总结(二)

    参考:

    1. 慕课网精英讲师咚咚呛课件
    2. 百度百科
    3. 以及遇到不懂问题时,查阅的各路大神的博客
     

        

  • 相关阅读:
    第二周
    7月课程
    自定义线程池的创建
    jvm8内存模型和内存分配
    多线程中 CountDownLatch CyclicBarrier Semaphore的使用
    HashMap Hashtable TreeMap LinkedHashMap 分析
    HashSet LinkedHashSet TreeSet 分析
    ArrayList Vector LinkedList分析
    Java之流水号生成器实现
    mysql-mmm 部署高可用集群
  • 原文地址:https://www.cnblogs.com/maybe-fl/p/12691693.html
Copyright © 2011-2022 走看看