UESTC计算机网络期末复习

本文最后更新于:1 年前

计算机网络期末复习自己不知道或不牢固的知识点

第一章:概述

  • 计算机网络:两台以上具有独立操作系统的计算机,通过某些介质链接成的相互共享软硬件资源的集合体。
  • 两大功能:
    • 连通性
    • 共享
  • 主机(host)=端系统(end system)
  • 实体: 定义自身功能的硬/软件的集合
  • 对等实体: 两台计算机上同一层所属的程序,进程或实体称为该层的对等程序、对等进程或对等实体。

第二章:应用层

  • 研发网络应用程序的核心:写出能够运行在不同端系统并且通过网络彼此通信的程序。

  • 套接字:应用程序编程接口API

  • 应用需要的服务:

    • 可靠数据传输
    • 带宽和吞吐量
    • 定时
    • 安全
  • 安全TCP:SSL库调用TCP服务接口,SSL提供安全套接字API,处于应用层

  • 应用层协议:

    • HTTP
    • POP3
    • SMTP
    • IMAP
    • SSL
    • FTP
    • DNS
  • HTTP是无状态协议 -> Cookie

  • 条件get方法 - Web缓存使用

  • why使用Web缓存:

    • 减少响应时间
    • 减少内部网络和接入链路上的通信量
    • 整体上大大降低因特网上的Web流量
  • 电子邮件的三个部分:

    • 用户代理
    • 邮件服务器
    • SMTP和POP
  • HTTP和SMTP的比较:

    • HTTP:拉协议,SMTP:推协议
    • HTTP将每个对象都封装在各自的HTTP响应消息中发送,SMTP将各个对象放在同一个邮件消息的多目部分发送。
    • 都有ASCII命令/应答交互,状态码
  • POP3无状态 , 保持和删除两种选择。IMAP有状态

  • DNS提供的功能:

    • 主机名到IP的转换
    • 主机别名
    • 邮件服务器别名
    • 负载分配
  • DNS攻击:

    • DDoS攻击
    • 重定向攻击:中间人攻击,DNS中毒攻击
    • 本机Host文件被篡改,DNS劫持,DNS污染
  • CDN的提供服务的方法:

    • 深入:将CDN部署在众多的接入网络中,靠近用户。
    • 邀请做客:接入网关键位置(IXP),建造大集群,邀请ISP做客。

第三章:运输层

  • 多路复用 / 多路分解:

image-20210625142908359

  • 如何工作:
    • ip数据报中有源ip和目的ip地址
    • UDP和TCP报文段中有源端口和目的端口地址。
  • 无连接多路分解:

image-20210625143632377

具有相同的目的ip地址和目的端口号的Ip数据报,指向相同的套接字。

  • 面向连接的多路分解:

image-20210625143743437

由于TCP中的信息更全,可以通过TCP中的信息去同时支持多个TCP套接字。(listen -> accept的这种形式,分解到不同的套接字)

  • UDP不建立连接,不需要连接状态,没有拥塞控制。
  • UDP 是面向报文的。发送方 UDP 对应用程序交下来的报文,在添加首部后就向下交付 IP 层。UDP 对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。
  • UDP:
    • 源端口
    • 目的端口
    • 长度
    • 校验和
  • 伪首部:和UDP连接在一起,为了计算校验和。
  • Rdt1.0:完全可靠信道上的可靠传输:
    • 简单的打包发送和接受拆包递交给上层
  • Rdt2.0:具有bit错误的信道上的可靠传输:
    • 引入了NAKs和ACKs
    • 差错检测
    • image-20210625145039251
    • 接收方收到判断,错的发Nak , 对的发Ack
    • 发送方发送完成之后等待接收方发送的结果,Nak就重发,Ack就发下一个了嗷!(停等协议)
    • 致命缺陷:
      • 接收方回复的Ack和Nak出错了,完全没办法处理嗷!!!
      • 万能解决方法:重发!!!(重发之后又会出问题啊,同一个包你不可能给两次啊!!!)
      • 解决方法:加个序号,接收方判断
  • Rdt2.1:发送方处理混乱的Ack/Naks:
    • image-20210625145752447
    • image-20210625145910922
    • 注意:
      • 两个序号就可以满足了嗷!!!
      • 必须检查是否收到了混淆的ACK / NAK
      • 状态加倍,记住当前是0号还是1号
      • 接收方检查是否收到重复的分组(序号)
      • 接收方不知道上一个NAK / ACK是否被发送方收到
  • Rdt2.2:不要NAK的协议:
    • image-20210625150357750
  • Rdt3.0:具有出错和丢失的信道:
    • 倒计时定时器(触发之后重发),解决了丢包的解决措施。
    • image-20210625150827340
    • 也是停等,效率太低了!!!引入了流水线技术。
  • GBN:累积确认!接收方如果接受到失序分组就会扔掉,反正发送方会重发的!!!如果收到失序分组,接收方会一直ACK上一个收到的序号:
    • 发送方需要维护一个窗口,接收方不需要维护窗口嗷!!!!

image-20210625151745307

  • SR:
    • 接收方可以缓冲报文,最后按序交给上层。发送者只重发没有收到确认的分组。
    • 发送方和接收方都需要维护窗口嗷!(每个没有确认的报文都要有一个定时器嗷!!!)
    • image-20210625152117933
    • 窗口移动到下一个未被确认的序号交付给上层之后,就可以移动窗口往后到未交付的序号,不过在这之前的报文也要接受并回复Ack嗷!!!
    • image-20210625152354556
    • 窗口小于或等于序号空间大小的一半
  • TCP:
    • image-20210625153433913
    • image-20210625153447138
    • 累积ACK,ACK中表示的是期望从另外一边收到的下一个字节的序号。
    • 失序的数据段如何处理是交给编程人员来实现的嗷!!!(可以丢弃,也可以SR)
    • RTT估计:指数加权移动平均
    • image-20210625154202878
    • image-20210625154310033
    • 超时时间间隔 = 估计的RTT + 安全余量(变化剧烈程度)
    • image-20210625154449910
    • TCP可靠数据传输:
      • 流水线技术处理报文段
      • 累积确认
      • TCP使用单个重发定时器
      • 触发重发:
        • 累积确认
        • 超时事件
    • 重发场景:
      • 丢失ACK
      • 过早的超时设置
      • 累积ACK的情况(ACK是索要的下一个序号的报文的序号,我发了多个ACK,肯定是从前往后的,离我最近缺啥我就要啥。所以假如我要了前面的又要了后面的,那么我前面的一定收到了呀!!!)
    • 和上面的SN的一个本质区别,就是TCP的ACK表示“索要的意思”,SN中的ACK表示“收到”的意思。
    • 三个额外的ACK启动快速重传(总共对于一个报文的四个ACK)
  • TCP拥塞控制:
    • 慢启动:CongWin = 1 MSS,以2的指数方式增加速率,达到ssthresh或者丢包事件发生。
    • image-20210625204139372
    • 加性增,乘性减
    • image-20210625205048837

第四章:网络层

  • 主要功能:

    • 转发
    • 路由
  • 数据报 - 无连接 , 虚电路 - 链接

  • 路由器在数据报网络中不需要维护端到端的连接状态,就没连接这个概念

  • 最长前缀匹配

  • 输入端口功能:

    • 物理层:比特接收
    • 数据链路层:解封装进行分析
    • 分布式交换:完成输入端口处理,排队
  • 交换结构:

    • 内存
    • 总线
    • 纵横式
  • 线头阻塞(Head-of-the-Line (HOL) blocking): 在队列前面的被阻塞的数据报会阻止队列中的其他数据报被转发。

  • 头有多长?TCP/IP:

    • TCP有20个字节,IP有20个字节,加起来40个字节。承载量为1500个字节,减去40个字节,有效报文长度最多1460
    • image-20210626114246735
    • image-20210626114534598
    • 思考:如果是UDP呢?

    image-20210626114401923

  • IP分片:A , B , C类地址和特殊的IP地址段

  • 子网划分:

    • image-20210626132401406
  • CIDR:

    • 无非类域间路由
    • 层次寻址 - 路由聚合
    • image-20210626132940678
    • image-20210626132952269
    • 这里有个问题,为啥分类ip不行呢???
  • DHCP:

    • 应用层协议
    • 被动打开UDP端口67,等待报文
    • 客户从68发送DHCP发送报文
    • 更新租用期时间:0.5T和0.875T,租期过了一半,就要请求报文DHCPREQUEST来更新租用期。DHCP不同意的话,必须重新申请嗷!!!
    • DHCP还可以分配:
      • 网关地址
      • IP地址或域名
      • 子网掩码(相当于把子网信息都告诉主机了)
  • NAT:

    • 增加了安全性嗷!
    • 替换每个外出分组的源IP和端口号为NAT的IP地址和新端口号,NAT转换表中要进行记录
  • ICMP(Internet Control Message Protocol):

    • 用于差错报告,请求/应答
    • ICMP同属于网络层
    • 位于IP之上,ICMP消息是装载在IP分组里的
  • IPv6:

    • IPv6的首部40个字节,不允许分片嗷!!!IPv6地址128个比特,还是按照8个,8个来划分的,共16个(8个比特)。按16个来划分,就8个(8421,然后一组四个十六进制数)
    • 零压缩表示法
    • 不同:没有校验和,选项允许但是不是首部的一部分,增加消息提示。
    • 过渡:双栈 , 隧道
  • 路由和选路:

    • 路由决定了端到端的路径

    • 算法分类:

      • 全局路由算法(LS 链路状态路由算法)
      • 分布式路由算法(DV 距离向量路由算法)
    • LS:

      • Dijkstra最低费用路径算法:

        • 链路状态广播
        • 迭代
      • image-20210626135822196

      • image-20210626135842449

      • image-20210626140329055

      • 上面这个自己做一遍嗷!!!

      • image-20210626140500692

      • 上面这个东西是用来合并同类项的嗷!!!

      • 可能产生振荡

    • DV:

      • 分布式算法,从邻居获得信息,无更多信息交换就停止嗷,自行停止。
      • image-20210626140757532
      • image-20210626140824642
      • 多次重复从邻居接收更新距离向量
      • 好消息迅速传播,坏消息传播很慢。

      image-20210626141118447

      • 毒性逆转!!!
    • 例题:

    image-20210626141529943

    image-20210626141543224

    image-20210626141551803

    image-20210626141602547

  • 域内选路:

    • AS(自治系统),一个AS中运行相同的路由协议。网关路由器,和去其他自治系统内的路由器直接相连的路由器。
    • 域内路由选择:
      • RIP:
        • 距离向量算法
        • 距离衡量:跳数
        • 每30秒,响应报文在邻居间交换距离向量
      • OSPF:
        • 链路状态算法
        • Router广播OSPF通告,通告里为每个邻居路由器设置一个表项。通告会散布到整个自治系统。(洪泛)
        • 防止恶意入侵,允许多个相同开销的链路。
    • 层次OSPF:
      • 本地区域,主干区域。只在区域内发送链路状态通告。
      • 每个节点有详细的区域拓扑。
      • 主干路由器:限于主干区域内运行OSPF路由协议。
  • 域间选路(BGP):

    • BGP:
      • 为每个AS提供了一种手段
      • 相邻AS获取子网可达信息
      • 允许子网通告它的存在
      • 获取子网可达信息,并且在所有路由器传播这些可达性信息。
    • 热土豆选路:
      • 自私的
      • 送到最近的一个路由器中
    • BGP补充:
      • 通告前缀的时候,包含了BGP属性
      • 前缀 + 属性 = 路由
      • 两个重要属性:
        • AS-PATH:包含了的前缀的通告已经通告过的那些AS
        • NEXT-HP:指出到达下一个AS的具体AS间边界路由器。
      • 选择方式:
        • 本地偏好值
        • 最短AS-PATH的路由
        • NEXT-HOP热土豆路由
        • 其他标准
      • 报文交换使用TCP
      • BGP的特点是BGP是一种AS的外部路由协议,主要负责本自治区域和其他自治区域的可达信息交换。
      • 性能:
        • AS内集中在性能上
        • AS间集中在策略上,策略可能比性能更加重要
  • SDN:

    • 应用软件可以参与对于网络的控制管理,满足上层业务需求,自动化业务部署,简化网络运维。
    • 应用方向:
      • 数据中心
      • 广域网
      • 无线,安全等
    • SDN就类似于网络操作系统
    • 数据平面和控制平面分离
    • 控制平面位于数据平面交换机的外部,可编程网络。
    • 组件:
      • 网络控制应用的接口层
      • 负责维护网络状态一致视图的状态管理层
      • 通信层
    • OpenFlow 交换机基于流进行转发。同时,传统的控制层面从转发设备中剥离出来,“迁移”到集中控制器上

第五章:链路层

  • 链路层概述:

    • 节点
    • 链路
    • 数据帧
  • 封装成帧,链路接入。(数据报增加了头部和尾部的信息),数据帧头部使用MAC地址来标识源目的MAC地址

  • 链路层提供的服务:

    • 流量控制
    • 差错检查
    • 错误纠正
    • 半双工与全双工
  • 链路层是在网卡上实现的(网络适配器)

  • 差错检测和纠错技术:

    • 差错检测并非100%可靠

    • 三种技术:

      • 奇偶校验:

        • 使得数据中为1的个数为奇数/偶数,总共传输d+1位。
        • 可以查出任意奇数个错误,但是不能发现偶数个错误。
      • 二维奇偶校验:

        • 可以检测并且纠正单个比特错误
        • 可以检测出来但是不能纠正任意两个比特的错误。
        • Internet校验和特点:
          • 开销小
          • 检测能力弱
          • 适用于运输层
          • 使用专用的软件实现
      • CRC(循环冗余检测):

        • 多项式编码,确定生成多项式,最高位为1
        • 例子:

        image-20210626213520338

        image-20210626213537148

        image-20210626213601061

        • 能够检查小于r+1为的任何错误,任何奇数个错误。
  • 广播链路的信道共享技术:

    • 多路访问协议(多址访问协议)
  • 三类类型:

    • 信道划分协议:

      • TDMA , FDMA , CDMA
    • 随机访问协议:

      • ALOHA:

        • 纯ALOHA:

        image-20210626215101115

        image-20210626215110901

        • 时隙ALOHA:
          image-20210626215303806
    • 轮流协议

  • CSMA:

    • 发前监听
  • CSMA/CD:

    • 载波监听 + 冲突检测
  • 二进制指数回退:

    • {0,1,2,….${2^{n-1}}$}中随机选择一个k值,并且和10取较小的值,以此来回退!!!
  • 轮流协议:

    • 轮询协议
    • 令牌传递协议
  • LAN:

    • 拓扑结构:
      • 星型结构
      • 总线结构
      • 环型结构
      • 树型结构
      • 网状结构
  • 局域网体系结构:

    • 逻辑链路控制子层
    • 介质访问控制子层
    • 物理层
  • 链路层寻址和ARP

    • 网络层地址:IP地址
    • 链路层地址:MAC地址
  • MAC长度为6个字节(48个比特),是永久的。

  • 局域网地址:

    • IEEE负责前三个字节,后面三个字节厂家分配。
    • 平面结构:MAC地址(不变),层次结构:IP地址(会改变)
  • 节点标识方式:

    • 应用层的主机名(域名)
    • 网络层的IP地址
    • 链路层的MAC地址
  • 地址转换:

    • 主机名 -> IP地址 -> MAC地址
    • DNS:主机名 -> IP
    • ARP地址解析协议:IP -> MAC
  • ARP只为在同一个LAN上的节点解析IP地址,不同的LAN都有ARP!!!

  • ARP表:<IP address ; MAC address ; TTL>

  • ARP已经比较熟练了,这里不写了,去看慕课上的题目,慕课上的那个题目我觉得出的很不错嗷!!!

  • MAC子层主要功能:

    • 数据封装:
      • 帧同步,帧定界
      • 地址确定
      • 错误检测机制
    • 媒体访问管理:
      • 媒体分配(避免冲突)
      • 冲突解决(冲突处理)
  • 帧结构:

image-20210628151700217

  • 数据字长为46到1500字节

  • 链路层交换机:

    • 即插即用和自学习,交换机不需要手工配置。
    • 支持多节点同时传输。
  • 交换机的交换方式:

    • 存储转发(差错检测,转发时延较大)
    • 快速分组(又称直通交换,没有差错检测,转发时延较小)
  • 三层交换机:

    • 二层交换机 + 路由器
    • 一次路由,多次交换
  • 路由器 vs 交换机:

    • 路由器:网络层设备
    • 交换机:链路层设备
    • 两者都有转发表嗷!!!
    • 路由器:路由学习算法计算转发表,ip地址转发
    • 交换机:洪泛,自学习来学习转发表,MAC地址转发
  • VLAN

第六章:套接字编程

  • 字节:运输和存储信息的最小单位。各种数据类型都是由字节构成的。

  • 主机字节序:不同类型的及其处理数据的时候,会按照特定的字节排序顺序读取存储器。

  • 字节序:

    • 大端:高位数据放在低地址,低位数据放在高地址
    • 小端:高位数据放在高地址,低位数据放在低地址
    • 小端唯唯诺诺,大端重拳出击!!!
  • 字节序变换函数:

    • htons
    • ntohs
    • htonl
    • ntohl
  • 对齐:结构体的总大小为结构体最宽基本类型成员大小的整数倍,编译器会填充字节。

  • POSIX:Portable Operating System Interface of UNIX

  • 系统调用:操作系统内核提供的一系列具备预定功能的多内核函数。

  • TCP/IP:

    • 需要指明端口号和IP地址
    • 协议族:PF_INET
    • 地址组:AF_INET
  • 套接字类型:

    • SOCKET_DGRAM:UDP,双向不可靠数据报文
    • SOCKET_STREAM:TCP,双向可靠数据流
    • SOCKET_RAW:低于传输层的低级协议或物理网络提供的套接字类型,可以访问内部网络接口。
  • image-20210628154646931

  • 地址转换函数(IPv4):

    • inet_aton(const char *cp , struct in_addr *inp)
    • char *inet_ntoa(struct in_addr in)
  • IPv4和IPv6都能处理:

    • int inet_pton(int family , const char *src , void *dst)
    • const char *inet_ntop(int family , const void *src , char *dst , size_t cnt)
  • image-20210628155334931

  • 核心函数:

    • int socket(int family , int type , int protocol);
    • int bind(int sockfd , const struct sockaddr *myaddr , socklen_t addrlen);
      • Client必须直到Server的地址,因此Server要显示bind(这个bind是人为确认)
      • 客户端可以不bind , 系统会自动bind(这个bind由系统进行,不必明确嗷!!!)
    • INADDR_ANY(0)与多接口:
      • image-20210628155813097
    • int listen(int sockfd , int backlog);
      • image-20210628160257025
      • backlog控制以完成连接的队列长度
    • int accept(int sockfd , (struct sockaddr *)&client_addr , socklen_t *addrlen);
    • int connect(int sockfd , const struct sockaddr servaddr , socklen_t addrlen);
    • 注意上面的accept和connect哈,那个addrlen,一个是指针,一个是数字。
    • int send(int sockfd , const void * data , int data_len , unsigned int flags);(TCP发送数据)
    • int sendto(int sockfd , const void * data , int data_len , unsigned int flags , struct sockaddr *remaddr , int remaddr_len);(UDP发送数据)
    • int recv(int sockfd , void *buf , int buf_len , unsigned int flags);(TCP接收数据)
    • int sendto(int sockfd , void *buf , int buf_len , unsigned int flags , struct sockaddr *from , int fromlen);(UDP接收数据)
    • int close(int sockfd);
  • 特别注意:connect失效后,不能再次调用connect进行连接,必须close() , socket() , connect()重连。

  • 代码模块儿:

    • 服务端:

      • socket套接字创建:
      1
      2
      3
      4
      5
      6
      int listenfd , connfd;
      socklen_t clilen;
      struct sockaddr_in cliaddr;
      struct sockaddr_in servaddr;

      listenfd = Socket(AF_INET,SOCK_STREAM,0);
      • bind模块儿:
      1
      2
      3
      4
      5
      6
      7
      8
      9
      struct sockaddr_in addr;

      addr.sin_family = AF_INET;
      addr.sin_addr.s_addr = htonl(INADDR_ANY);
      addr.sin_port = htons(port);

      if(bind(fd,(struct sockaddr *)&addr,sizeof(addr)) == -1){
      /*错误处理*/
      };
      • 整体代码:
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      int listenfd , connfd;
      socklen_t clilen ;
      struct sockeraddr_in cliaddr,servaddr;
      int port = 1234;

      listenfd = socket(AF_INET,SOCK_STREAM,0);

      bzero(&servaddr,sizeof(servaddr));
      servaddr.sin_family = AF_INET;
      servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
      servaddr.sin_port = htons(port);

      //如果这里是要求输入的话
      //servaddr.sin_port = htons(atoi(port));

      bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr));

      listen(listenfd,BACKLOG);

      connfd = accept(listenfd,(struct sockaddr *)&cliaddr,&clilen);
    • I/O模型以及复用设计:

    • I/O模型:

      • 同步:
        • 阻塞
          • 例如recvfrom(),有数据到来才会返回
        • 非阻塞:
          • 让出CPU
        • 多路复用:
          • 避免PCU空转,使用poll / epoll代理,同时观察许多流的I/O时间。空闲阻塞,当有I/O时间,就从阻塞态中醒来。
        • 信号驱动:
          • 注册信号,当有信号到来的时候调用信号回调函数处理
      • 异步:
        • 异步
          • 异步IO则在数据复制完成的时候才发送信号通知注册的信号处理函数。
        • 行李自己下来搬和行李直接送到你家门口的区别嗷!!!

UESTC计算机网络期末复习
https://alexanderliu-creator.github.io/2021/06/25/ji-suan-ji-wang-luo-qi-mo-fu-xi/
作者
Alexander Liu
发布于
2021年6月25日
许可协议