这是一篇关于计算机网络基础知识总结的笔记💌
数据链路层😼
不被要求对网络层提供可靠传输
前置知识:
链路和数据链路的区别:
链路(物理链路):仅仅是一个节点到相邻节点的物理段路
数据链路(逻辑链路):是在链路的基础上,还添加一些必要的协议控制数据传输(通常使用网络适配器来实现这些协议)
帧:数据链路层的协议数据单元
数据报(分组、包):网络层协议的数据单元
数据链路层和帧的关系:数据链路层把网络层发下来的数据报构成帧发送到链路上;以及把接收到的帧的数据取出来给到网络层
一、信道通信的两种方式👶
1、点对点信道:一对一的点对点通信
-
进行通信的主要步骤:
-
发送方:通过链路层封装(通过添加首部和尾部)网络层的数据报
-
中间过程:通过链路传送封装好的帧
-
接收方:接收方的数据链路层检测收到的帧无差错,则从帧中提取数据报交给网络层
-
2、 广播信道:一对多的广播通信
二、数据链路层的三个基本问题👦
1、封装成帧😍
在一段数据的前后分别添加首尾部分
首尾部分的作用:进行帧定界,同时首尾部包含必要的控制信息
封装成帧的必要性:在数据传输发生差错时,可以通过首尾部的帧定界符,让接收端知道这个帧是不完整的,必须丢弃
-
帧定界:在首部添加SOH(帧定界开始符),在尾部添加EOT(帧定界结束符);并不是字符,SOH十六进制的编码01,EOT十六进制编码04
-
帧定界首尾长度:应当使帧的数据部分长度尽可能的大于首部和尾部的长度(帧的数据部分长度上限--MTU(最大传输单元))
2、透明传输🤩
定义:无论传输什么样的比特组合数据,都能按照原样没有差错的通过数据链路层
字节填充:为了解决传输数据中可能包含控制字符(SOH EOT),从而影响透明传输的问题
-
字节填充:在控制字符前添加转义字符ESC(十六进制编码1B),早接收端的数据链路层会在送往网络层之前删除这个插入的转义字符;
-
如果数据中出现转义字符,则在转义字符前再加一个转义字符,当接收端收到连续两个转义字符时,就删掉前面的那个
3、差错检测🥰
必要性:由于现实的通信链路不是理想的,会产生比特差错,为了保证数据传输的可靠性
差错检测措施:循环冗杂检验CRC--就是在数据后面添加供差错检测用的n位冗余码(FCS)
CRC原理
在发送端通过计算得到冗余码,通过二进制的模2运算进行2^n×M的操作.....
接收端对收到的数据以帧为单位进行CRC检验后:把每一帧都除以同样的除数P,如果余数R=0,则帧没有差错,否则丢弃
-
CRC:只能做到对帧的无差错接受--凡是接收端数据链路层接收的帧,我们都能以非常接近于1的概率认为这些帧在传输过程中没有产生差错,可以近似的表述为:凡是接收端的数据链路层接受的帧均无差错
-
出现传输错误
-
帧丢失 --收到[#1]-[#3] (丢失[#2])
-
帧重复 -- 收到[#1]-[#2]-[#2]-[#3] (收到两个[#2])
-
帧失序 -- 收到[#1]-[#3]-[#2] (后发送的帧先到接收端,与一般数据链路层的传输概念不一样)
-
-
由于一开始的CRC只能实现无比特传输,为了保证向上提供可靠传输,于是在CRC的基础上,添加了帧编号、确认和重传机制
-
由于通信链路质量引起差错的概率已经大大降低,目前只对于通信质量较差的无线传输链路使用确认和重传机制
三、点对点协议PPP👱
PPP协议就是用户计算机和ISP(互联网服务提供者--提供ip地址)进行通信时使用的数据链路层协议
适用于线路质量不太差的情况下使用
一、PPP协议应满足的需求 --只支持全双工链路😶
1、简单
-
简单:接收方每收到一个帧,就进行CRC检验。检验正确就收下,错误就丢弃
2、封装成帧
-
通过帧定界符在比特流中追却找到帧开始和结束位置
3、透明性
-
保证传输透明性--通过字节填充
4、多种网络层协议
-
必须能够在同一条物理链路上同时支持多种网络层协议
-
当点对点链路所连接的是局域网或路由器时,PPP协议必须同时支持在链路所连接的局域网或路由器上运行的各种网络层协议
-
5、多种类型链路
-
必须能够在多种类型的链路上运行
-
如:串行、并行、同步、异步、低速、高速、电、光、交换、非交换的点对点链路
-
6、差错检测
-
必须能对接收端收到的帧进行检测,并立即丢弃有差错的帧
7、检测连接状态
-
必须具有一种机制能够及时自动检测出链路是否处于正常工作状态
8、最大传输单元
-
对每一种类型的点对点链路设置MTU(最大传输单元)的标志默认值
9、网络层地址协商
-
必须提供一种机制使通信的两个网络层实体能够通过协商知道彼此的网络层地址
10、数据压缩协商
-
必须提供一种数据压缩算法。
二、PPP协议的组成😐
1、一个将ip数据报封装到串行链路的方法
即支持异步链路,也支持面向比特的同步链路
2、一个用来建立、配置和测试数据链路连接的链路层协议LCP
3、一套网络控制协议NCP
每个协议支持不同的网络协议
三、PPP协议的帧格式🤨
异步传输时:转义字符为0x7D,并使用字节填充
同步传输时:零比特填充,实现透明传输
零比特传输:通过硬件进行比特流扫描
发送端:当发现连续五个1的时候,立即填一个0
接收端:发现连续五个1就把末尾的0删掉,还原比特流
1、首部
-
第一个字段是标志字段F,规定为0x7E
-
地址字段A规定为0xFF,控制字段C规定为0x03
-
第四个字段是2字节的协议字段 -- 当协议字段为0x0021时,PPP帧的信息字段就是ip数据报;若为0xC021,则信息字段是PPP链路控制协议LCP的数据,0x8021表示这是网络层的控制数据
2、信息部分
信息字段的长度是可变的,不超过1500字节
标志字段的作用:表示一个帧的开始和结束,就是PPP帧的定界符
3、尾部
-
第一个字段是CRC帧检验序列FCS
-
第二个字段是标志字段F,规定为0x7E
四、PPP协议的工作状态😏
1、PPP链路是怎样被初始化的:
起始状态 -- 链路静止
用户接入ISP -- 建立了一条从用户个人电脑到ISP的物理连接
链路建立 -- 目的是建立链路层的LCP连接
协商 -- 开始发送LCP的配置请求帧
用户个人电脑向ISP发送一系列的链路控制协议LCP分组(封装成多个PPP帧)-- 便于建立LCP连接
鉴别
分组及其响应使用一些PPP参数
网络层协议-- 鉴别成功
进行网络层配置 -- 网络控制协议NCP给新接入的用户个人电脑分配一个临时的IP地址
用户电脑变成了在互联网上一个有IP地址的主机
用户通信完毕 --NCP释放网路层连接,收回IP地址,LCP层释放数据链路层连接,最终释放物理层连接
终止状态 -- 链路静止
2、链路的另一端发送以下几种响应 -- 在链路协商且LCP发送完特定的配置请求
配置确认帧(Configure-Ack) 所有选项都接受
配置否认帧(Configure-Nak)所有选项都理解但不接受
配置拒绝帧(Configure-Reject)选项有的无法识别或不能接受,需要协商
3、鉴别状态
在这一状态,只允许传送LCP协议的分组、鉴别协议以及监测链路质量的分组
若使用口令鉴别协议PAP,则需要发起通信的一方发送身份标志符和口令。
如果需要更好的安全性,可使用更复杂的CHAP握手鉴别协议。鉴别失败,直接转到链路终止,鉴别成功,直接进入网络层协议NLP
4、网络层协议NLP
根据网络层的不同协议互相交换网络层特定的网络控制分组
四、广播信道的数据链路层🧔
1、局域网的数据链路层
局域网的特点:网络为一个单位所拥有,且地理范围和站点数目均有限
局域网的优点
具有广播功能,从一个站点可以很方便分访问全网。局域网上的主机可共享连接在局域网上的各种硬件和软件资源
便于系统的扩展和逐渐演变,各设备的位置可灵活调整和改变
提供了系统的可靠性、可用性、生存性
可按网络拓扑进行分类
1.2、适配器的作用
适配器在接收和发送各种帧时不使用CPU,收到差错帧时,直接丢弃不通知计算机;只有在收到正确的帧的时,它就使用中断来通知计算机,并交付给网络层。
计算机与外界局域网的连接是通过通信适配器进行的
装有处理器(RAM)和存储器(ROM)和 对数据进行缓存的存储芯片
与局域网之间的通信时通过电缆或双绞线以串行传输进行
与计算机之间的通信通过主板的I/O总线以并行传输进行
计算机的硬件地址在适配器的ROM中,ip地址在计算机的存储器中
1.3、共享信道
静态划分信道
如:频分复用、时分复用、波分复用、码分复用
优点:只要分配了信道就不会和其他用户产生冲突
缺点:划分信道的方法代价较高,不适合局域网使用
动态媒体接入控制
又称多点接入,其特点是信道并非在用户通信时固定分配给用户
以太网采用随机接入,使用CSMA/CD协议解决冲突
-
随机接入
-
特点:所有用户可随机发送消息。
缺点:如果恰巧有两个或更多的用户在同一时刻发送信息,就会在共享媒上产生碰撞,使得用户的发送都失败
-
受控接入
特点:用户不能随机发送信息而必须服从一定的控制
典型代表:分散控制的令牌环局域网和集中控制的多点线路探询或成为轮询
1.4、CSMA/CD(载波监听多点接入/碰撞检测)协议👨🏫
1、以太网采用的两种通信措施
无连接的工作方式
定义:不必先建立连接就可以直接发送数据
适配器对发送的数据帧不进行编号,也不要求对方发回确认
优点:使以太网工作起来非常简单,而且由于局域网信道的质量很好,因通信质量不好产生差错的概率很小
总结:以太网提供的服务是尽最大努力的交付,即不可靠交付
发送数据使用曼彻斯特编码的信号
2、协议要点
多点接入
说明是总线型网络
载波监听
定义:用电子技术检测总线上有没有其他计算机也在发送
载波监听就是检测信道
不管在发送前,还是发送中,每个站都必须不停地检测信道
发送前:为了获得发送权。如果检测出已经有其他站在发送,则自己就暂时不许发送数据,必须要等到信道变为空闲时才能发送
发送中:为了及时发现有没有其他站的发送和本站的发送的碰撞--称为碰撞检测
碰撞检测(冲突检测)
定义:边发送边监听,即适配器边发送数据边检测信道上的信号电压的变化情况,以便判断自己在发送数据时其他站是否也在发送数据。
实际过程
当几个站(主机)同时在总线上发送数据时
总线上的信号电压变化幅度将会增大
当适配器检测到信号电压变化幅度超过一定的门限值时
就认为至少有两个站同时发送数据,表明产生了碰撞
这时,总线上传输的信号产生了严重的失真,无法从中恢复有用的信息
3、协议总结
准备发送
适配器从网络层获得一个分组,加上以太网的首部和尾部,组成以太网帧,放入适配器的缓存中。--发送之前,必须检测信道
检测信道
若检测信道忙,则应不停地检测,一直等待信道转为空闲。
如果检测信道空闲,并在96比特时间内信道保持空闲(保持帧间最小间隔),就发送这个帧
边发送边监听
发送成功:争用期间未检测到碰撞;肯定能成功发送,什么也不做
发送失败:在争用期间检测到碰撞,立即停止发送数据,并按规定发送人为干扰信号。适配器接着执行指数退避算法,等额定时间后重新检测信道;如果重传16次仍不能成功,则停止重传向上报错
4、以太网特点
每发送完一帧,一定要把已经发送的帧暂时保留一下。如果在争用期发生碰撞,那么还有推迟一段时间后再把这个暂时保留的帧重传一次。
5、集线器的星型拓扑
特点如下:
用集线器的以太网在逻辑上仍是一个总线网,各站共享逻辑上的总线,各站中的适配器使用的还是CSMA/CD协议;网络中的各站必须竞争对传输媒体的控制,并且在同一时刻至多只允许一个站发送数据
一个集线器很像一个多接口的转发器
集线器工作在物理层,他的每个接口仅仅简单地转发比特,不进行碰撞检测;若两个接口同时有信号接入,那么所有的接口都收不到正确的帧
集线器采用了专门的芯片,并进行自适应的串音回波抵消
6、以太网的MAC层
1、MAC层的硬件地址
实际上就是适配器地址或适配器标识符EUI-48,当这块适配器插入到某台计算机后,适配器的标识符就成为这个计算机的MAC地址
适配器的过滤功能
发往本站的帧
单播帧(一对一):即收到的帧的MAC地址与本站硬件地址相同
广播帧(一对全体):即发送给本局域网上所有站点的帧
多播帧(一对多):即发送给本局域网上一部分站点的帧
2、MAC帧的格式
MAC帧由五个字段构成
第一个字段:6字节长的目的地址字段
第二个字段:6字节长的源地址字段
第三个字段:2字节的类型字段,用来标志上一层用的什么协议
第四个字段:46~1500字节长度之间的数据字段
第五个字段:4字节的帧检验序列
在前面特别插入的8字节字段:这是因为一个站在刚开始接受MAC帧时,由于适配器的时钟尚未与到达的比特流达成同步,所以为了接收端迅速实现位同步所插入,由两个字段构成
第一个字段:7个字节的前同步码,作用是使接收端的适配器在接受MAC帧时能够迅速的调整其时钟频率,使它和发送端的时钟同步
第二个字段:帧开始定界符
1.5、扩展以太网
物理层扩展以太网
数据链路层扩展以太网
通过以太网交换机
以太网交换机的特点
实质:多接口的网桥
并行性:同时连接多对接口、使多对主机同时通信
相互通信的主机 都具有 独占传输媒体,无碰撞的传输数据
具有存储器,用来在输出端口繁忙时,进行帧和缓存
内部的帧交换表(地址表)通过自学习算法逐渐建立的
网桥:对收到的帧根据Mac帧的目的地址进行转发和过滤
以太网交换机的自学习功能
简要过程:
主机A通过接口1进入以太网交换机
交换机收到帧,查询交换表
如果有主机B的MAC地址,主机B直接收下帧
如果没有查到,交换机将主机A 和接口1写入交换表,进行广播其他所有接口
如果广播到其他主机,则会直接丢弃帧
如果是目的B,则直接收下
上述过程成为过滤
成功收到
虚拟局域网
利用以太网交换机实现
网络层🐱
向上提供简单灵活的、无连接的、尽最大努力交付的数据报(分组)服务
应用层事先声明
“我不提供服务质量保障的服务,出现分组的丢失、重复、失序、不按时交付分组等问题,与我无关”
一、 网际协议IP🦮
用来使互联起来的计算机网络能够进行通信
1、配套使用的三个协议🙄
地址解析协议ARP
网际控制报文协议ICMP
网际组管理协议IGMP
2、中间设备😬
1 转发器
使用在物理层
2 网桥或桥接器
使用在数据链路层
用网桥互连的网仍然是一个局域网,只能有一个网络号
3 路由器
使用在网络层 -- 也常被称为网关
一台专用计算机,用来在互联网上进行路由选择。
总是具有两个或两个以上的IP地址,即路由器的每一个接口都有一个不同的网络号的IP地址
4 网关
网络层以上
3、虚拟互连网络😌
使用IP协议可以使这些性能各异的网络在网络层上看起来像是一个统一的网络
分组在互联网上的转发过程
如果源主机H1要把一个IP数据报发送给目标主机H2
H1查找自己的路由表
看H2是否在本网络上
如果是:不需要经过路由器,可直接交付
如果不是:则必须把IP数据报发送给某个路由器R1
R1查找自己的转发表后,知道要转发数据报给R2进行间接交付
多次转发后,成功找到H2
4、分类的IP地址😒
IP地址由ICANN(互联网名字和数字分配机构)进行分配
定义:就是把IP地址划分为若干个固定类,每一个类地址都由两个固定长度字段组成
ip地址标志一台主机(或路由器)和一条链路的接口
互利网:一个网络是指具有相同网络号net-id的主机的集合,用转发器或网桥连接起来的若干个局域网仍为一个网络。不同网络号的局域网必须使用路由器进行互连
同一个局域网上的主机或路由器的IP地址的网络号必须一样
1、ip地址的格式
ip地址 ::={<网络号>,<主机号>}
::= 表示定义为
网络号:标志主机(或路由器)所连接到的网络
必须是唯一的
主机号:标志该主机(或路由器)
一台主机号在它前面网络号所指明的网络范围内必须是唯一的
2、ip地址的分类
A类、B类、C类地址都是单播地址(一对一通信)
前面的0 10 110是类别类,规定值
D类地址用于多播
E类保留以后使用
A类IP地址(1~126)
网络号字段占1个字节,只有7位可以使用,可指派的网络号是126(2的七次方-2)个
主机号字段占3个字节,A类网络中最大的主机数是2的24次方-2
减2的原因:
IP地址全0表示保留地址,也就是本网络
网络号127保留作为本地环回测试本主机之间的通信之用
环回地址的数据报不会发送到任何网络,因为127根本不是一个网络地址
B类IP地址(128.1~171.255)
网络号有两个字节,前面两位已固定,可用14位
主机号字段占2个字节
128.0.0.0不可指派
C类IP地址(192.0.1~223.255.255)
网络号3个字节,固定三位,可用21位
主机号1个字节
192.0.0.0不可指派
3、点分十进制记法
在IP地址中的每八位插入一个空格,为了便于书写会在数字之间加上一个点
4、IP地址的重要特点
1、每一个IP地址都是由网络号和主机号两部分组成
IP地址是一种分等级的地址结构
分等级的好处
方便了地址的管理:IP地址管理机构在分配IP地址时只分配网络号,剩下的主机号由单位自行分配
减少了路由表所占的存储空间以及查找路由表的时间:路由器仅根据目的主机所连接的网络号来转发分组,这样可以使路由表中的项目数大幅度减少
2、IP地址是标志一台主机(或路由器)的一条链路接口
当一台主机同时连接到两个网络上时,该主机就必须同时具有两个相应的IP地址,其网络号必须是不同的。这种主机称多归属主机
3、一个网络是指具有相同网络号net-id的主机集合
用转发器或网桥连接起来的若干个局域网仍为一个网络,因为这些局域网具有同样的网络号。不同网络号的局域网必须使用路由器互联
4、在IP地址中所有分配到网络号的网络都是平等的
平等对待每一个IP地址
5、IP地址与硬件地址😴
物理地址:数据链路层和物理层使用的地址
IP地址:是网络层和以上各层使用的地址,是一种逻辑地址
IP编址解决了复杂的硬件地址转换工作
1、传输过程
在发送放的网络层将IP数据报(使用IP地址)传送给了数据链路层
在发送方的数据链路层封装成MAC帧
MAC帧传送使用的地址是物理地址,写在首部
在链路上的设备(主机或路由器)收到MAC帧,根据首部的地址判断是否收下
在接收方的数据链路层剥去MAC帧的首尾部,上交给网络层
接收方的网络层找到IP数据报首部的源地址和目的地址
因为在链路层ip数据报都是MAC帧,所以链路层看不见ip地址
2、地址解析协议ARP👨🏫
ARP协议在IP协议里面,可以划分到网络层
优点:ARP把已经得到的地址映射保存在高速缓存中,这样就使得该主机下次再和具有同样目的地址的主机通信时,可以直接从高速缓存中找到所需的硬件地址而不必再用广播方式发送ARP请求分组
有生存时间:凡超过的都从高速缓存中删掉
作用:已知一个主机(或路由器)的IP地址,需要找出相应的硬件地址
用途:从网络层使用的IP地址,解析出在数据链路层使用的硬件地址
ARP如何解决IP地址和物理地址的映射问题
通过在主机ARP高速缓存中存放一个从IP地址到硬件地址的映射表,并且映射表经常动态更新(新增或超时删除)
ARP高速缓存
每一台主机都设有ARP cache,里面有本局域网上的各主机和路由器的IP地址到硬件地址的映射表,这些都是该主机目前知道的一些地址
主机获取一些地址
当主机A要向本局域网上的某台主机B发送IP数据报时
先在A的ARP告诉缓存中查看有无主机B的IP地址
有:就查出对应的硬件地址,把这个地址写入MAC帧,通过局域网把MAC帧发送到B的硬件地址
没有:可能是主机B才入网或者A刚加电,高速缓存为空
对ARP找不到B的IP地址的情况进行讨论
ARP进程在本局域网上广播发送ARP请求分组
在本局域网上的所有主机运行的ARP进行都收到A的ARP请求分组
目标主机B发现自己的IP地址和ARP的请求分组查询的IP地址一致,收下ARP请求分组,并向A发送ARP响应分组,同时在响应分组里写入自己的硬件地址
在B中的ARP高速缓存中记录A的信息,建立映射
当A收到B的响应分组后,就在其ARP高速缓存中写入B的IP地址到硬件地址的映射
如果不在同一个局域网上,就需要路由器进行转发
方式基本同一个局域网的操作,就是在不同局域网之间加了路由器进行转发操作
H1要找另一个网络上的主机(H3或H4),H1发送请求分组,找到R1的硬件地址
找到网1上的一个路由器R1的硬件地址,剩下交给R1处理--由R1进行发送
如果是发送到和R1连在同一个网络的主机,则R1发送ARP请求分组给H3
如果发送到另一个网络的主机,R1发送ARP分组,找到连接在网络2上的一个路由器地址R2的硬件地址,剩下的由R2完成
ARP小剧场
故事简介:故事发生在一个小区(局域网)里,男方(主机A)要去女方(主机B)家里玩,但不知道女方家在哪,于是站在自己家门口大喊
故事:
男方大喊:“小芳(主机B的IP地址)我要找你玩(ARP广播),我是小明(主机A的IP地址),我家在16栋2406(主机A的物理地址),你家在哪啊?”
此时小区的用户都听到了,但是都知道叫的不是自己,于是都不理他(ip地址具有唯一性)
女方寄快递(响应是单播)给男方上的信说:好,我在15栋2802(主机B的物理地址),你来吧
于是二人拿笔记(ARP高速缓存)记住各自的家庭地址
6、IP数据报格式🤕
wireshark抓包ip格式
我知道,只看那个图片的很不理解,这个实际抓包对比来看,就会好很多
首部固定部分的字段
1、版本
占4位
IPv4 IPv6
通信双方使用的IP协议的版本必须一致
2、首部长度
占4位
3、区分服务
占8位,用来获得更好地服务
4、总长度
占16位
分片后的每一个分片的首部长度和该分片的数据长度的总和
数据字段最大长度:MTU(最大传送单元,1500字节)
过长必须进行数据报分片处理
IP数据报越短,路由转发速度越快
足够长的IP数据报,可以使传输效率得到提高
5、标识
占16位
作用:根据相同的标识字段把分片后的个数据报片成功重装成原来的数据报
当数据报由于长度超过MTU,必须进行分片时,这个字段就被复制到所有的数据报片的标识字段中。
6、标志
占3位
作用:标志数据报的分片
最低位记MF
MF=1表示后面还有分片的数据报
MF=0表示这已经是若干数据报中的最后一个
中间的一位记为DF--表示不能分片
只有DF=0时才允许分片
7、片偏移
占13位
较长的分组在分片后,某片在原分组中相对位置
相对于数据字段的起点
以8个字节为偏移单位,也就是每个分片的长度一定是8个字节的整数倍
8、生存时间
占8位
TTL:表名数据报在互联网中的寿命
作用:防止无法交付的数据报无限制的再互联网中兜圈子,减少网络资源浪费
单位:跳数。当TTL为0时丢弃数据报
9、协议
占8位
作用:指出数据报携带的数据是使用何种协议
以便使目的主机的IP层知道应将数据报部分上交给哪个协议处理
10、首部检验和
占16位
作用:只检验数据报的首部
11、源地址
占32位
12、目标地址
占32位
IP数据报首部的可变部分
选项字段用来支持排错、测量以及安全等措施
IP层转发分组👨🏫
路由表指出到某个网络应该如何转发,每个路由器的路由表则只包含网络数量
分组转发算法
从数据报的首部提取目的主机的IP地址D,得出目的网络地址N
若N就是与此路由器直接相连的某个网络地址,则直接交付(直接把数据报交付给目的主机,包括目的主机地址D转换为具体的硬件地址,把数据报封装成MAC帧,再发送此帧),否则间接交付,否则转发分组出错
间接交付(按顺序执行)
若路由表中有目的地址D的特定主机路由,则把数据报传送给路由表中所指明的下一跳路由器
若路由表中有到达网络N的路由,则把数据报传送给路由表中所指明的路由器
若路由表中有一个默认路由,则把数据报传送给路由表中所指明的默认路由器
默认路由
减少路由表所占用的空间和搜索路由表所用的时间
二、划分子网和构造超网🐕🦺
1、两级地址的缺点🤧
IP地址空间利用率有时很低
给每一个物理网络分配一个网络号会使得路由表变得太大而使网络性能变坏
每一个路由器都应当能够从路由表中查出怎样到达其他网络的下一跳路由器
因此随着网络数增多,路由器的路由表的项目数也就越多,导致项目数过多,增加成本,浪费时间,性能下降
不够灵活
不能灵活的增加单位的网络,则不必事先到机构申请网络号,两级地址无法做到
2、划分子网😕
在IP地址中增加了一个子网号字段,使两级IP变为三级IP地址
1、基本思路
一个拥有许多物理网络的单位,可将所属的物理网络划分为若干个子网(内部操作,外部看不出区别,仍表示一个网络)
将主机号借用若干位作为子网号
划分子网后,IP地址由两级结构变成了三级结构,只是对主机号这部分进行划分,而不改变原来的网络号
格式:IP地址 :: = {<网络号>,<子网号>,<主机号>}
2、子网掩码👨🏫
解决:IP数据报的首部无法看出源主机或目的主机所连接的网络是否进行了子网的划分
网络号和子网号:全部变成1
主机号:为0
IP地址转换成子网的网络地址:通过IP地址和子网掩码逐位相与
与操作:同1则1,其他为0
路由器在和相邻路由器交换路由的时候,必须把自己所在网络的子网掩码告诉相邻路由器
默认子网掩码
在不划分子网时,仍然使用子网编码:则会使用默认子网编码,为了更方便查找路由表
3、子网分组转发
路由表必须包含:目的网络地址、子网掩码、下一跳地址
路由器转发分组算法
收到数据报的首部提取目的IP地址D
先判断是否直接交付
对路由器直接相连的网络逐个进行检查
用各网络的子网掩码和D逐位相与,看结果是否和相应的网络地址匹配
若匹配,则直接交付
否则,间接交付
间接交付(按顺序执行)
若路由表中存在着目的地址为D的特定主机路由,则把数据报传送给路由表中所指明的下一跳路由器,否则
对路由表中的每一行,用其中的子网掩码和D逐位相与,结果为N
若N和目的网络地址匹配,传给下一跳路由器,否则
若路由表中有一个默认路由,把数据报传给路由表中所指明的默认路由器;否则。执行报告转发分组出错
3、无分类编址CIDR(构建超网)😵
为了可以提供更多的ip地址,于是有了CIDR(无分类域间路由选择)
CIDR把32位的IP地址划分为前后两个部分
前面部分是网络前缀,用来指明网络
后面部分用来指明主机
因此又变回了两级编址,无分类的两级编址
IP地址 :: = {<网络前缀>,<主机号>}
CIDR使用斜线记法或称为CIDR记法,即在IP地址后面加上斜线/,然后写上网络前缀所占的位数
特点:
1、消除了传统的A类、B类、C类地址以及划分子网的概念,可更加有效的分配IPV4的地址空间,并且在IPV6使用之前容许互联网规模继续增长。
2、CIDR把网络前缀相同的连续IP地址组成一个CIDR记块
地址掩码:由一串1和一串0组成,而1的个数就是网络前缀的长度
斜线记法中,斜线后面的数字就是地址掩码中1的个数
1、最长前缀匹配
由于路由表中的每个项目由网络前缀和下一跳组成,会导致在查找路由表时可能会得到不止一个匹配结果,这个时候有个问题 -- 如何选择路由
答:应从匹配结果中选择具有最长网络前缀的路由,这就是最长前缀匹配
2、使用二叉线索查找路由表
4、网际控制报文协议ICMP😭
作用:更有效地转发IP数据报和提高交付成功的机会
ICMP报文:作为IP层数据报的数据,加上数据报的首部,组成IP数据报发送出去
1、报文种类
ICMP差错报告报文
四种报文类型
格式:ICMP前8个字节+数据字段
数据字段:收到的差错报告的IP数据报的首部和数据字段的前8个字节提取出来
1、终点不可达
当路由器或主机不能交付数据报时就向源点发送终点不可达报文
2、时间超过
当路由器收到生存时间为0的数据报时,除丢弃该数据报外,还要向源点发送时间超过报文
3、参数问题
当路由器或目的主机收到的数据报的首部中有的字段不正确时,即丢弃该数据报,并向源点发送参数问题报文
4、改变路由(重定向)
路由器把改变路由报文发送给主机,让主机知道下次应将数据报发送给另外的路由器
不发送ICMP差错报告报文
对ICMP差错报告报文,不再发送
对第一个分片数据报片的所有后序数据报片,不再发送
对具有多播地址的数据报,不再发送
对具有特殊地址(如127.0.0.0)的数据报,不再发送
ICMP询问报文
两种类型
1、回送请求和回答
作用:用来测试目的站是否可达以及了解其有关状态
回送请求报文是由主机或路由器向一个特定的目的主机发出的询问
收到此报文的主机必须给源主机或路由器发送ICMP会送回答报文
2、时间戳请求和回答
作用:用于时钟同步和时间测量
ICMP时间戳请求报文是请某台主机或路由器回答当前的日期和时间
2、实际应用
分组网间探测ping,用来测试两台主机的连通性。
PING是应用层直接使用网络层ICMP的例子,不通过传输层
5、路由器选择协议🤯
1、理想的路由算法
算法必须是正确和完整的
正确的含义:沿着各路由表所指引的路由,分组一定能够最终到达目的网络和目的主机
算法在计算上应简单
路由选择的计算不应使网络通信量增加太多的额外开销
算法应能适应通信量和网络拓扑的变化
要有自适应性,当网络中的通信量发生变化时,算法能自适应地改变路由以均衡各链路的负载。
当某个节点、链路发生故障不能工作,或者修理好了再投入运行时,算法能及时改变路由。
算法应具有稳定性
在网络通信量和网络拓扑相对稳定的情况下,路由算法应收敛于一个可以接受的解,不应使得出的路由不停地变化
算法应是最佳的
路由选择算法应当能找出最好的路由,使得分组平均时延最小而网络的吞吐量最大
算法应是公平的
路由选择算法应对所有用户都是平等的
2、分层次的路由选择协议
分为两大类
内部网关协议IGP
外部网关协议EGP
AS之间的路由选择叫域间路由选择,而在AS内部的路由选择叫域内路由选择
内部网关协议IGP
即在一个自治系统(AS)内部使用的路由器选择协议。
如RIP和OSPF
内部网关协议 RIP
是一种分布式的基于距离向量的路由选择协议
要求网络中的每一个路由器都要维护从它自己到其他每一个目的网络的距离记录
适用于:小型互联网,最多只包含15个路由器 (16则为不可达)
优点:实现简单,开销小
缺点:网络出故障的传播时间往往需要很长的时间;限制了网络规模;
RIP的特点
仅和相邻的路由器交换信息 -- 如果两个路由器之间的通信不需要经过另一个路由器,那么这两个路由器就是相邻的。RIP协议规定,不相邻的路由器不交换信息
路由器交换的信息是当前本路由器所知道的全部信息,即自己现在的路由表 -- 交换的信息是:我到本AS中所有网络的距离,以及到每个网络应经过的下一跳路由器
按固定的时间间隔交换路由信息 -- 每隔30秒,路由器根据收到的路由信息更新路由表
可以收敛并且过程较快 -- 收敛:就是在AS中所有的结点都得到正确的路由选择信息的过程
距离向量算法
路由表中最重要的信息:到某个网络的最短距离,以及下一跳的地址
路由表更新的原则是找出到每个目的网络的最短距离,这种更新算法又叫距离向量算法
此处省略5000字
RIP协议的报文格式
首部
占4个字节,命令字段指出报文的意义
路由部分
由若干个路由信息组成
RIP的问题
当网络出现故障时,要经过比较长的时间才能将此信息传送到所有的路由器
好消息传播快,坏消息传播慢
内部网关协议OSPF
开放最短路径优先OSPF,使用了Dijkstra提出的最短路径算法SPF
优点:更新过程收敛的快(链路状态数据库能较快地进行更新,使各个路由器能及时更新其路由表)
特点
使用分布式的链路状态协议(而不是RIP那样的距离向量协议)
向本AS中所有路由器发送信息,使用的是洪泛法 (RIP仅仅向相邻的几个路由器发送信息)
这就是路由器通过所有输出端口向所有相邻的路由器发送信息
而每一个相邻路由器又再将此信息发往其所有的相邻路由器
最终,整个区域中所有的路由器都得到了这个信息的一个副本
发送的信息就是与本路由器相邻的所有路由器的链路状态,但这只是路由器知道的部分信息
只有当链路状态发生变化时,路由器才向所有路由器洪泛法发送此信息(而不像RIP那样,无论网络拓扑是否有变化,路由器之间都要定期交换路由表的信息)
OSPF特点👨🏫
为了能够适用于规模大的网络,OSPF将一个AS再划分为若干个更小的范围,叫做区域
划分区域的好处
减少整个网络上的通信量:利用洪泛法交换链路状态信息的范围局限于每一个区域而不是整个AS
在一个区域内部的路由器,只知道本区域的完整网络拓扑,而不知道其他区域的网络拓扑的情况
OSPF使用层次结构的区域划分 -- 使每一个区域和其他区域进行通信
主干区域:在上层的区域
规定标识符:0.0.0.0
作用:用来连通其他在下层的区域,从其他区域来的信息都由区域边界路由器(R3、R4、R7)进行概括
主干路由器
在主干区域内的路由器(R3、R4、R5、R6、R7)
自治系统边界路由器
专门和本AS外的其他AS交换路由信息(R6)
OSPF不用UDP而是直接用IP数据报传送 -- OSPF构成的数据包很短,可以减少路由信息的通信量,并且可以不用分片传送,减少重传
OSPF允许管理员给每条路由指派不同的代价 -- OSPF对于不同类型的业务可计算出不同的路由
多路径间的负载平衡:如果到同一目的网络有多条代价相同的路径,那么可以将通信量分配给这几条路径
所有在OSPF路由器之间交换的分组都具有鉴别功能,保证了仅在可信赖的路由器之间交换链路状态信息
OSPF支持可变长度的子网划分和CIDR
OSPF的数据格式
OSPF的五种分组类型
-
类型1,问候分组:用来发现和维持邻站的可达性
-
类型2,数据库描述分组:想邻站给出自己的链路状态数据库中的所有链路状态项目的摘要信息
-
类型3,链路状态请求分组:向对方请求发送某些链路状态项目的详细信息
-
类型4,链路状态更新分组:用洪泛法对全网更新链路状态
-
类型5,链路状态确认分组:对于链路更新分组的确认
外部网关协议BGP
源主机和目的主机处在不同的AS中,当数据报传到一个AS的边界时,就需要使用一种协议将路由选择信息传到另一个AS中。
3、路由器的结构
具有多个输入输出端口的专用计算机,任务是转发分组
从路由器的某个输入端口收到分组,按照分组要去的目的地,把该分组从路由器的某个合适的输出端口转发给下一跳路由器,以此反复,直到到终点
网络层的主要工作:路由器的转发分组
路由器两大结构
路由选择
路由选择部分也叫作控制部分,核心构件是路由选择处理机
路由选择处理机的任务是根据所选定的路由选择协议构造出路由表,同时经常或定期和相邻路由器交换路由信息而不断地更新和维护路由表
分组转发
三部分组成:交换结构、一组输入端口和一组输出端口
转发:仅仅涉及一个路由器;路由器根据转发表把收到的IP数据报从路由器合适的端口转发出去
路由选择:涉及多个路由器,路由表是徐多路由器协同工作的结果
三、IPv6🐕
1、IPv6的主要变化🥳
更大的地址空间
把IPv4的地址32位扩大到128位,使地址空间增大了2的96次方倍
扩展的地址层次结构
由于地址空间很大,可以划分为更多的层次
灵活的首部格式
定义了许多可选的扩展首部,不仅可提供比IPv4更多的功能,还可以提高路由器的处理效率(路由器对扩展首部不进行处理)
改进的选项
允许数据报包含有选项的控制信息,因而可以包含一些新的选项
允许协议继续扩充
支持即插即用
支持资源的预分配
支持实时视像等要求保证一定的带宽和时延的应用
IPv6首部改为8字节对齐
2、IPv6的数据报格式😇
数据报由基本首部和有效载荷组成
和IPv4的对比 首部字段的更改
取消了首部长度字段,改为固定40字节
取消了服务类型字段,改为优先级和流标号字段
取消了总长度字段,改为有效载荷长度字段
取消了标识、标志和片偏移字段,改为包含在分片扩展首部中
取消了TTL字段,改为跳数限制字段
取消了协议字段,改用下一个首部字段
取消了检验和字段,加快了路由器处理数据报的速度
取消了选项字段,改为用扩展首部
IPv6首部各字段的作用
版本:4位
作用:指明了协议的版本 ipv6该字段为6
通信量类:8位
作用:区分不同的IPv6数据报的类别或优先级
流标号:20位
有效载荷长度:16位
作用:指明IPv6数据报除基本首部以外的字节数。该字段最大值是64kb
下一个首部:8位
作用:相当于IPv4的协议字段或可选字段
跳数限制:8位
作用:用来防止数据在网路中无限期地存在
源点在每个数据报发出时即设定跳数限制,没经过一个路由器就-1,为0则丢弃
源地址:128位
作用:数据报的发送端的IP地址
目的地址:128位
作用:数据报接收端的IP地址
扩展首部
IPv4的格式 -- 可以对比看看改变
3、IPv6的地址🤓
三种基本类型
单播:点对点通信
多播:一点对多点的通信
任播:新增类型,重点是一组计算机,一般交付给距离最近的那一个
冒号十六进制记法:把每个16位的值用十六进制表示,各值之间用冒号分割
零压缩:即一连串的0可以为一对冒号所取代
常见的地址分类
未指明地址:16字节的全0地址,可缩写为:: 这个地址不能用作目的地址,只能为某台主机党源地址使用
环回地址: ::1和IPV4一个作用
多播地址:和IPv4一致
本地链路单播地址:FE80::/10
全球单播地址:除上述外所有其他二进制前缀
IPv4向IPv6过渡
两种过渡策略
双协议栈
使一部分主机或路由器装有双协议栈(IPv4和IPv6),通过DNS查询返回的结果是IPv4的地址还是IPv6的地址进行选择
隧道技术
当IPv6数据要进入IPv4的网络时,把IPv6的数据报封装成为IPv4的数据报
4、IP多播🥴
一个源点发送到许多个终点,一对多通信
如:实时信息的交付、软件更新、交互会议等
多播路由器:能运行多播协议的路由器
IP多播传送的分组需要使用多播IP地址
多播地址只能用于目的地址,而不能用于源地址
一图胜千言
网际组管理协议IGMP
使连接在本地局域网上的多播路由器知道本局域网上是否有主机的某个进程参加或退出了某个多播组
IGMP的两个阶段
第一阶段
加入多播组 -- 当某台主机加入新的多播组时
声明自己成为组员 -- 该主机向多播组的多播地址发送一个IGMP报文
本地收到- - 本地多播路由器收到IGMP报文后
转发给别人 -- 利用多播路由选择协议把这种组成员关系转发给互联网上的其他多播路由器
第二阶段
组成员关系是动态的
本地多播路由器要周期性的探询本地局域网上的主机-- 以便确认这些主机是否还是该组的成员
只要一台主机对某个组响应,多播路由器就认为该组时活跃的
如果几次探询后没有主机响应的话,多播路由器就认为本网络上的主机都已经离开了这个组,不再把这个组的成员关系转发给其他的多播路由器
IGMP的网络开销控制
在主机和多播路由器之间的所有通信都是使用IP多播
多播路由器在探询成员关系时,只需要对所有的组发送一个请求信息的询问报文
当同一个网络上连接多个路由器时,能够迅速有效的选择其中的一个来探询主机的成员关系,因此多个多播路由器不会引起IGMP通信量的增大
IGMP的询问报文中有一个最长的响应时间N,最小时延的响应最先发送
同一个组内的每一台主机都要监听响应,只要有本组的其他主机先发送了显影,自己就可以不用发送,抑制了不必要的通信量
多播路由选择协议
实际上就是要找出以源主机为根节点的多播转发树
三种方法
它简略的原因很简单,我不会
洪泛和剪除
隧道技术
基于核心的发现技术
5、虚拟专用网VPN和网络地址转换NAT🥱
专用互联网:采用专用IP地址的互连网络
专用ip地址(可重用地址)
10.0.0.0到10.255.255.255(或标记为10.0.0/8 又称为24位块)
172.16.0.0到172.31.255.255 (或记为172.16.0.0/12 又称为20位块)
192.168.0.0到192.168.255.255(或标记为192.168.0.0/16 又称为16位块)
VPN(虚拟专用网):利用公用的互联网作为本机构各专用之间的通信载体,这种网络是为本机构的主机用于机构内部的通信,而不是用于和网络外非本机构的主机通信
MPLS
多协议标记交换
不会!字太多!不看!
运输层😿![](https://i-blog.csdnimg.cn/blog_migrate/8782b98ca96d9d195e52a653eb8d9e89.png)
网络层:ip协议将分组送往目的主机,但是分组停留在主机的网络层中,没有交付主机的应用进程,为主机只见提供逻辑通信
运输层:为应用进程之间提供端到端的逻辑通信,向高层用户屏蔽了下面网络核心的细节,它使应用进程看见的就是好像在两个运输层实体之间一条端到端的逻辑通信信道
两个主要协议
UDP(用户数据报协议)
- 传输数据前不需要先建立连接,不可靠交付
TCP(传输控制协议)
- 提供面向连接的服务,在传送数据前必须先建立连接,数据传送结束后,释放连接,可靠交付
数据单位:TPDU(运输协议数据单元)
TCP协议:TCP报文段
UDP协议:UDP用户数据报
作用:向它上面的应用层提供通信服务
通信的实质:两台主机的通信是应用进程之间的通信
重要功能
复用:发送方不同的应用进程都可以使用同一个运输层协议传送数据(应用层所有的应用进程都可以通过传输层再送到IP层)
分用:接收方的运输层在剥去报文首部后能够把数据正确交付目的应用进程(运输层从IP层收到发送给各应用进程的数据后,必须分别交付给指明的各应用进程)
基于TCP、UDP的应用层协议
协议端口号:软件端口是应用层的各种协议进程与运输实体进程层间交互的一种地址,分为两大类
一类是服务器端使用的端口号
- 熟知端口号:如FTP:21、TELNET:23、SMTP:25、DNS:53、TFTP:69、HTTP:80、HTTPS:443、SNMP:161
一类是客户端使用的端口号:数值为49152~65532,又叫短暂端口号(因为这类端口号仅在客户进程运行时才动态选择)
一、UPD用户数据报协议🙈
无连接,发送数据前不需要建立连接,减少了开销和发送数据之前的时延
尽最大努力交付,不保证可靠交付,主机不需要维持复杂的连接状态表
面向报文:发送方应用程序交下来的报文,添加首部后直接交付给IP层
报文太长:IP层要进行分片,降低IP层效率
报文太短:IP数据报的首部相对过大,降低效率
没有拥塞控制:网络出现拥塞,不会使源主机发送速率降低,保证实时性
支持一对一、一对多、多对一、多对多的交互通信
首部开销小:占8字节(TCP20字节)
UDP的首部格式
伪首部
- 为了协助计算检验和的临时添加的,不向上递交、不向下传送
源端口
- 源端口号,在需要对方回信时选用
目的端口
- 目的端口,在终点交付报文时必须使用
长度
- 用户数据报的长度
检验和
- 检测UDP用户数据报在传输中是否有错
二、TCP传输控制协议🙉
主要特点
1、面向连接的传输层协议
应用进程在使用TCP之前,必须先建立TCP连接;
在传输后,必须释放建立的TCP连接
2、TCP只能连接两个端点
每一条TCP连接只能是点对点的
3、提供可靠交付
TCP传送的数据,无差错、不丢失、不重复并且按序到达
4、提供全双工通信
允许通信双方的应用进程在任何时候都能发送数据。
两方都设有发送缓存和接收缓存,用来临时存放双向通信的数据,随用随取
5、面向字节流
流:流入到进程或从进程流出的字节序列
应用进程和TCP交互是一次一个数据块
定义:TCP把应用进程交下来的数据看成一连串的无结构字节流,TCP不知道传送的字节流的含义
TCP无法保证数据块具有对应的大小关系,但收发双方的字节流必须完全一样
6、TCP的连接
TCP连接的端点叫做套接字或插口
套接字:端口号拼接到IP地址
- 套接字(socket)= (IP地址:端口号)
每一条TCP连接唯一地被通信两端的两个端点所确定
- TCP连接::={socket1,socket2}={(IP1:prot1),(IP2:port2)}
同一个IP地址可以有多个不同的TCP连接,而同一个端口号也可以出现在多个不同的TCP连接中
三、可靠传输的工作原理🙊
理想的传输条件的特点
传输信道不产生差错
不管发送发以多快的速度发送数据,接收方总是来得及处理收到的数据
1、停止等待协议👨🏼✈️
无差错情况
A发送M1--暂停发送等待B确认
B收到M1--向A发送确认
A收到确认--发送下一个分组M2
有差错情况
A发送M1--暂停发送等待B确认
B收到M1--检测出错,丢弃
A长时间没有收到确认--超时重传(每次发送完分组都会设置超时计时器)
如果在计时器到期之前收到确认--撤销计时器
没收到--重新发送
A收到确认--发送下一个分组M2
超时重传
三个注意点
发送方每发送一个后,必须暂时保留已发送的分组的副本,只有在收到相应的确认后才清楚暂时的保留的分组副本 --为了在超时重传时使用
分组和确认分组都必须进行编号,为了明确是哪一个发出去的分组收到确认,哪一个分组没有收到确认
超时计时器设置的重传时间应当比数据在分组传输的平均往返时间更长一些
太长:降低效率
太短:引发不必要的重传,浪费资源
确认丢失和确认迟到
发送方向接收方发送M1分组
情况一--确认丢失
接收方收到了分组,并发送了确认
但是,确认丢了没有传到发送方
于是,A超时发送重传了
此时,接收方收到了重复的分组M1,不再进行向上交付,而是丢弃
重新向发送方发送确认
情况二--确认迟到
接受方接到了分组,并发送了确认
但是,它磨磨蹭蹭的,超过了发送方超时计时器定的时间
于是,发送方又发送了,接收方也重新确认了,接收方又丢弃重复分组
此时,发送方接到重复的,于是就没有于是了,直接丢了
信道利用率
采用流水线传输,就可以获得更高的信道利用率
流水线传输:可以连续发送多个分组,不必每发完一个分组就停顿下来等待对方确认,提高了传输效率,获得更高的信道利用率
流水线传输需要使用连续ARQ协议和滑动窗口协议
2、连续ARQ协议 👩🏻✈️
定义:位于窗口内的五个分组都可连续发送出去,不需要等待确认
每发送一个,滑动窗口就向前滑动一个分组的位置
优点:容易实现,即便确认丢失也不必重传
缺点:不能向发送方反映出接收方已经正确收到的所有分组的信息,也就是意味着如果中间分组发生了丢失,那么后面的所有分组都需要进行重传,这叫Go-back-N
四、TCP报文段的首部格式👨🏻💻
1、源端口和目的端口
各占2个字节
分别写入源端口号和目标端口号
2、序号
占4字节
起始序号必须在连接建立时设置
TCP是面向字节流的,传送的字节流中的每一个字节都按顺序编号
3、确认号
占4字节
期望收到对方下一个报文段的第一个数据字节的序号
若确认号=N,则表明:到序号N-1为止的所有数据都已经正确收到
4、数据偏移
占4位
指出TCP报文段的数据起始处距离TCP报文段的起始处有多远
5、保留
占6位
目前为0
6、紧急URG
URG=1时,表明紧急指针字段有效
URG=1时
发送的应用进程告诉发送方的TCP有紧急数据要传送
发送方TCP把紧急数据插入到本报文段数据的最前面
7、确认ACK
ACK=1时有效
ACK=0时无效
连接建立后所有传送的报文必须把AKC置1
8、推送PSH
在两个进程进行交互式通信时,有时在一端的应用进程希望在键入一个命令后立即收到对方的响应
操作
发送方TCP把PSH置1,并立即创建一个报文段发送出去
接收方TCP收到PSH=1的报文段,就尽快地交付接收应用进程,而不需要等到缓存填满再交付
9、复位RST
当RST=1时,表明TCP连接中出现严重差错,必须释放连接,然后重新建立运输连接RST置1还用来拒绝一个非法的报文段或拒绝打开一个连接
10、同步SYN
连接建立时用来同步序号
SYN=1,ACK=0时,表明是一个连续请求报文段
若对方同意建立连接,则应在响应报文段中使SYN=1和ACK=1
11、终止FIN
用来释放一个连接
当FIN=1时,表明此报文段的发送方的数据已发送完毕,并要求释放运输连接
12、窗口
占2字节
窗口:指的是发送本报文段的一方的接收窗口
窗口字段明确的指出了现在允许对方发送的数据量,窗口值经常在动态变化着
窗口值作为接收方让发送方设置其发送窗口的依据
13、检验和
占2字节
检验和字段检验的范围包括首部和数据这两部分
14、紧急指针
15、选项
抓包实例
五、TCP可靠传输的实现👩🏻🚀
1、以字节为单位的滑动窗口🦸🏼♂️
发送窗口
表示:在没有收到B的确认的情况下,A可以连续的把窗口内的数据都发送出去(已发送的数据在未收到确认之前都必须暂时保留,以便超时重传使用)
窗口越大,发送方在未收到确认前可连续发送更多的数据,有更高的传输效率
窗口中的序号:表示允许发送的序号
发送窗口的位置:由前沿(P3)和后沿(P1)的位置共同决定的。可以发生前移和不同,但是不能向后移动。
描述窗口状态的三个指针
小于P1:代表后沿位置,意味着已发送并收到确认的部分,数据进行删除
大于P3: 代表前沿位置,意味着不允许发送的位置
P3 - P1:代表着A的发送窗口
P2 - P1:代表着已发送但未收到的字节数
P3 - P2:代表着有效窗口,意味着允许发送单当前尚未发送的字节数
接收窗口
发送窗口不应该大于接收窗口,发送窗口的大小是根据接收窗口设置的
接收窗口只能对按序列收到的数据中心的最高序号给出确认【(接收窗口的序号(31~50是可接收的)】也就是意味着:如果31丢失,32、33即便收到了,也不能发送确认,确认号只能是31),如果收到没有按序到达的数据,将会暂存在接收窗口内部
TCP缓存和窗口的关系
发送方的应用进程把字节流写入TCP的发送缓存
接收方的应用进程从TCP的接收缓存中读取字节流
须知
缓存空间和序号空间都是有限的,并且都是循环使用的
由于实际的缓存或窗口中的字节数是非常大的,所以a图没有标出具体值
发送方
发送缓存用来暂时存放
发送应用程序传送给发送方TCP准备发送的数据
TCP已发送出单尚未收到确认的数据
接收方
接收缓存用来暂时存放
按序到达的、但尚未被接收应用程序读取的数据
未按序到达的数据
s总结
发送窗口的大小并不总是和接收窗口一样大(可能发生阻塞)
对乱序到达的数据如何处理?无标准规定,通常是:临时存放在接受窗口中,等到字节流所缺少的字节收到后,再按序交付上层的应用进程
TCP要求接收方必须有累计确认功能,可以减小传输开销
2、超时重传的选择🦸♀️
自适应算法(Karn):报文段每重传一次,就把RTO增大一些(典型做法是增大2倍),当不再发生报文段的重传时,才根据 RTO = RTTs+ 4×RTTD
RTT:报文段的往返时间
RTTs:加权平均往返时间
RTO:超时重传时间
RTTD:偏差的加权平均值
具体算法请参考计网.pdf225页
3、选择确认SACK🦹🏿
如果字节序号都在接收窗口内,但是序号不连续
接受方收下了这些数据,但要把这些信息准确地告诉发送方,使发送方
六、TCP流量控制🧛🏻♂️
是指点对点通信量的控制,端到端的问题
1、利用滑动窗口实现🧙♂️
让发送方的发送速率不要太快,要让接收方来得及接收
这是一个伤心且常见的故事 -- A要给B发送数据
在连接开始,B对A说:我的接收窗口(rwnd)大小是400,你的发送窗口不能比它大
之后A开始发送数据了,发着发着丢了seq201~300的数据
B只接受到300的字节,但是想自己的rwnd是400,想我怎么比他大了,于是调节成rwnd=300
A继续发送数据
B继续进行流量控制 rwnd =100
等到rnwd = 0 A则不继续进行发送
在rnwd=0时,进入零窗口报文段,A需要等待B发送rnwd=400的报文段,如果A没收到,B也没收到确认,就会陷入死锁,为了解决所以使用以下的办法
TCP为每一个连接设有一个持续计时器,只要TCP连接的一方收到对方的零窗口通知,就启动持续计数器。若持续计数器设置的时间到期,就发送一个零窗口探测报文段,对方在确认报文段时会给出现在的窗口值,如果仍是0,则更新持续计数器,否则则 解决了死锁问题。
2、TCP的传输效率👨🏿🍼
如何控制TCP发送报文段的时机
TCP中广泛使用Nagle算法
若发送应用进程把要发送的数据逐个字节地送到TCP的发送缓存
- 则发送方就把第一个数据字节先发送出去,把后面到达的数据字节都缓存起来
当发送方收到对第一个数据字符的确认后
- 再把发送缓存中的所有数据组装成一个报文段发送出去,同时继续对随后到达的数据进行缓存
七、TCP拥塞控制⛹🏻♀️
全局性过程
拥塞:对资源的需求>可用资源
拥塞控制:防止过多的数据注入到网络中,可以使网络中的路由器或链路不致过载
拥塞控制的前提:网络能够承受现有的网络符合
发送窗口的上限值取决于接收方窗口(rwnd)和拥塞窗口(cwnd)较小的一个
1、拥塞控制的原理🤸🏻♂️
拥塞:对网络中某一资源的需求超过了该资源所提供的可用,网络性能就变坏
拥塞控制:就是防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。
拥塞控制是一个全局性的过程,涉及到所有的主机、所有的路由器、以及与降低网络传输性能有关的因素
开环控制:在设计网络时事先将有关发生拥塞的因素考虑周到
闭环控制:基于反馈环路的概念
监测网络系统以便检测到拥塞在何时。何处发生
把拥塞发生的信息传送到可采取行动的地方
调整网络系统的运行以解决出现的问题
2、拥塞控制方法👨🏻🏫
四种算法
慢开始、拥塞避免、快重传、快恢复
拥塞控制也叫做基于窗口的拥塞控制
发送拥塞窗口的原则:只要网络没有出现拥塞,拥塞窗口就可以再增大一些,以便发送更多的窗口,提高网络利用率,但是只要网络出现拥塞或有可能出现拥塞,就必须减小拥塞窗口,以减少注入到网络中的分组数,缓解可能出现的拥塞
如何知道网络拥塞:判断网络拥塞的依据就是出现了超时
慢开始
一开始发送数据时,不知道网络的负荷情况,如果大量数据字节注入到网络,就会拥塞
所以最好的方法是:由小到大逐渐增大发送窗口,也就是由小到大逐渐增大拥塞窗口的数值
慢开始并不代表增长速率慢,而是一开始的cwnd=1
具体过程
先初始化cwnd(拥塞窗口)设置为不超过2至4个SMSS(发送方的最大报文段)
若SMSS > 2190字节
- 设置cwnd=2*SMSS字节,且不得超过2个报文段
若2190 >= SMSS > 1095字节
- 设置cwnd=3*SMSS字节,且不超过3个报文段
若SMSS <= 1095字节
- 设置cwnd=4*SMSS字节,且不超过4个报文段
每经过一个传输轮次,cwnd就加倍
- 传输轮次:一个传输轮次的时间就是往返时间RTT
实际过程中,发送方只要收到一个对新报文段的确认,cwnd就立即加1,并且可以立即发送新的报文段,不需要等待这个轮次的所有的确认都收到后再发送新的报文段
存在的问题
由慢开始cwnd加倍增长可以发现,后期会由于cwnd太大引起网络阻塞,所以需要一个慢开始门限ssthresh状态变量,进而通过门限判断使用拥塞避免算法
当cwnd < ssthresh时,使用慢开始算法
当cwnd > ssthresh时,停止慢开始,改用拥塞避免算法
当cwnd = ssthresh,二者都可以
拥塞避免
定义:让cwnd缓慢的增大,即没经过一个RTT就把发送方的cwnd加一,而不是成倍增长
特点:加法增大AI,表明在拥塞避免阶段,cwnd按线性规律缓慢增长,比慢开始cwnd增长速率缓慢的多。借此使网络比较不容易出现拥塞,而不是完全避免拥塞
当网络出现超时的时候,发送方会判断为网络拥塞
于是调整ssthresh=cwnd/2
同时设置cwnd=1,进入慢开始阶段
存在的问题
当采用拥塞避免时,遇到超时则采用慢算法
但是如果此时个别报文段丢失(如3-ACK),但实际上并没有发生拥塞,发送方迟迟接不到确认,就会产生超时,就会误认为发生拥塞,导致错误的开启慢启动,降低了传输效率
快重传
作用:可以让发送方尽早知道发生了个别报文段的丢失
前提:要求接收方不要等待自己发送数据时才进行捎带确认,而是立即发送确认,即收到了失序的报文段也要立即发出对已收到的报文段的重复确认
规定:当发送方只要一连收到3个重复确认,就知道接收方没有收到报文段,应立即进行重传,这样就不会出现超时,发送方也不会认为拥塞
快恢复
当接收到3-ACKA时,发送方知道只是丢失了个别报文段,于是不启动慢开始,而是执行快恢复
发送方调整ssthresh = cwnd/2
设置cwnd = ssthresh
执行拥塞避免算法
AIMD算法
加法增大AI:在拥塞避免阶段,拥塞窗口是按照线性规律增大的
乘法减小MD:一旦出现超时或3-ACK,就把ssthresh设置为当前cwnd的一般,并大大减小cwnd的数值
3、AQM主动队列管理🤽🏻♂️
主要是为了解决尾部丢弃策略
路由器的队列通常采用FIFO的规则处理分组,由于队列长度有限,待队列满后,以后在到达的分组都会被丢弃,这样就会导致一连串分组的丢失,发送方出现超时重传,进入慢开始状态,导致TCP传输数据效率大幅降低
八、TCP运输连接管理🐲
运输连接有三个阶段
连接建立
数据传送
连接释放
连接建立要满足三个条件
要使每一方能够确知对方的存在
要允许双方协商一些参数(如窗口最大值、是否使用窗口扩大选项等)
能够对运输实体资源(如缓存大小、连接表中的项目等)进行分配
采用cs方式,主动发起连接建立的应用进程叫做客户端,而被动等待连接建立的应用进程叫服务器
1、TCP的连接建立👨🏫
三报文握手建立连接
握手:TCP建立连接的过程
只建立了一次连接,交换了三个报文,所以叫三报文握手建立连接
客户端的端口随机分配,tcp指定端口80
为什么要发送第三次确认
主要是为了防止已失效的连接请求报文段突然传送到B,浪费资源
具体解释:由于网络原因,A第一次发送的连接请求被滞留在网络中,于是A进行超时重传,B和第二次请求建立连接。但是,A的第一次请求又找到了B,如果不进行第三次判断,那么将会再次建立连接,这样就造成了资源的浪费
为什么不用四次握手
因为效果是一样的,主要是第三次确认
建立连接的过程
未开始的时候,双方皆为CLOSED状态
开始,A主动打开连接,B被动打开连接
B的TCP服务器进程先创建传输控制模块TCP
在打算建立连接时,A向B发出连接请求报文段,首部的SYN=1,选择一个初始序号seq = x,TCP客户端进入SYN-SENTT(同步已发送)状态
B收到连接请求报文段后
同意:则向A发送确认。在确认报文段中应把SYN位和ACK位都置为1,确认号ack = x+1,同时为自己选择一个初始序号seq=y。此时服务器进程进入SYN-RCVD(同步收到)状态
客户端A进程收到B的确认后,还要给B发出确认,确认报文段的ACK置1,确认号ack = y+1,自己的序号seq= x+1,TCP连接已经建立,A进入ESTABLISHED(已建立连接) 状态
B收到A确认后,也进入到ESTABLISHED状态
四次挥手释放连接
释放过程 -- 注意端口变化
第一次里面的Ack是对之前的确认的捎带,第二次挥手和第三次合并了,TCP总是进行数据捎带,TCP总是尽可能的做数据捎带
双方都处于ESTABLISHED状态
A进程向TCP发出连接释放报文段,并停止发送数据,主动关闭TCP连接
- A把连接释放报文段的首部FIN置1,seq=u(等于前面已传送过的数据的最后一个字节的序号+1),**A进入FIN-WAIT-1(终止等待1)**状态,等待B确认
![]()
B收到连接释放报文段后即发出确认,确认号是ack=u+1,这个报文段自己的序号是v,B进入CLOSE-WAIT状态TCP服务器进程向高层应用进程通知,因而从A到B这个方向的连接就释放了,此时处于半关闭状态,B到A的方向没有关闭,可以继续传输数据
A收到确认进入FIN-WAIT2(终止等待2)状态,等待B发出释放连接的释放报文段
如果B没有要发送的数据,则应用进程通知TCP释放连接。此时B发出的连接释放报文段必须使FIN=1。假定B的序号w(半关闭的时候可能又发送了一些数据),B 必须重复上次已经发送过的确认号ack=u+1,B进入LAST-ACK(最后确认状态),等待A的确认
A收到B的连接释放报文段后,必须对此发出确认。在确认中报文段ACK置1,确认号ack=w+1,自己的seq=u+1,进入TIME-WAIT状态,此时TCP连接并未释放掉,必须经过时间等待计时器设置时间2MSL后,A才进入CLOSED状态
MSL:最长报文段寿命
为什么要等待2MSL时间
第一:保证A发送的最后一个ACK段可以到达B,因为它可能丢失,如果B接收不到确认,会超时重传FIN-SAK报文段,这样A就能在2MSL时间内收到重传的报文段,之后A重传,重新启动2MSL计时器,最后AB都进入CLOSE状态。如果不这么做,B 可能永远不会进入CLOSED状态
第二:防止已失效的连接请求报文段出现在本连接中,2MSL时间内足够使本连接持续时间内所产生的报文段都从网络消失,这样下一个新的就不会出现旧的连接请求报文段
保活计数器:服务器每收到一次客户的数据,就重新设置保活计数器,超时则断开连接,防止客户端突然出现故障,造成的资源浪费