UESTC计算机网络期末复习
本文最后更新于:2 年前
计算机网络期末复习自己不知道或不牢固的知识点
第一章:概述
- 计算机网络:两台以上具有独立操作系统的计算机,通过某些介质链接成的相互共享软硬件资源的集合体。
- 两大功能:
- 连通性
- 共享
- 主机(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做客。
第三章:运输层
- 多路复用 / 多路分解:
- 如何工作:
- ip数据报中有源ip和目的ip地址
- UDP和TCP报文段中有源端口和目的端口地址。
- 无连接多路分解:
具有相同的目的ip地址和目的端口号的Ip数据报,指向相同的套接字。
- 面向连接的多路分解:
由于TCP中的信息更全,可以通过TCP中的信息去同时支持多个TCP套接字。(listen -> accept的这种形式,分解到不同的套接字)
- UDP不建立连接,不需要连接状态,没有拥塞控制。
- UDP 是面向报文的。发送方 UDP 对应用程序交下来的报文,在添加首部后就向下交付 IP 层。UDP 对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。
- UDP:
- 源端口
- 目的端口
- 长度
- 校验和
- 伪首部:和UDP连接在一起,为了计算校验和。
- Rdt1.0:完全可靠信道上的可靠传输:
- 简单的打包发送和接受拆包递交给上层
- Rdt2.0:具有bit错误的信道上的可靠传输:
- 引入了NAKs和ACKs
- 差错检测
- 接收方收到判断,错的发Nak , 对的发Ack
- 发送方发送完成之后等待接收方发送的结果,Nak就重发,Ack就发下一个了嗷!(停等协议)
- 致命缺陷:
- 接收方回复的Ack和Nak出错了,完全没办法处理嗷!!!
- 万能解决方法:重发!!!(重发之后又会出问题啊,同一个包你不可能给两次啊!!!)
- 解决方法:加个序号,接收方判断
- Rdt2.1:发送方处理混乱的Ack/Naks:
- 注意:
- 两个序号就可以满足了嗷!!!
- 必须检查是否收到了混淆的ACK / NAK
- 状态加倍,记住当前是0号还是1号
- 接收方检查是否收到重复的分组(序号)
- 接收方不知道上一个NAK / ACK是否被发送方收到
- 注意:
- Rdt2.2:不要NAK的协议:
- Rdt3.0:具有出错和丢失的信道:
- 倒计时定时器(触发之后重发),解决了丢包的解决措施。
- 也是停等,效率太低了!!!引入了流水线技术。
- GBN:累积确认!接收方如果接受到失序分组就会扔掉,反正发送方会重发的!!!如果收到失序分组,接收方会一直ACK上一个收到的序号:
- 发送方需要维护一个窗口,接收方不需要维护窗口嗷!!!!
- SR:
- 接收方可以缓冲报文,最后按序交给上层。发送者只重发没有收到确认的分组。
- 发送方和接收方都需要维护窗口嗷!(每个没有确认的报文都要有一个定时器嗷!!!)
- 窗口移动到下一个未被确认的序号交付给上层之后,就可以移动窗口往后到未交付的序号,不过在这之前的报文也要接受并回复Ack嗷!!!
- 窗口小于或等于序号空间大小的一半
- TCP:
- 累积ACK,ACK中表示的是期望从另外一边收到的下一个字节的序号。
- 失序的数据段如何处理是交给编程人员来实现的嗷!!!(可以丢弃,也可以SR)
- RTT估计:指数加权移动平均
- 超时时间间隔 = 估计的RTT + 安全余量(变化剧烈程度)
- TCP可靠数据传输:
- 流水线技术处理报文段
- 累积确认
- TCP使用单个重发定时器
- 触发重发:
- 累积确认
- 超时事件
- 重发场景:
- 丢失ACK
- 过早的超时设置
- 累积ACK的情况(ACK是索要的下一个序号的报文的序号,我发了多个ACK,肯定是从前往后的,离我最近缺啥我就要啥。所以假如我要了前面的又要了后面的,那么我前面的一定收到了呀!!!)
- 和上面的SN的一个本质区别,就是TCP的ACK表示“索要的意思”,SN中的ACK表示“收到”的意思。
- 三个额外的ACK启动快速重传(总共对于一个报文的四个ACK)
- TCP拥塞控制:
- 慢启动:CongWin = 1 MSS,以2的指数方式增加速率,达到ssthresh或者丢包事件发生。
- 加性增,乘性减
第四章:网络层
主要功能:
- 转发
- 路由
数据报 - 无连接 , 虚电路 - 链接
路由器在数据报网络中不需要维护端到端的连接状态,就没连接这个概念
最长前缀匹配
输入端口功能:
- 物理层:比特接收
- 数据链路层:解封装进行分析
- 分布式交换:完成输入端口处理,排队
交换结构:
- 内存
- 总线
- 纵横式
线头阻塞(Head-of-the-Line (HOL) blocking): 在队列前面的被阻塞的数据报会阻止队列中的其他数据报被转发。
头有多长?TCP/IP:
- TCP有20个字节,IP有20个字节,加起来40个字节。承载量为1500个字节,减去40个字节,有效报文长度最多1460
- 思考:如果是UDP呢?
IP分片:A , B , C类地址和特殊的IP地址段
子网划分:
CIDR:
- 无非类域间路由
- 层次寻址 - 路由聚合
- 这里有个问题,为啥分类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最低费用路径算法:
- 链路状态广播
- 迭代
上面这个自己做一遍嗷!!!
上面这个东西是用来合并同类项的嗷!!!
可能产生振荡
DV:
- 分布式算法,从邻居获得信息,无更多信息交换就停止嗷,自行停止。
- 多次重复从邻居接收更新距离向量
- 好消息迅速传播,坏消息传播很慢。
- 毒性逆转!!!
例题:
域内选路:
- AS(自治系统),一个AS中运行相同的路由协议。网关路由器,和去其他自治系统内的路由器直接相连的路由器。
- 域内路由选择:
- RIP:
- 距离向量算法
- 距离衡量:跳数
- 每30秒,响应报文在邻居间交换距离向量
- OSPF:
- 链路状态算法
- Router广播OSPF通告,通告里为每个邻居路由器设置一个表项。通告会散布到整个自治系统。(洪泛)
- 防止恶意入侵,允许多个相同开销的链路。
- RIP:
- 层次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间集中在策略上,策略可能比性能更加重要
- BGP:
SDN:
- 应用软件可以参与对于网络的控制管理,满足上层业务需求,自动化业务部署,简化网络运维。
- 应用方向:
- 数据中心
- 广域网
- 无线,安全等
- SDN就类似于网络操作系统
- 数据平面和控制平面分离
- 控制平面位于数据平面交换机的外部,可编程网络。
- 组件:
- 网络控制应用的接口层
- 负责维护网络状态一致视图的状态管理层
- 通信层
- OpenFlow 交换机基于流进行转发。同时,传统的控制层面从转发设备中剥离出来,“迁移”到集中控制器上
第五章:链路层
链路层概述:
- 节点
- 链路
- 数据帧
封装成帧,链路接入。(数据报增加了头部和尾部的信息),数据帧头部使用MAC地址来标识源目的MAC地址
链路层提供的服务:
- 流量控制
- 差错检查
- 错误纠正
- 半双工与全双工
链路层是在网卡上实现的(网络适配器)
差错检测和纠错技术:
差错检测并非100%可靠
三种技术:
奇偶校验:
- 使得数据中为1的个数为奇数/偶数,总共传输d+1位。
- 可以查出任意奇数个错误,但是不能发现偶数个错误。
二维奇偶校验:
- 可以检测并且纠正单个比特错误
- 可以检测出来但是不能纠正任意两个比特的错误。
- Internet校验和特点:
- 开销小
- 检测能力弱
- 适用于运输层
- 使用专用的软件实现
CRC(循环冗余检测):
- 多项式编码,确定生成多项式,最高位为1
- 例子:
- 能够检查小于r+1为的任何错误,任何奇数个错误。
广播链路的信道共享技术:
- 多路访问协议(多址访问协议)
三类类型:
信道划分协议:
- TDMA , FDMA , CDMA
随机访问协议:
ALOHA:
- 纯ALOHA:
- 时隙ALOHA:
轮流协议
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子层主要功能:
- 数据封装:
- 帧同步,帧定界
- 地址确定
- 错误检测机制
- 媒体访问管理:
- 媒体分配(避免冲突)
- 冲突解决(冲突处理)
- 数据封装:
帧结构:
数据字长为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:低于传输层的低级协议或物理网络提供的套接字类型,可以访问内部网络接口。
地址转换函数(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)
核心函数:
- 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)与多接口:
- int listen(int sockfd , int backlog);
- 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
6int 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
9struct 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
20int 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则在数据复制完成的时候才发送信号通知注册的信号处理函数。
- 行李自己下来搬和行李直接送到你家门口的区别嗷!!!
- 异步
- 同步: