计算机网络
# 1. 网络协议概述
计算机网络: 将位置不同
具有独立功能
的计算机及其外部设备通过通信线路连接
起来的系统
网络协议的本质: 一组通过事先约定,共同遵守的规则集合
,用于在计算机网络中实现数据交换,资源共享
网络协议组成三要素:语法、语义、同步
- 语法: 说明传输信息的组成结构,格式、编码等,用于说明
怎么做
- 语义: 说明通信双方需要发出的是什么,完成的动作是什么,做出的应答是什么,用于说明
做什么
- 同步: 说明通信双方完成动作的先后顺序、速度匹配、排序等,用于说明
动作时序
# 1.1 网络协议分层
网络分层中的常见概念:
- 实体: 网络分层中每一层中的活动元素,可以是,硬件、软件、进程,一般第几层元素称为第n层实体
- 协议: 通信双方实现相同功能相应层之间的通信规则集合,作用在同一层
- 接口: 同一系统两个相邻层次间的通信规则集合
- 服务: 每层实体
提供的服务(功能)
,作用在上下两层,通过下层收集数据,为上层提供服务 - 数据单元: 数据传输的单位,常见
(协议数据单元、服务数据单元、接口数据单元)
OSI模型: 七层
理论标准
- 物理层: 规定传输设备
机械、电气、功能
特性,常见光纤、双绞线、同轴电缆,单位:bit
- 数据链路层: 建立逻辑数据链路,通过
差错控制
实现在不可靠物理介质上提供可靠
数据链路传输,功能,物理地址寻址、数据成帧,流量控制,数据检错、重发
,单位:帧
,协议:SDLC,HDLC,PPP,STP、帧中继 - 网络层: 选择合适网间路由和节点,确保数据及时传送到目标节点,将数据链路层的数据帧封装成
数据分组
,分组中包含有网络层的分组首部,其中包含逻辑地址信息,源IP和目的IP
,其还能实现拥塞控制,网际互联,单位:数据分组(数据包)
,协议:IP、ARP、RARP、ICMP、RIP、OSPF等 - 传输层:承上启下,获取下层全部信息并为上层提供透明可靠的数据传输服务,会跟踪数据单元分片数据、乱序到达的数据包以及传输过程中可能出现的风险,保证数据的完整可靠,
单位:数据段(tcp)/数据报(udp)
,协议:TCP、UDP - 会话层: 不参与数据传输,提供访问验证、会话管理、维护进程通信,
此层开始统称报文
,无具体协议 - 表示层: 解决用户信息的语法表示、加解密、解压缩等问题,提供格式化的表示和数据转换,无具体协议
- 应用层: 最高层,直接服务用户,为用户进程访问OSI环境提供手段和服务,应用层以下各层通过该层间接的向应用进程提供服务,因此应用层向应用进程提供的服务是所有层的总和,协议:HTTP、DNS、TELNET、FTP、SMTP、SNMP等
TCP/IP模型: 四层
事实标准
- 网络接口层: 定义了一称为网络接口层的接口,实际是整合了OSI的物理层、数据链路层,与OSI这2层一致
- 网络层: 对应OSI网络层,功能一致
- 传输层: 对应OSI传输层,功能一致
- 应用层: 对应OSI的应用层,功能一致,相当于将OSI后三层整合在一起了
# 2. 物理层
物理层: OSI模型最底层
,向下直接与物理介质相连
,向上为数据链路层
提供透明的原始比特流
物理传输连接
解决问题: 解决网络节点
与物理信道
如何连接
,规定标准接口的机械
连接,电气
信号,信号
功能、交换
电路特性
目的: 制定统一开放的标准,便于不同制造厂商使用,使各家厂商生产的设备相互兼容
常用典型协议: EIA-232也称为RS232-C, CCITT V.24
- RS232-C: 用于较近距离,如串口通信,利用电话网络传输,使用调制解调器model,将数字信号转换成模拟信号,接收时将模拟信号转化为数字信号
- CCITT V.24: 传输距离更远,类似RS-422的平衡接口
# 3. 数据链路层
数据链路层: 处于OSI模型第2层
,主要目的是解决物理层
传输的不可靠问题
,在物理层上提供一条逻辑
上可靠的数据链路,将数据可靠的传送到相邻结点,其定义了链路上节点交换的数据单元格式
,结点收发数据的动作
数据链路层功能:
- 数据成帧: 标识帧的开始结束,主要有三种方法,
字符计数、首位界符、首尾标志
- 流量控制: 对发送方发送数据的
速度
加以控制,防止超过接收方能力导致数据丢失(ARQ协议)
- 差错控制: 接收方对接收到的数据帧进行
校验
,如果出错则可以进行处理、常见冗余码,检错码,纠错码
- 数据链路管理: 负责管理连接的
建立、维持、释放
- 寻址
向网络层提供的服务类型:
- 无确认连接服务: 适用于
低误码环境
,大多数局域网
的数据链路层使用该方式 - 有确认的无连接服务: 适用于
可靠性不高
的通信信道,在无确认连接上增加确认
功能 - 面向连接服务: 适用于
实时传输
可靠性要求较高
环境,传输前先建立连接,数据帧在链路中依次按序传输。主要指令:请求、指示、响应、确认
# 3.1 差错控制
主要分为两类方法: 检错码、纠错码
- 自动重传请求ARQ:
检错码
只能发现差错,是一种后向纠错方法
接收端接收到的数据帧出错时,通知发送端重传该数据帧,直到收到正确的数据帧为止
- 前向纠错FEC:
纠错码
,不仅能发现差错还能自动纠错,是一种前向纠错方法
接收端不仅能发现接收的数据帧中的差错,还能确定二进制代码中发生错误的位置,从而进行纠正
虽然纠错码可发现错误并纠错,但冗余较大编码效率低,为节省带宽和网络资源,差错控制
主要使用检错码
# 3.1.1 检错码
检错码的核心思想是利用冗余编码技术:目前所有的差错检错编码都是采用冗余编码技术,具体方法很多,其差别就是冗余度的不同,能检错的位数不同,核心思想相同,都是在有效数据发送之前,按某种关系附加上一定的冗余位(位数与数据相关,数据不同冗余位不同)
,构成一个符合某规则的码后在发送,接收端收到带有冗余位的码之后,用同样的方法判断它是否任然符合原规则,若不符合则认为传输过程中出现了差错
常用检错码: 奇偶校验码、循环冗余校验码(CRC)
奇偶校验码: 通过增加冗余位,使得码字中
1的个数
恒为奇数或偶数
的编码方法实际运用中又分以下几种方式
垂直奇偶校验(纵向编码):
只能检出数据中奇数位错误检不出偶数位错误,奇偶出现概率一样,检错率约为2/1,优点简单,可边发生边生产,效率高水平奇偶校验(横向编码):
不仅可以检出奇数位错误,还可以检出所有突发长度小于信息块定长p的错误(信息块长度不足的错误)
,检出率更高,但是不能边发生边生成冗余,必须等到需要发送的信息块到齐后才能计算冗余位,实现更复杂水平垂直奇偶校验:
同时进行垂直和水平校验,可检出3位或以下的错误,检出率高,仅存1位错误时,能确定错误码在某行某列的交叉处,从而进行纠错
循环冗余校验码(CRC): 对随机错误、突发错误都可以
较低冗余度
进行严格检查,在发送端产生校验码并附加到信息位后面随数据一起发送,接收方接收数据后使用相同方法计算出数据的校验码
,使用计算出的校验码与接收到的校验码进行比对就可知道是否传输错误,目前该方法应用广泛
# 3.1.2 纠错码
纠错码核心思想: 在每个待发送数据块上附加足够的冗余信息
,如果出错,接收方能够推导出
发送方实际送出的因该是什么样的比特串
常见纠错码: 海明码(可以纠正一位差错的编码,利用了奇偶校验原理)
# 3.2 成帧机制
常见成帧机制:字符计数法、首尾界符法、首尾标志法
- 字符计数: 在帧头部使用一个字段
标明帧内字符数
,接收端根据该字符数切割帧,缺点:
一但出错将无法同步,基本不使用 - 首尾界符: 每一帧以
特定字符序列串
开头和结尾控制字段,避免了出错后同步问题,缺点依赖于字符集不通用扩展性差 - 首尾标志: 以
特定位模式
标志帧的开始和结束,利用自动填充技术,当前使用广泛
# 3.3 流量及差错控制
为解决在有差错的物理信道传输数据,以及避免接收方被发送方淹没数据溢出
,在数据链路层出现了3种常用的流量及差错控制方法
前提:
- 独立的
发送方
向 独立的接收方
发送消息,接收方能够向发送方发送确认帧
- 信息帧和确认帧都包含
检错码
,发生了错误的信息帧和确认帧将被丢弃
# 3.3.1 数据传输可能出现的情况
- 正常情况: 数据正常发送和确认
- 数据帧出错: 数据正常发送,接收方校验数据发现数据错误,发送不ok确认,发送方重传数据,重复直到发送确认ok为止
(达到事先约定的次数还收不到确认ok,则不在重传,将情况上报给上层)
- 数据帧丢失: 数据发送后未能正确到达接收方,发送方永远收不到接收方的确认ack,只能超时后重传(
计时器,每个发送都会启动一个计时,超时后进行重发数据)
,重传若干次任然不能收到则报告差错 - 确认帧丢失: 数据成功发送,但是接收方发送的确认帧丢失,发送方在超时后重传数据
(使用序号标识,接收方可以判断是新数据还是重传数据,序号重复说明为重传数据,此时接收方会丢弃数据并返回确认报文)
# 3.3.2 流量及差错控制方法
- 停止等待ARQ协议: 每发送一数据帧就暂停等待应答
(通过有效的检错重传机制)
,优点简单,缺点信道利用率低 - 后退N帧ARQ协议:使用滑动窗口技术,发送方发送完一数据帧后不必停下来等待应答,可连续发送若干帧,若在发送中收到接收方的
肯定应答
则继续发送,若收到对方其中某一帧的否定应答
,则重发否认帧开始时其后的所有后续帧,即后退N帧,优点连续发送提高了效率,但重传后面的帧又降低了效率,因此只适用于低误码率环境
- 选择重传ARQ协议:使用滑动窗口技术,在后退N帧ARQ协议之上,接收方添加
接收缓冲区
,当某数据帧出现错误时,发送对该帧的否认帧,而对其后到来的正确帧正常接收不丢弃,因不能立即上交给高层,所以放在缓冲区,等待发送方重传出错的那一帧,一但收到后就将已存在缓存区的后续正确帧一起按正确的顺序递交给高层,且只对最高序号的帧进行确认,优点提高了效率
,缺点接收方实现复杂,要开辟足够的缓冲区暂存未按顺序正确接收到的帧
# 3.3.3 滑动窗口
允许发送方连续发送N帧,让发送的数据帧在信道上按前后次
序排列,并同步向前推进,犹如一条流水的管道,故又称管道技术。允许连续发送或接收的数据帧的范围
称为滑动窗口,N
称为滑动窗口的大小。
从滑动窗口看待上面三种控制方法如下
- 停止等待ARQ协议:发送窗口=1,接收窗口=1
- 后退N帧ARQ协议:发送窗口>1,接收窗口=1
- 选择重传ARQ协议:发送窗口>1,接收窗口>1
滑动窗口重要特性:
- 只在接收窗口向前滑动时
(同时也发送了确认)
,发送窗口才有可能向前滑动,收发两方按该规律不断地向前滑动 - 当发送窗口和接收窗口的大小都等于1时,就是停止等待ARQ协议
- 发送窗口的最大值,当用n个比特进行编号时,则只有在发送窗口的大小Wt <= 2^n - 1时,后退N帧ARQ协议才能正确运行
# 4. 网络层
通信子网最高层,提供合理路由机制,将数据传输到目的主机,对高层屏蔽低层传输细节,实现不同网络互联
IP协议: TCP/IP协议中最核心协议,提供无连接
的IP数据报投递服务
特点:
提供无连接的数据传递机制:
传输前不建立连接,从源到目的地多个数据包可能经过不同传输路径不保证数据传输的可靠性:
数据报在传输过程中可能会出现丢失或其它问题,IP不会纠正转由传输层解决尽最大努力投递:
不轻易丢弃数据报,只在资源耗尽或出现故障时才丢弃
# 4.1 IP地址
标识网络中的网络和主机,实现底层地址统一,屏蔽不同物理网络差异,使IP地址具有全局唯一性和一致性
IPV4: 由32位二进制组成,地址空间2^32个,由网络号与主机号组成,表示二进制、点分十进制、十六进制
IP地址分类: 为了表示方便,常分为5类,A/B/C/D/E ,其中A/B/C常用(IPV4)
- A类:地址范围
1.0.0.0-127.255.255.255
,可接入主机数量2^24-2,适用于大型网络 - B类:地址范围
128.0.0.0-191.255.255.255
,可接入主机数量2^16-2,适用于中型网络 - C类:地址范围
192.0.0.0-223.255.255.255
,可接入主机数量2^8-2,适用于小型网络 - D类:地址范围
224.0.0.0-239.255.255.255
,组播地址 - E类:地址范围
240.0.0.0-255.255.255.255
,保留地址用于实验
特殊IP地址IPV4
网络地址:
用于标识主机所属网络,表示时:网络号不变,主机号全为0直接广播地址:
用于在某个网络中向该网络所有主机发送数据,表示时:网络号不变,主机号全为1有限广播地址:
255.255.255.255,用于在本地网络广播又不知所处网络网络地址时,只能作为目的地址主机本身地址:
0.0.0.0,用于标识主机本身,只能作为源地址回送地址:
127.0.0.1,用于测试,作为目的地址时数据不会发出,在离开网络层时将其送回本机有关进程
# 4.2 IP数据包
数据包: 由数据首部(控制信息)
+ 数据组成
- 数据首部:长度变长最短20最长60字节,通过
标识、标志、片偏移
进行数据报分片与重组控制,字段如下- 协议版本
- 首部长度
(控制信息)
- 区分服务
(服务类型),优先级等
- 总长度
(占16位,首部+数据一起的长度)
、最大长度为2^16-1=65535字节
,但数据链路层最大传递单元MTU=1500,所以总长度不应超过1500字节
- 标识
(区分数据报,标识分片是否为同一数据报) 16位
、 - 标志
(标识是否允许分片,是否为最后分片)
,3位、 - 片偏移
(分片后每片的偏移量,方便重组,第一个分片偏移量为0)
- 寿命TTL
(生存时间,占8位,以秒为单位,超过则丢弃,每经过一路由器减一,为0丢弃,HOP衡量法)
- 协议
(占8位,高层协议编号,标识数据报属于那个高层协议,udp/tcp/ospf/icmp等)
目的地收到后根据它判读交由那个协议处理 - 首部校验和
(占16位,位数不够补0,只校验IP首部,数据交由高层校验,计算方法为二进制反码求和)
- 源ip地址和目标ip地址
(各占32位)
- 其它字段
(ip选项(可选,长度可变)、记录路由项、源路由项、时间戳选项、填充(可选,长度可变))
# 4.3 子网划分
由于IPV4地址紧缺,在原有网络号、主机号二级结构上新加子网号
,变为网络号、子网号、主机号三级结构
,具体划分方式分为定长子网划分与变长子网划分
定长子网划分: 将一个网络地址的本地部分统一划分一定位作为子网号,剩余部分作为新主机号,分配不够灵活
变长子网划分: 以每个网络为基础选择网络号的长度,更灵活,目前使用广泛
变长划分主机号计算公式: 2^n - 2 >= 需要接入的主机数
n=主机号位数
//例如:网络号202.199.137.0,需要接入70台主机,进行子网划分
主机号位数n = 2^n >= 70 计数结果为n=7 (只能>=不能小于),说明主机位占7位,那么网络位数=32-7 = 25位
//新的子网=`202.199.137.0/25`,当空闲过多时,还可进行二次划分
2
3
常用方式
- 求广播号:网络号不动,主机号全为1
- 求网络号:网络号不动,主机号全为0
- 求主机号:网络号全为0
- 子网掩码:网络位全为1,主机位全为0
- 子网掩码与IP地址进行二进制与运算,可以得出网络号
网络可用范围 = 网络地址------广播地址之间的范围
能连接的主机数 = 2^n - 2 ,n为主机号位数,减2表示去掉网络号与广播号
无类型编址CIDR: 将多个小网络合并
为一大网络,不区分网络属于那类,地址聚合必须为2的n次方不能为奇数
聚合方式: 网络地址一样
的部分不变,不同
的部分用0表示,表示方法如:192.168.9.0/22
# 4.4 IP地址转换NAT
可以节约公网地址,同时提升安全性, 所有内网地址访问外网统通过NAT技术统一将源地址转换为对外的公网地址,外网访问时,通过公网地址然后使用NAT将目的地址转换为对应的私有地址
常见nat转换方式:
静态nat:
一对一为每个私有地址映射一公网IP,优点简单快速可对外屏蔽内网结构,缺点不灵活没节省IP动态nat:
一组私有地址映射一组公网地址,请求时动态分配外网地址,缺点访问外网主机数受限,最大等于公网地址数napt技术:
网络地址端口转换,转换时提供ip和端口号,通过端口号映射区分主机,可以实现多机器访问,避免了公网地址少问题
# 4.5 IP路由表
路由表: 存储有关目的站以及怎样到达目的站的信息,路由软件在传输数据包时需查询该表决定将数据发往何处
设计思想:
- 使用网络地址:减少路由条数,同一网段路由一致
- 使用下一跳:不包含完整路径,只包含从当前节点到下一个直接接收者的信息
- 使用默认路由:如果没有找到匹配的目标网络路由,就使用默认路由转发
- 静态路由:用户手动指定到目的地路由
路由优先级: 目的地可通过多条路由到达时,使用路由优先级最高路由作最佳路由(数值越小优先级越高)
路由权: 路由花费代价,多种因素生成,不同计算方法没可比性,直接路由与静态路由为0
# 4.5.1 路由选择算法
路由器接收到数据报后,根据路由表如何进行路由选择的过程
- 从数据首部提取目的IP地址D
- 判断是否直接交付,将目的地址D与直连各网络子网掩码按位与运算,结果与目标网络地址匹配则直接转发,否则进行间接交付执行3
- 若路由表中包含D的特定主机路由,则把数据发送到该路由指定的下一跳,否则执行4
- 对路由表中的每一条,用其子网掩码与地址D进行按位与运算得到M,若M与该条的目的网络地址匹配,则把数据转发给该条指明的下一跳路由,否则执行5
- 表中是否包含默认路由,若有则把数据发给默认路由,否则执行6
- 报告路由错误
# 4.5.2 主机与路由数据处理流程
- 主机与路由公共部分: 因为可能存在多个IP地址,目标数据到达后需要与所有接口ip进行比较,如果匹配,则保留数据进行处理,如果目的地是广播地址,接收点也必须接收该广播数据
- 主机处理流程: 网络接口软件将数据传给IP协议软件,如果数据目的地址与主机IP匹配,则ip软件接收并上报给合适的高层协议进一步处理,不匹配,要求主机丢弃该数据
- 路由器处理流程: 接收到数据,IP软件首先检查数据报首部各字段的正确性,如果错误进行丢弃,正确且目标地址是自己,则交给相应协议处理模块,否则进行转发处理,转发路由时,IP软件首先把TTL值减一,TTL值减1后变为0说明,超时,进行丢弃,否则查询路由表进行重新计算校验和并转发
# 4.6 地址转换协议ARP
ARP工作原理: 使用询问,由于目标的物理地址未知,因此必须使用广播方式
提问,这种广播是物理广播,即把MAC帧的目的物理地址改为广播地址,被询问的主机收到该广播报文(包含源IP,源mac、目标IP)
,从中提取询问方的物理地址,用单播方式回答(提取时判断目标ip地址是否与自己相等,相等回应,不等丢弃)
,此时发送方收到回答,获得了目的方的mac地址
ARP改进机制提升效率
- 高速缓存机制:使用高速缓存,避免每次都进行广播,会对解析的mac进行缓存一定时间
- 捎带机制:主机B在单播回应A的时候,顺便会将A的ip,mac记录自己的arp缓存表,方便自己下次传输
- 主机广播机制:当一主机接入网络或接口发生变化时,主动发送ARP广播通知网络内其他主机进行存储,方便下次发送
- 缓存定时刷新机制:一般为20分钟,过期后就删除,以应对目的主机IP发生变化情况
反向地址解析协议RARP: 与arp类似,不过是知道mac,找ip, 也是使用广播询问,单播响应,一般用于无盘工作站
# 4.7 网际控制报文协议ICMP
ICMP协议是IP协议的补充,用于IP层的差错报告与控制报告,是网络层协议,ICMP报文封装在IP数据报的数据部分
进行传输
**ICMP报文类型:**差错报告报文、控制报文、请求/应答报文
差错报告报文: 只能像源主机报告差错,不能像中间路由报告差错,共有三种形式
目的地不可达报文:
路由器无法根据路由表转发,目的主机不能向上交付时,ip将数据丢弃,并像源节点发送目标不可达超时报文:
路由器收到生存时间为0时,将数据报丢弃并向源主机发送超时报文,如果数据报发生了分片,目标主机在对分片进行重组时,出现了超时,目的主机向源主机发送分片重组超时报文参数错误报文:
路由器或目的主机收到数据报首部字段中有值不正确时丢弃报文,并向源主机发送参数错误报文
控制报文
源点抑制报文:
用于路由器或主机堵塞时,反馈源主机放慢发送速率,存在发现拥塞、解决拥塞、恢复3个阶段,路由器对缓冲进行检测,发现拥塞时,像源主机发送源点抑制报文, 源收到后降低发往该主机的速度,源点在一段时间后未在收到抑制报文,解除速度限制,逐渐恢复改变路由:
将数据发给默认路由时,默认路由发现其它路由更合适,就会向主机发送ICMP改变路由报文,使主机通过新路由访问
请求应答报文: 通过该报文一问一答,可以对网络某些问题进行检测,如可达性时钟同步等
回送请求/应答报文
:主机或路由向特定主机发出询问,收到该报文的主机必须发送回送应答报文时间戳请求/应答报文
:用于计算两台主机之间传输数据的往返时间地址掩码请求/应答报文
:使主机可以向路由器发送地址掩码请求来了解自身的掩码地址,路由器用该报文响应告知其掩码路由器询问/通告报文
:主机发送数据时,需要知道路由器信息,通过该报文主机可以广播方式发送询问,收到询问的路由器使用该报文广播其路由信息,可以使主机对无效路由及时放弃
ICMP应用举例:
Ping: Ping使用回送请求报文
来测试两个主机之间的连通性,是应用层直接使用网络层的例子,没通过传输的tcp/udp
ping工作原理: 主机或路由器向指定主机发送icmp请求报文,接收回送请求的目的地形成一个回送应答,并返回给最初者
请求应答的必要条件: 源主机必须路由该数据报、源站与目标中间路由必须正在运行并对数据进行正确路由、目的主机必须正在运行,icmp,ip软件工作正常、返回路径上的路由正常运行并进行了正确路由,因此请求应答成功说明上面环节中的设备都正常运行
路由追踪原理: 用来跟踪一个分组从源头到目标主机的路径
- 根据约定从源主机依次向目标主机发送生存周期TTL分别为1、2、3、4的IP数据报且每次发送的数据报是无法交付的UDP数据
- 若目的主机与源主机相隔6个路由,则前6个报文
(TTL分别为1- 6)
- 由于生存周期到达目的主机前TTL已减为0,数据报无法送到目的,因此每个TTL减为0的路由器回向源主机发回一个ICMP超时报文
- 这些发送超时报文的路由器就是源主机到目的主机路径上的路由
(按序排列)
- 由于封装的是不能交付的UDP包,所以当数据到达目的主机时无法向高层交付,此时目的主机向源主机发送目的主机不可达报文
- 至此结束,依次返回ICMP差错报文的路由器就构成了源主机到目的主机的路由
IGMP: 组管协议,类似ICMP,用于广播
# 4.8 IP路由协议
路由表可分为基于手工设置的静态路由与基于协议生成的动态路由
常见动态协议
- RIP协议:采用矢量路由算法,机器分为主动路由通
知路由
,被动路由接收路由
,采用最大路由距离值为15
,超过不可达,只适用于小型网络,存在路由收敛慢,更新传播报文慢问题,易导致路由不一致,因此使用16作为不可达路由 - HELLO协议:采用修改矢量路由算法,距离不用跳数,而用时延
- OSPF协议:采用SPF计算最短路由
(最短路径优先,链路状态算法)
,可以设置多条路径,提供负载均衡,收敛快,适用于大型网络 - BGP协议:边界网关协议结合了
矢量距离协议与链路状态协议
,用于各大自治系统之间进行传输路由信息
# 5. 传输层
位于网络层和应用层之间,承上启下作用,用于源主机与目的主机应用进程间的通信,需要满足以下3点功能
- 提供比IP层质量更高的服务,保证数据正确
(差错检测,重传)
- 提供识别不同应用进程的机制
(端口号)
- 对应用层不同大小数据进行处理
(分片,流量控制)
传输层提供的服务
- 连接管理:包括端到端连接的建立、维持释放,支持多个进程同时连接
- 优化服务质量:对网络层传输的数据进行
差错检测,排序
- 提供端到端透明传输:屏蔽底层差异,对数据传输进行控制,如
报文分段与重组,差错检测与恢复,顺序,流量控制
- 多路复用和分流:传输进程信息较少时,可将多个传输映射到一个网络连接,充分利用连接传输速率,减少网络连接数
- 状态报告:向用户提供传输层状态信息,
如吞吐量、平均延迟、地址等
- 安全性:可提供多种安全服务,如
加解密,加密数据链路
- 加速交付:接收方传输层可主动中断当前工作,通知接收了紧急数据,不需要等待后续数据到达而立即提交
端口: 用于区分同一主机的不同进程,常见熟知道端口(1-1023)
,注册端口(1024-49151)
,临时端口(49152-65535)
进程描述的标识一般采用格式:源IP地址|源端口|协议|目的IP地址|目的端口
- 源IP/目的IP用于区分不同主机
- 源端口/目的端口区分不同主机的不同进程
- 协议为传输层协议,区分数据报是基于UDP还是TCP协议传输
传输层提供无连接与面向连接服务
- 无连接:发送数据前不需要事先建立连接
- 面向连接:通信前用户
(进程)
必须先建立连接,一次完整数据传输包括,建立连接(三次握手)
、传输数据、释放连接(四次挥手)
# 5.1 UDP用户数据报协议
UDP特点: 基本数据传输机制,为应用进程提供访问IP的手段,即接收应用进程的数据,添加8字节首部
封装成UDP报文交给IP传送出去
无连接不可靠的传输层协议,传输时不需要先建立连接,远程主机收到UDP报文后也不需要进行确认
没有报文确认机制确认报文到达,没有对传入的报文排序机制,不提供反馈信息来控制端到端报文传输速度
在IP之上提供多路复用
(端口)
与数据的差错检测
功能,可检测整个UDP数据报的完整性优点速度快,实时性高,缺点不可靠,存在丢包,重复,乱序问题
(可自己实现数据检测,如quic协议在udp之上应用层实现数据报可靠传输,整合UDP优点)
UDP可以提供,一对一,一对多,多对多连接
UDP常用端口: 53:DNS,69:TFTP,123:NTP,161:SNMP,520:RIP
报文格式:由首部与数据两部分构成,首部只有固定8字节,由源端口、目的端口、长度、校验和组成
源端口与目的端口:
各为16位(2字节)
,源端口可选(因不需反馈信息基本无用)
,目的端口必选,源端口不选默认为0长度:
2字节,UDP报总长度,包括首部和数据校验和:
2字节可选,字段为0表示不计算(用于需要高效传输的场合)
,保证数据正确的唯一手段,计算校验和包括udp伪首部、UDP首部、数据
三部分
UDP伪首部: 长度12字节,用于检验UDP报是否正确到达目的主机,包含源IP、目标IP、协议、UDP总长度
,报文传输时不需发送,只用于报文发送与接收时计算验证校验和(解决UDP报文不包含IP不能确认主机的问题)
# 5.2 TCP传输控制协议
TCP特点: 面向连接的可靠传输协议,传输前必须先建立连接,传输后需要释放连接,只能一对一连接
TCP主要功能:提供可靠的,全双工的,面向字节流的,端到端的服务
- 寻址复用: 对不同进程数据进行复用连接,使用端口进行区分不同进程
- 连接管理: 负责连接的建立,管理,释放
- 数据处理: 将应用层进程数据进行分解封装,打包成适当报文
- 传输数据: 负责数据传输,可靠性保证
(超时重传,差错检测纠正)
,流量控制,拥塞控制
TCP可靠性保证:
- 面向数据流:使用无结构数据流,在任何发送接收上保证了数据都一致
(无边界字节流,因此存在粘包问题)
,由应用层协议区分 - 虚电路连接:发送接收前先建立逻辑链路连接,确保双方做好准备并按序传输
(通过初始化序列号)
- 带有缓冲的传输:在发送与接收两端都存在缓存区,发送端将多个数据缓存聚集发送,接收方将多个数据缓存逐个接收提交应用层
- 全双工连接:每个TCP连接包括两个独立的、流向相反的数据流,一个方向的传输不受另一影响且可将控制信息稍带在反方向报文中回到源主机
TCP常用端口号: 20/21:FTP,23:Telnet,25:SMTP,53:DNS,80:HTTP,110:POP3,111:RPC
TCP连接实质是两个套接字之间的连接(ip+端口)
报文格式: 由首部与数据两部分构成,首部固定20字节
,可根据需要动态调整最多60字节
,首部包含结构如下
源端口目的端口,各占2字节
序列号,4字节,序列号从一开始,使用算法计算出避免出现重复,主要用于
排序,去重,确认
确认号,4字节,用于确认报文接收方已收到,接收方收到后将接收的数据
序列号+1
并设为确认号
发送给发送方,发送方收到后可进行检查对方是否收到首部长度,4字节,表示首部长度,由于首部可变为不确定的,所以使用4位表示,也指示了数据区在报文中的起始偏移量
保留位,占6位,未使用,保留默认全0
标志位,表示数据包,常见标志,U紧急标志、A确认标志
(ACK)
、P推送标志、R复位标志(RST)
、S同步标志(SYN)
,F终止标志(FIN)
窗口大小,2字节,窗口通告值,由接收方设置,发送方根据该值来调整发送窗口大小,通告该窗口可以实现流量控制
校验和,2字节,与UDP类似,同样需要包含TCP伪首部,TCP伪首部协议类型值为
6
,UDP伪首部为17
紧急指针,结合紧急标志使用,提升数据收发优先级,使发送接收都立即执行,不用等到缓冲区填满
选项,长度可变,每个选项由类型、长度、数据组成,常见选项
(MSS,窗口扩大因子、选择确认数据块、时间戳值)
填充,用于字段对齐32位,可以采用0填充
MSS: MSS值表示TCP最大传输报文长度
,包括首部与数据部分的总长度(不包含伪首部)
,以字节为单位最大65535字节
,但由于数据链路层MTU的长度,一般MSS默认为556字节
,数据部分为556-20=536字节(标准长度)
,封装如IP后典型长度556+20=576
,也是IPV6的包长度
# 5.3 TCP连接管理
# 5.3.1 TCP连接建立3次握手
客户端A
与服务器B
建立连接
- A首先向B发送一个SYN报文,SYN标志设为1,序列号Seq=x
(初始序列号,随机值)
,然后启动计时器,等待B应答,不携带用户数据,消耗一个序列号,进入SYN_SENT状态 - B收到A的请求后向A发送ACK、SYN报文,标志位SYN、ACK都置为1,序列号Seq=y. 确认号=x+1,启动计时器,等待接收A的应答进入SYN-RCVD状态
- 若A在计时器超时前收到B的应答,判断确认号是否=x+1,是,表明B正确收到,向B发送一个ACK报文,标志位ACK标志置为1,确认号=y+1,至此A认为连接已经建立,本次可以携带用户数据进入ESTABLISHED状态
- 若B在超时前收到A的应答,判断确认是否=y+1,是表明A正确收到,至此B也认为连接已经建立进入ESTABLISHED状态
在这三次报文交换过程中,如果存在报文丢失会出现以下情况
- 第一个SYN报文丢失,则B不会应答,A在超时前收不到应答,最终超时失败
- 如果第二个SYN+ACK报文丢失,则A收不到应答,导致B也收不到应答,双方都会超时失败
- 如果第三个ACK报文丢失,则B收不到应答,超时失败,此时称为半连接,A认为已建立,B认为没有,解决方案A在一段时间没有成功发送或者接收就释放连接
三次握手的安全隐患:
SYN洪泛攻击: 利用三次握手半连接缺点,发送大量SYN报文给服务器建立半连接,利用虚机源IP不响应最后的ACK,消耗服务资源
解决办法:特定时间限制连接次数,过滤非法源地址数据,降低二次握手重试次数,超时时间,开启synccookie,增大半连接、全连接队列,增大收发缓冲区
冒充窃取数据: 中间人攻击,冒充正常主机,解决办法使用加密
# 5.3.2 TCP连接释放4次挥手
参与数据交互的双方都可关闭连接,当一方向终止时,另一方向任可继续传输数据,分为正常释放非正常释放2种
连接正常释放: 应用程序传输数据完成后才使用关闭操作关闭连接
TCP四次挥手: 分为半关闭与全关闭2个阶段,半关闭:当A没有数据向B发送,A向B发起释放请求,B回复确认,此时A收到确认后A向B的连接关闭,但B任然可以向A发送数据,全关闭当B没有数据发送给A时,由B向A发起释放请求,A回复确认,B收到A的确认后进入全关闭,整个连接释放,流程如下:
- A发送完数据后向B发送FIN报文,进入FIN_WAIT_1
- B收到A的请求后向A发送确认报文ACK,B进入CLOST_WAIT,A收到确认后进入FIN_WAIT_2
- B也发送完数据后,向A发送FIN报文进入LAST_ACK
- A收到后向B发送确认ACK,进入TIME_WAIT,该状态只存在主动发起关闭方,B收到确认ACK后进入CLOST,连接关闭
- A在等待2MS后,进入CLOST,连接彻底关闭
TCP三次挥手: 当A向B发起FIN释放请求时,由于B没有数据需要向A传递,因此可将FIN,ACK合并一起发送,其它与4次一致
连接非正常释放: 由于网络或其它原因,导致连接异常终止,使用RST复位
标志完成
- 拒绝连接请求:当A向B发起B不存在的端口建立连接,TCP可以发送RST=1的报文拒绝连接
- 异常终止连接:连接过程出现异常,某一方愿意异常终止连接可以发送RST=1报文终止连接
- 长时间空闲:建立的连接长时间空闲,如未发生数据,断电等,可以发送RST=1报文终止连接
# 5.3.3 TCP流量控制
tcp采用滑动窗口、慢启动等机制控制
滑动窗口: 使用滑动窗口传输(与数据链路层滑动窗口类似)
,允许接收方根据自己接收能力来控制发送方发送速率,面向字节,根据接收方响应的窗口大小字段来更新发送方的发送窗口大小,发送方具体发送窗口大小取决于,接收窗口与拥塞窗口中较小的值(用于拥塞避免)
具体工作流程如下
- 双方在建立连接时确定发送和接收字节序号,确定最大报文长度MSS值为标准长度
(确定发送和接收的窗口)
,标准大小=556字节,包含头部与数据(头部固定部分为20字节,最大60字节)
- 发送方发送长度为MSS的报文后,启动计时器,转到步骤4等待接收方应答
- 接收方收到报文后给出应答,其中包含的窗口值即为可接收的字节数,调整可以接收的序列号
(接收窗口)
- 发送方等待接收方应答,收到应答,根据接收到报文中窗口值更新自己的MSS值
(窗口值)
,转到步骤2 - 发送方如果超时未收到应答,则重传该报文段后启动计时器,进入步骤4
窗口糊涂综合症: 出现后传输速率效率低下,发送接收双方都有可能产生,原因是发送生产数据过慢,接收消费数据过慢导致,使发送或者接收的报文段很小,降低效率,如每次发送一个字节,接收一字节
解决办法
- 发送方:强迫发送方TCP等待,将数据放入发送缓存中,积累到一定数量后在发送,使用Nagle算法
(等到窗口大小 >= MSS 并且 数据大小 >= MSS,或者收到之前发送数据的 ack 回包,2者满足其一即可)
- 接收方:不通告小窗口给发送方,当「窗口大小」小于 min( MSS,缓存空间/2 ) ,也就是小于 MSS 与 1/2 缓存大小中的最小值时,向发送方通告窗口为
0
,阻止发送方再发数据,等到接收方处理了一些数据后,窗口大小 >= MSS,或者接收方缓存空间有一半可以使用,在把窗口打开让发送方发送数据
死锁问题
接收方收到报文,但不能继续接收新报文,就发送窗口等于0的确认报文,接收方收到后将窗口设为0停止发送,等待接收到窗口不等于0的确认后在启动发送,一段时间后如果接收方发送了窗口不等于0的确认报文,但是该确认报文丢失了,发送方未收到就会一直等待不能发送,接收方也会一直等待接收不到新报文,陷入死锁
**解决办法:**TCP为每一个连接使用持续计时器,只要接收方收到窗口=0后,就启动计时器,若计时器到期后还未收到窗口不等于0的确认报文,发送方就发送一个窗口=0的探测报文,接收方收到后在确认报文中给出当前窗口值,若窗口还=0,发送方则重新设置计时器等待,若窗口不等于0,则发送数据
# 5.3.4 TCP拥塞控制
在网络出现拥塞时,TCP减少传输,避免网络崩溃
拥塞窗口 cwnd是发送方维护的一个的状态变量,它会根据网络的拥塞程度动态变化的。
发送窗口 swnd
和接收窗口 rwnd
是约等于关系,加入拥塞后,发送窗口值是swnd = min(cwnd, rwnd)
拥塞和接收窗口中的最小值。
拥塞窗口 cwnd
变化的规则:只要网络中没有出现拥塞,cwnd
就会增大;但网络中出现了拥塞,cwnd
就减少;
只要「发送方」没有在规定时间内接收到 ACK 应答报文,也就是发生了超时重传,就会认为网络出现了拥塞。
拥塞控制机制:慢启动、拥塞避免、快速重传、快速恢复,随机早期检测RED(拥塞发生前)
连接启动时
- 慢启动:用于连接刚建立时当发送方每收到一个 ACK,拥塞窗口 cwnd 的大小就会增加,每次按指数增长,每次翻倍
- 拥塞避免: 当慢启动到达
门限值时
,启用拥塞避免算法,拥塞窗口cwnd的大小每次收到ACK后按线性增长,每次加1
拥塞发生: 当网络出现拥塞,也就是会发生数据包重传,重传机制主要有两种
超时重传: 当发生了「超时重传」,则就会使用拥塞发生算法,此时,门限值ssthresh 和 拥塞窗口cwnd 的值会发生变化
ssthresh
设为cwnd/2
,cwnd
重置为1
(是恢复为 cwnd 初始化值,这里假定 cwnd 初始化值 1)Linux 针对每个 TCP 连接的 cwnd 初始化值是 10,也就是 10 个 MSS,可用 ss -nli 命令查看每一个 TCP 连接的 cwnd 初始化值拥塞发生算法的变化如下图:
快速重传: 接收方发现丢了一个中间包的时候,发送三次前一个包的 ACK,于是发送端就会快速地重传,不必等待超时再重传
TCP 认为这种情况不严重,因为大部分没丢,只丢了一小部分,则
ssthresh
和cwnd
变化如下cwnd = cwnd/2
,也就是设置为原来的一半;ssthresh = cwnd
;- 进入快速恢复算法
快速恢复
快速重传和快速恢复算法一般同时使用,快速恢复算法是认为,还能收到 3 个重复 ACK 说明网络也不那么糟糕,所以没有必要像 RTO
超时那么强烈,进入快速恢复之前,cwnd
和 ssthresh
已被更新:
cwnd = cwnd/2
,也就是设置为原来的一半;ssthresh = cwnd
;
然后,进入快速恢复算法:
拥塞窗口
cwnd = ssthresh + 3
( 3 的意思是确认有 3 个数据包被收到了);重传丢失的数据包;
如果再收到重复的 ACK,那么 cwnd 增加 1;
如果收到新数据的 ACK 后,把 cwnd 设置为第一步中的 ssthresh 的值,原因是该 ACK 确认了新的数据,说明从 duplicated ACK 时的数据都已收到,该恢复过程已经结束,可以回到恢复之前的状态了,也即再次进入拥塞避免状态
快速恢复算法的变化过程如下图
随机早期检测RED: 在拥塞发生前实施检测,实施预防性报文丢弃,RED算法流程如下
首先为路由器的输出队列设置队列长度最小门限值Thmin、最大门限值THmax、丢弃概率P,三个参数的值对算法影响较大
- 对每一个到达的报文都先计算平均队列长度Lav
- 若
Lav < THmin
,则将新到达的报文放入队列进行排队 - 若
Lav > THmax
,则将新到达报文丢弃 - 若
THmin <= Lav <= THmax
,则按某一概率p,将新到达的报文丢弃
通过该算法,使路由器在队列缓存满之前,就丢弃一部分报文,避免发生全局性拥塞(多数链接拥塞),使拥塞只在个别TCP连接上进行
# 6. 应用层协议
常见应用层协议:DNS、FTP/TFTP文件传输、SMTP邮件传输、POP/IMAP邮件获取、Telnet远程登录、HTTP、DHCP、SNMP等
- DNS:用于进行域名解析,解析方式有迭代解析,递归解析,使用本地高速缓存提高解析效率,缓存有过期时间
- FTP:有2个端口,控制命令数据端口21,文件数据端口20
- TFTP:端口69,基于UDP
- SNMP:简单网络管理协议,用于网络设备管理,使用端口UDP161
(除trap外传输都使用改端口)
, 162(只用于TRAP信息)
- DHCP:动态主机配置协议,端口68,主要用于分配IP地址,支持静态和动态,由于在局域网使用广播发现,不能跨网段,需要使用中继
DHCP协议运行流程: 基于UDP,服务端接端口68,DHCP客户端口67
- DHCP Client以广播的方式发出DHCP Discover报文。
- 所有收到的DHCP Server都会以广播给出响应,向DHCP Client发送一个DHCP Offer报文
(一般随先响应使用谁)
- DHCP Client向
选择的服务器
会发出一个的DHCP Request广播报文,在选项字段中会加入选中的DHCP Server的IP地址和需要的IP地址。 - DHCP Server收到DHCP Request报文后,判断选项字段中的IP地址是否与自己的地址相同,如果相同,DHCP Server就会向DHCP Client响应一个DHCP ACK报文广播
- DHCP Client接收到DHCP ACK报文后,检查DHCP Server分配的IP地址是否能够使用。
- DHCP Client在成功获取IP地址后,随时可以通过发送DHCP Release报文释放自己的IP地址。
DHCP的工作流程可以简化为4步:
- DHCP Discover:客户端 “谁是DHCP服务器,我需要IP地址!”
- DHCP Offer:DHCP服务器们 “我有IP地址!”,“我也有IP地址”,“……”
- DHCP Request:客户端 “我要使用这个DHCP服务器提供的IP地址。”
- DHCP ACK:被使用IP的服务器 “好的,你用吧,租期是8个小时。”,没被使用IP的服务器 “不用拉到(小声哔哔)”
DHCP租约: DHCP给分配的IP设置一个租期
- 当租期超过 50% 时,客户端会单播向服务器发送请求报文(DHCP Request)来续租IP地址
服务端收到,就延长租期,如果没收到,则什么也不做
- 当租期超过 87.5% 时,客户端会广播请求报文来续租IP
服务端收到,就延长租期,没收到什么也不做,直到租期结束,向服务端发送释放报文,然后重新广播发现报文,申请IP地址