这篇文章是我在读完《计算机网络》-谢希仁 (第五版)后的总结提炼,如果有错误希望大家能帮我提出来。
文章目录
一:概述
1.1:网络/互联网/英特网概念
网络:由若干个节点和连接这些节点的链路组成。(节点可以是计算机/集线器/交换机/路由器等)。
互联网(internet):网络的网络-网络可以由路由器互联起来构成互联网。
英特网(Internet):最大的互联网。
(internet 前i小写泛指多个网络组成的互联网是通用名词,而I大写则是专有名词)
网络把许多计算机连在一起,英特网则把许多网络连在一起。
1.2:英特网的组成
-
边缘部分:由所有连接在网络上的主机组成,这部分用户直接使用用来进行同信和资源共享。
-
核心部分:由大量的网络和连接这些网络的路由器组成,这部分是为边缘部分提供服务的(提供联通性和交换)。
-
边缘部分的通讯方式:
1:客户服务器模式(C/S)(Client/Server):客户是服务的请求方,服务器是服务的提供方。
2:对等方式(P2P)(peer-to-peer):指两个主机进行通信时并不区别服务的请求方和服务的提供方。
- 核心部分交换技术:
核心部分时为边缘部分大量主机提供连通性,使边缘部分任何一台主机都能和其他主机通信。所以这来说说核心部分的交换技术。
- 1:电路交换:
三个阶段:建立连接(占用通信资源)->同话(占用)->释放连接(释放资源)
特点:
1):通话期间通话双方始终占用端到端的通信资源
2):线路的传输效率低(因为计算机的数据总是突发式出现在传输线路上,因此真正用在数据传输上的时间不多。例如:用户正在阅读屏幕上的信息,宝贵的资源未被释放而浪费。)
3):适用于连续大批量的数据传输。
- 2:报文交换:
报文:我们常把需要发送的一整块数称为报文
时延:指数据从网络的一段到另一端所需的时间。
有发送时延(主机或者路由器发送数据帧所需要的时间=帧长/信道带宽)
传播时延:
处理时延和排队时延
登记表中进行登记,等待报文前往的目的地址的路径空闲再转发出去。
优点:线路利用率高;信道可为多个报文共享;接收端和发送端无需同时工作,在接收方“忙”时,报文可以暂存交换设备处;可同时向多个目的站点发送同一报文;能实现差错控制和纠错处理;
缺点:信息延迟长,从发送到接收之间的延迟为1分钟或更长,因此,不适用于实时通信或交互通信,也不适用于交互式的“终端-*主机”连接。
- 3:分组交换
分组交换也是采用存储转发技术,只不过前面说报文交换信息延迟长所这里将一个报文划分成多个分组。
在每个数据前面加上必要的首部(首部含有地址,分组编号等控制信息)构成分组。这样的分组也称为包,所以分组交换也叫包交换。
优点:
缺点:
1:分组在各个路由器转发时需要排队所以会造成时延。
2:无法保证端到端所需的带宽。因为分组交换不像电路交换那样需要建立连接。
3:因为每个分组都有首部,所以造成了额外的开销。
这里补充以下主机和路由器都是计算机,主机需要进行信息处理并向网络发送分组。而路由器进行存贮转发,把分组交付目的主机。
1.3网络的分类
最普遍的是按地理范围(广域网,城域网,局域网)
按传输介质(双绞线,同轴电缆,光纤,无线网)
使用网络的对象(公用网,专用网)
按网络传输技术 (广播式,点到点式)
按传输速度(低速网络和高速网络)
按逻辑功能可分为(资源子网和通信子网)
按拓扑结构分(星,环,总线,树,网)
1.4协议与划分层次
就像人类社会一样,计算机网络要做到有条不紊的交换数据,大家就要事先遵循一些约定好的规则。这些数据明确规定了交换数据的格式和同步问题。这些为网络信息交换而指定的规则约定被称为网络协议。
网络协议的三要素:
- 1:语法:数据与控制信息的结构
- 2:语义:发出何种控制信息,完成何种动作与做出何种响应
- 3:同步:时间的实现顺序的详细说明
我们常说的TCP/IP协议分层的协议这我们在说一下协议为什么要分层?
1:各层之间相互独立:各个层不需要知道下一层是如何实现的只需要知道下一层的接口就行。所以->开发简单易于维护->灵活性好
2:促进标准化工作
3:差错控制
4:流量控制
我们把各层协议的集合叫做网络的体系结构
1.4.1五层协议的体系结构
OSI是七层协议,TCP/IP是四层协议。而我看的这本数为了号理解说的是五层协议。
简要介绍五层协议的功能:
1:应用层:最高层,直接为用户进程提供服务
2:运输层:负责向两个主机进程之间通信提供服务
3:网络层:分组交换网络上不同主机提供的交换服务
4:数据链路层:将网络层穿下来的数据包组装成帧,在两个透明的节点上传送
5:物理层:透过的传送比特流
单工:简单的说就是一方只能发信息,另一方则只能收信息,通信是单向的。
半双工:比单工先进一点,就是双方都能发信息,但同一时间则只能一方发信息。
全双工:比半双工再先进一点,就是双方不仅都能发信息,而且能够同时发送。
二:物理层
物理层考虑的是如何各种计算机连接传送比特流。
- 物理层的特性:
1:机械特性:指明接口所用接线器的形状尺寸…
2:电气特性:指明在接口电缆电压范围
3:功能特性:指明某条线上电压范围代表何种意义
4:过程特性:指明不同功能的各种可能事件出现顺序
三:数据链路层:
上面图是数据传输在各层之间流动示意图
现在说数据链路层
数据和数据链路不是一个概念
-
链路:是从一个点到另外一个点的物理线路。
-
数据链路:因为要在一条线路上传输除了需要有一个物理线路,还需要一个通信协议来控制这些数据的传输。把实现这些协议的硬件和软件加到链路上则构成数据链路。
-
帧的概念:
数据链路层的协议数据单元为帧。
数据链路把从网络层传输过来的数据转变为帧传到链路上。以及把接受到的帧传输到网络层。
网络层协议的数据单元为IP数据报,这图片体现下三层数据传输
3.1三个基本问题
- 1:封装成帧
封住成帧就是在数据报的加上首部和尾部构成帧
在物理层由下到上的上交比特流后能通过帧首和帧尾来确定帧的开始和结束。
在网络层由上到下的给予数据报(在英特网上传输数据都是分组(IP数据报))给数据报加上帧首和帧尾就构成帧。
- 2:透明传输
就是说帧头或者帧尾,我们知道物理层传输位比特流,如果数据报中数据和帧头和帧尾相同那么数据报就不能正确传输(提前开始或者结束)
所以可以采用字节填充的方法在帧头或帧尾加上一段特殊字符,传输完接受方接受到在删除。
- 3:错检测
传输比特流时有可能出现比特差错。
可以用循环冗余校验检错技术。
3.2数据链路层协议
- PPP协议
- CSMA/CD协议
- …
这里协议很多本文不做重点讲解
四:网络层
网络层英特网采用的设计思路:网络层向上只提供简单,灵活,无连接,尽最大努力交付的数据报服务。网络在发送分组时不需要事先建立连接,每一个分组(IP数据报)独立发送。
网络层不提供服务质量的承诺。因为不提供端到端的可靠传输服务,这样能使网络的造价大大降低,差错检验/流量控制…放到了主机的运输层。
虚电路与数据报服务的主要区别:
因为TCP/IP提供的时数据报服务,下面展开讲的时网络层如何传送IP数据报。
4.1网际协议
网际协议IP时TCP/IP两个最主要的协议之一。在网络层与IP配套使用的协议还有四个。
- 地址解析协议ARP(Address Resolution Protocol )
- 逆地址解析协议RARP (Reverse Address Resolution Protocol )
- 网际控制报文协议
- 网际组管理协议
4.1.1虚拟互联网络
在了解IP协议之前必须要先了解虚拟互联网络
如果要把世界上的大量的网络连接到一起,并且要实现相互通信,这个事情时困难且复杂的。如果让大家使用相同的网络,这是不可能的,没有一种网络能适应所有用户的需求。
将网路互相连接起来需要一些中间设备:
中间设备是转发器/网桥,这仅仅是把一个网络扩大了,从网络层角度看仍然是一个网络,一般不称为网络互连。网关比较复杂用到的比较少。所以讨论网络互连一般是路由器进行网络互连和路由选择。
TCP/IP进行网络互连方法是在网络层(IP层)采用标准化协议,但相互连接网络则可以是异构的。如下图a所示有许多计算机通过路由器互连,由于互连的计算机都使用同一种网际协议IP。因此可以把互联以后的计算机网络看成虚拟互联网络图b。
虚拟互联网络就是逻辑上互联的网络,因为各个网络客观上存在差异,但是我们利用IP协议就可以使这种性能各异的网络看上去仿佛一个统一的网络。这种虚拟互联网络叫做IP网,使用IP网的好处:在IP网上要进行通信的主机就好像在一个网络上进行通信,看不见不同网络的具体异构细节(如编址方案,路由选择协议等)。
4.1.2分类的IP地址
在虚拟网络上如何寻址?
- 1:IP地址表示方法
整个因特网就是一个单一的,抽象的网络。IP地址就是给每一个主机或者路由器分配一个全世界唯一的32位标识符。
IP地址现在由因特网名字与号码指派公司(ICANN)进行分配
IP地址编址方式经过三个阶段
这里我们现讲分类的IP地址
- 分类的IP地址
分类的IP地址就是讲IP地址将地址划分成若干个固定类。每一类都由两个固定长度的字段组成。第一个字段是网络号,标志这主机或者路由器所连接的网络(一个网络号在英特网里面必须是唯一的)。第二个字段是主机号,标志该主机或者路由器(一个主机号在前面的网络号里面必须是唯一的)。由此可知一个IP地址在整个英特网里面是唯一的。
这些年已经广泛使用无分类的IP地址进行路由选择,分类的IP地址已经成为历史。
4.1.3IP地址与硬件地址区别
物理地址是数据链路层和物理层使用的地址而IP地址是网络层及以上层所使用的地址位逻辑地址(称IP地址位逻辑地址是因为IP地址是通过软件实现的)。
IP地址放在IP数据报的首部,而硬件地址放在MAC帧的首部,在网络层及网络层以上使用的是IP地址,在数据链路层及以下用的是硬件地址。在分装成MAC帧时数据链路层是看不见IP地址的。
1:在IP层抽象互联网只能看见IP数据报
2:路由器只根据目的IP地址进行路由选择
3:在局域网的链路层中只能看见MAC帧,IP数据报被封装在MAC帧中
4:MAC帧在不同网络中传送时其源地址和目的地址也会变化
5:尽管互联在一起的网络的硬件地址各不相同,但IP层抽象的互联网屏蔽的IP层以下这些复杂的细节。我们只需要在网络层讨论就行。
4.1.4:地址解析协议(ARP)和逆地址解析协议(RARP)
这一节我能够知道主机或者路由器怎样知道如何填充MAC帧首部,也就是物理地址?
当了我们知道IP地址但是当我们需要知道物理地址,或者反过来知道物理地址想知道IP地址那我们这个时候就需要ARP和RARP。
每个主机都设置由一个ARP高速缓存,里面由本局域网从各主机和路由器的IP地址到硬件地址的映射表,这些都是目前主机知道的一些地址。
那么主机如何知道这些地址呢?
4.1.5:IP数据报的格式
4.1.6:IP层转发分组流程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LVCpzgJf-1581442611863)(C:\Users\王港明\AppData\Roaming\Typora\typora-user-images\image-20200208233846510.png)]
4.2:划分子网和构造子网
4.2.1:划分子网
- 1:从二级IP地址到三级IP地址
今日看IP地址的设计确实不合理例如
1:利用率有时很低
每一个A地址网路可连接主机数超过1000万,但有些网络主机数根本达不到这么多的主机数,造成了浪费。
2:路由表太大
每一个路由器应当都能从路由器中找到下一跳的路由器。因此互联网中的网络数越多,那么路由表就会越大。
3:两级IP地址不够灵活
有时情况紧急,需要马上开辟一个网络,但是新申请的IP地址不能马上连接到因特网上。
综上所述我们需要解决这些问题这个时候就引入了“子网字段”这个东西来解决上数问题。这种做法叫做划分子网或子网寻址或子网路由选择。
子网划分是指由网络管理员将一个给定的网络分为若干个更小的部分,这些更小的部分被称为子网。
n原则上,根据全“0”和全“1”IP 地址保留的规定,子网划分时至少要从主机位的高位中选择两位作为子网络位,而只要能保证保留两位作为主机位,A、B、C 类网络最多可借出的子网络位是不同的,A 类可达22 位、B 类为14 位,C 类则为6 位。
- 子网掩码
这个时候我们要说加入我们到了路由器但是要进入网络,但是路由器怎么知道要转发到这个网络的哪个子网呢?目的网络划分了多少个子网(子网占多少位)?这些用子网掩码可以解决。
4.2.2:使用子网时分组的转发
4.2.3:无分类编址CIDR(构造超网)
- 划分子网遇到的问题?
- CIDR解决问题
- CIDR的编码特点
- CIDR不分子网但是还有地址掩码
- 构成超网
- CIDR的好处
查找路由表时会有可能出现不止一个匹配结果
4.3:因特网的路由选择协议
两大类路由选择协议:
内部网关协议 IGP:一个自治系统内部使用的路由选择协议。有多种协议,如 RIP 和OSPF 协议。
外部网关协议EGP:一个自治系统的边界,将路由选择信息传递到另一个自治系统中。目前使用的就是BGP
RIP协议的优缺点:
RIP 存在的一个问题是当网络出现故障时,要经过比较长的时间才能将此信息传送到所有的路由器。
RIP 协议最大的优点就是实现简单,开销较小。
RIP 限制了网络的规模,它能使用的最大距离为 15(16 表示不可达)。
路由器之间交换的路由信息是路由器中的完整路由表,因而随着网络规模的扩大,开销也就增加。RIP是一种分布式的基于距离向量的路由选择协议,其主要特点:
(1)仅和相邻路由器交换信息。
(3)按固定的时间间隔交换路由信息,例如,每隔30秒。
OSPF最主要的特征就是使用分布式的链路状态协议,其主要特点:
(1)使用洪泛法向本自治系统中所有路由器发送信息。
(2)发送的信息是与本路由器相邻的所有路由器的链路状态。
(3)只有当链路状态发生变化时,路由器才用洪泛法向所有路由器发送此信息。
BGP是不同自治系统的路由器之间交换路由信息的协议,它采用路径向量路由选择协议,其主要特点:
(2)自治系统AS之间的路由选择必须考虑有关策略。
(3)BGP只能力求寻找一条能够到达目的网络且比较好的路由,而并非要寻找一条最佳路由。
4.4:虚拟专用网VPN
五:运输层
本章弄清运输层最重要的两种协议TCP和UDP
5.1:运输层协议概述
5.1.1:进程之间的通信
从通信和信息处理的角度,运输层向它上面的应用层提供通信服务,运输层是面向通信的最高层,同时也是用户功能的最低层。当网络的边缘部分的主机通过网络的核心部分进行通讯,边缘部分有运输层,而核心部分只有下三层。
前面我们学习了IP层也就是网络层,但是我们考虑既然IP层直接可以将我们的信息进行转发那我们还要运输层干嘛呢?
两个主机之间的通信其实就是主机间进程进行互相通信,通信的端点不是主机而是主机的进程。
运输层有一个很重要的功能:复用和分用
复用:发送方不同的进程可以使用运输层相同的协议(上至下)
分用:是指不同的报文剥去首部运输层可以将它交付给目的进程
- 运输层和网络层区别
逻辑通信:运输层之间的通信好像是水平的(但是实际上是自上而下的),只是假定屏蔽封装了网络核心通信的细节。
而运输层两种协议TCP和UDP是对于进程的不同需求运输层提供的两种协议。
5.1.2:运输层两个主要协议
TCP/IP连个重要协议都市因特网的重要协议:
- TCP(transmission Control Protocol)传输控制协议
- UDP(User Datagram Protocol)用户数据报协议
两个对等的运输实体在通信是传送的数据单位叫运输协议数据单位TPDU。
但在TCP/IP体系中则根据所使用的协议TCP称之为TCP报文段,UDP称之为UDP用户数据报。
-
UDP传送数据之前不需要先建立连接,远地主机运输层在收到数据时也不需要给出确认。虽然UDP不提供可靠交付但是在有些时候却是高效的工作方式。
-
TCP提供面向连接的服务,在传送数据之前必须先建立连接,数据传送完后要释放连接。
给应用层的进程赋予一个标志
在单个计算机中进程用进程标识符进行标志,但在因特网环境下不行。不同计算机操作系统使用不同的进程标识符,
端口号只具有本地意义
所以,两个计算机要实现通信不仅要知道对方的IP地址还要知道对方的服务器端口号。
端口号分类:
5.2:UDP用户数据报协议
5.2.1:UDP概述
UDP在IP基础上只加了少数的功能,就是复用,分用和差错检测
- UDP的主要特点:
1:UDP是无连接的,既通信不需要提前建立连接
2:UDP是尽最大努力交付的,既不保证可靠交付。因此主机不需要维持复杂的连接状态。
3:UDP是面向报文的,
4:UDP没有拥塞控制
5:首部开销小(8个字节)(TCP20个字节)
6:UDP支持一对一,一对多,多对一,多对多的交互通信
5.2.2:UDP的首部格式
如果接受方UDP发现收到报文目的端口不正确,丢弃该报文,并有ICMP发送“端口不可达”差错报文给发送方。
5.3:TCP概述
5.3.1:TCP最主要的特点
- TCP最主要的特点:
1:TCP是面向连接的运输层协议。通信必须先建立连接后释放连接。
2:每一条TCP连接只能有两个个端点
3:TCP提供可靠的交付服务
4:TCP提供全双工通信,就是允许双方进程任何时候都能发送数据。
5:面向字节流,TCP中的字节流指的是流入到进程或从字节流出的字节序列
注意图中TCP连接是虚连接而不是真正的物理连接。
5.3.2:TCP连接
TCP把连接作为最基本的抽象。
前面讲过每一条TCP连接由两个端点。而这两个端点不是IP地址,不是应用进程,不是协议端口。连接的端口叫做套接字(socket)或者插口。端口号拼接到IP地址即构成了套接字。
5.4:可靠传输的工作原理
5.4.1:停止等待协议
全双工通信双方即是发送方也是接受方,“停止等待”就是每发送完一个分组就等待对方确认后,在发送下一个分组。
- 1:无差错情况
- 2:出现差错
注意
- 3:确认丢失和确认迟到
- 信道利用率
停止等待协议有点是简单,但是信道利用率太低。
所以如何提高信道利用率呢?
当使用流水线传输就需要我们下面介绍的连续ARQ协议和滑动窗口协议
5.4.2:连续ARQ协议
看图我们可以看到发送窗口这个东西,表示发送方维持在发送窗口内的分组可以连续的发送出去。图b当发送方接受到分组1的确认时,就把发送窗口向前挪一个分组的位置,当然这个时候也就可以发送第6个分组了。
5.5:TCP报文段的首部格式
TCP数据单元时报文段。一个TCP报文段分为首部和数据两部分。
TCP报文段最小字节是20,前20个字节是必须有的,后面加4N(N为正整数)字节,是根据需要添加的字节。
5.6:TCP可靠传输的实现
讲述可靠传输假定数据传输只在一个方向实现。A发送B接受给出确认。这样使问题讲述简单。
5.6.1:以字节为单位的滑动窗口
滑动窗口协议是以字节为单位的!
- 基于图5-15:假定A收到了B发来的确认报文段,其中窗口20个字节,确认号是31。根据这两个数据A构造出自己的滑动窗口。如图5-15
1):我们先说A的发送窗口。发送窗口表示:在没有收到B的数据确认的情况下A可以连续的把窗口里面的数据发送给B。但是发送的数据在没有收到B发来的确认信息,A必须暂时保留,以便超时重发。
2):发送窗口里面的字节表示允许A可以发送的字节,显然窗口越大,发送方就可以在收到确认前发送的数据越多,因而可以提高传输效率。但是不是说A想多大就多大,要考虑接受方B能及时接受,来的及处理。
3):发送窗口的大小由前沿和后沿决定。后沿的后面部分表示已经发送且得到确认,这部分显然不需要继续保留。前沿的前面部分表示还未不允许发送,因为接受方和发送方都为给它保留缓存空间。
4):发送窗口的后沿有两种变化。第一种是保持不动,因为发送方还未得到确认。另外一种就是前移,得到确认。
5):发送窗口的前沿也有两种变化。一种是向前移。另外一种就是是不动,这里不动有两种可能,一种是未得到确认所以不动,另外一种是收到新的确认但是对方的窗口缩小了,使得发送窗口前沿不动。还有一种特殊情况前沿向后收缩,这发生在对方窗口缩小了,但是这种不安全,因为发送很可能在缩小之前发送了缩小后前沿之前的数据,这回产生错误。
- 基于图5-16
A窗口:
要描述发送窗口A的状态需要三个指针P1,P2,P3:
P3-P1=A的发送窗口
P2-P1=已发送字节但还未收到确认
P3-P2=允许发送但是尚未发送字节
B窗口:
B窗口我们能看到31-50时允许接收,B窗口是20个字节,32和33已到达(31未到达)。
**31未到达情况:**我们看到B窗口32和33已到达(31未到达),所以知道未按序到达。B窗口接受窗口只能对收到按序到达数据的最高序号给出确认。所以B之能现在等待31到达企图返回31.
**31到达情况:**假设31现在到达,32/33也在31之前到达。这时将31-33交付主机,然后将31-33删除。这时B窗口向前移3字节,给A发送确认号34(表明B已经收到33为止的数据)。A收到确认信号可以将发送窗口向前滑动3个,但是P2是保持不动的,这时A窗口增大三个字节(可以发送的字节是42-53)。–>这个时候A如果发送42-53数据,P2才向前移和P3重合。–>这时(P3-P2=0)A的可发送窗口为0,A还未收到新的确认信息,必须停止发送。—>这个时候又有一种情况B给出了确认但是A没收到(可能滞留在网络),这个时候当过一段时间(超时重传)A未收到确认,则A重新发送,直到收到确认A才前移滑动窗口。
- 窗口和缓存的关系
如图a为发送方
发送方缓存用来存放:
1):发送方程序准备传送给发送方TCP准备发送的数据。
2):TCP已发送但尚未收到确认的数据。
图片a注意点:
1):发送窗口发送缓存的一部分。
2):已经被确认的数据因该从发送缓存删除。
3):发送最后发送的字节减去最后确认的字节就是尚未被确认仍在缓存中的字节。
4):发送程序必须控制写入缓存的速率不然太快发送缓存很快没有了存储空间。
如图b为接受方情况:
接受方缓存用来暂时存放:
1):按序到达,但是还未被接受程序读取(未读取当然不能给出确认)。
2):未按序到达的数据。
图b许需要注意:
1):接受方不许要检测接受到的分组,当有错误则要丢弃。因为如果不丢弃则会将接受缓存填满,接受窗口减少到0,造成不能接受数据。
2):当然如果接受程序能够及时处理数据,那么TCP能够及时给出确认,那么接受窗口也会变大,但虽大不能超过缓存。
3):对于不按序到达的数据,TCP并无明确规定。如果一刀切方法,就是未按序到达全删了,那么对于网络资源利用率不利。所以采用将未按序到达的数据先存方在缓存中,当字节流缺少的数据到达,在按序交付给上层应用。
根据以上两张图我们还要知道:
5.6.2:超时重传时间的选择
- 如何决定超时重传时间
前面我们讨论过,当发送方发送数据后在一定的时间未收到确认信息,那么就会在一定的时间后重新传送数据,那么这个时间大小决定就非常重要也是我们将要讨论的。
TCP采用一种自适应算法来确定重传时间。它记录报文的发出时间,和报文的确认时间,两者之差就是报文段的往返时间RTT。TCP保留一个加权往返时间RTTS(因为是加权时间所以得到的是时间数据较为平滑,又称为平滑的往返时间)。每当第一次时将第一次测量的RTT值赋给RTTS。之后的RTTS通过第一的RTTS按下式进行计算。
- 往返使劲按测量面临的问题
上面所说的往返时间测量看似简单,但是实现起来也是很复杂
现在往返时间测量面临的问题是:如何确定此却仍报文段是对先前报文段的确认,还是超时重传后的确认报文段?
5.6.3:选择确认(SACK)
这张面临的问题是:前面我们看到,发送的数据有可能没有按顺序到达接受方,中间缺少一些数据,我们知道接受方给出确认必须是,按序,到达,最高序号的确认。但是这里我们希望如果未按序到达能否在只重传中间缺少的数据呢?
这里用选择确认方法可以达到目的。
5.7:TCP的流量控制
一般通俗的讲我们希望通信数据传输能快一点,但是如果发送方传输数据过快的话反而不好,这要会造成数据流失。流量控制就是为了解决这个问题。让发送方传输速率不要太快,让接收方能够接收的过来。
5.7.1:利用滑动窗口实现流量控制
利用滑动窗口能够实现流量控制。
如下图体现了滑动窗口实现流量控制
A与B连接建立时,B告诉A我的接受窗口rwnd=400(rwnd=receiver window)(图中未显示连接建立过程)。设数据报文段字节长度为100,数据报文段初始序号为1(seq=1)。大写ACK=1表示首部确认位ACK,而小写ack表示尾部确认位。
发送方发送窗口的数值不能大于接受方接受窗口的数值。TCP窗口的数据值是字节而不是报文段。
从图中我们可以看到B进行了三次流量控制,rwnd=300到rwnd=0变化了三次。
我们在来讨论当rwnd=0,之后如果B有有了缓存空间,那么B就会给A发送rwnd=xxx,可是我们讨论特殊情况这条报文传输中丢失了,那么A在等B的信息,B也在等A传送数据,这样就造成了死锁?
这个死锁的解决方法是,TCP为每一个连接建立一个持续时间计时器,只要持续一段时间,那么A就会发送探测报文(字节数=1),那么对方就会给出自己的窗口值rwnd,如果还为0,那过一会A在发。如果不为0,那么给返回一个rwnd,那么A就可以继续发送数据了。
5.7.2:必须考虑的传输速率
5.8:TCP的拥塞控制
5.8.1:拥塞控制的一般原理
在计算机网络中的链路容量(带宽),交换节点中的缓存和处理机等都是网络资源。若对某一类资源需求超过该资源所能提供的部分,那么网络性能就会变坏,这种情况就叫拥塞。
如上图5-23,横坐标代表提供的负载,代表单位时间内输入给网络的分组数目。而纵坐标代表吞吐量,是单位时间网络输出的分组数目。
具有理想拥塞控制的网络:在吞吐量饱和之前,提供的负载和吞吐量相等,所以是45度斜线。而在提供的负载超过某一限度,由于网络资源受限,吞吐量达到饱和。这时能看到提供负载增大,但吞吐量保持不变。这也表明提供的负载有一部分损失掉了。
在无拥塞控制情况下:我们看到在无拥塞控制情况下,在不断加大提供负载情况下,刚开始和理想拥塞控制曲线拟合。但是随着加大提供负载当吞吐量明显小于理想拥塞控制情况下,进入轻度拥塞。在最后甚至导致吞吐量变为0,造成死锁。
5.8.2:几种控制拥塞的方法
拥塞控制四种算法:
-
慢开始
-
拥塞避免
-
快重传
-
快恢复
-
一:慢开始和拥塞避免
题目将这两个一起说,当然这两个算法时配合使用的。
发送方维持一个拥塞窗口的变量,这个变量随网络的拥塞程度动态变化。发送方让自己发送窗口等于拥塞窗口。
拥塞窗口的原则:当网络不拥塞,那就将拥塞窗口变大,能让分组更多的传输(其实TCP传输的是字节这里为了好理解)。但是当网络出现拥塞情况,那么就让拥塞窗口变小,以减少注入到网络中的分组数,以缓解拥塞情况。
而慢开始和拥塞避免就是通过控制拥塞窗口(发送窗口)的大小,来控制注入网络中的分组数。
**慢开始算法:**当刚开始给网络注入分组时主机这个时候如果一次将所有分组注入网络,那么分组太多导致网络拥塞。那么刚开始以一个怎样的方式给网络注入分组,这就是慢开始算法。 慢开始算法规定由小到大逐渐递增拥塞窗口的大小(发送窗口)。通常在干开始将用拥塞窗口设置为一个最大报文段MSS的值。
这里明确,慢开始算法是指数增大即cwnd=cwnd*2,拥塞避免算法是加法增大即cwnd=cwnd+1,而乘法减小是在发生了超时(只要发生超时重传,超时不一定是网络拥塞)乘法减小是ssthresh=ssthresh/2,这样加法增大和乘法减小合起来是AIMD算法。
这里慢开始和拥塞控制在发生一次超时重传后采取乘法减小和将cwnd=1的措施。而后面快重传和快恢复采取措施和这里不一样。
下图是我画的慢开始/拥塞避免的流程图:
- 二:快重传与快恢复
快重传和快恢复是对上面两个算法的改变。
这里有了快重传和快恢复后和上面相比,开始还是慢开始在cwmd>ssthresh时还是采用拥塞控制算法。但是不同的是。前面时在有一次超时重传时推测可能网络拥塞然后乘法减小慢开始。这里不一样是发送方在收到三次接受方的渴求确认信号时,这是立马重传,然后发送方知道这是并不是发生网路拥塞(并不会发生超时,而且有三个确认返回网络也不会拥塞)只是缺少部分报文,这时就不需要慢开始了(应为网络不拥塞不用小心),直接快恢复。
下图是我画的快重传/快恢复流程图:
下图是书上的对这四个算法的流程图:
这四个算法是同时有的进行,左边超时重传了,推测可能网络拥塞,所以慢开始。右边3个重复ACK确认,推测网络没拥塞只是中间缺少报文,这是就不用慢开始,可以快恢复。
5.9:TCP运输连接管理
TCP是面向连接的协议,连接的建立分三个阶段:连接建立,数据传送,连接释放。
TCP连接建立采用客户服务器模式,主动发起连接建立的应用进程是客户,而被动等待连接建立的是服务器。
5.9.1:TCP连接的建立
TCP连接的建立称为三次握手。上图A是客户端,B是服务器端。
- 一开始双方状态为CLOSED态,下面我按照顺序来讲解:
1)B(服务器)建立传输控制块(TCB),B的状态变为LISTEN态。
2)(第一次握手)A(客户端)建立传输控制块(TCB),A发送第一条信息,SYN=1/seq=x(TCP首部结构有SYN=1,且规定SYN报文段不能携带数据,seq为A的初始信号位),A的状态变为SYN-SENT态度。
3)(第二次握手)B在收到A发送的SYN报文连接请求时,如果同意建立连接,则将SYN=1/ACK=1/ack=x+1,/seq=y(seq为B的初始i信号位,这条报文也不能携带数据),这是B进入第二个状态,SYN-RCVD状态。
4)(第三次握手)A收到B的确认,A向B再次发送确认报文ACK=1/…(TCP规定ACK报文可以携带数据,但是不携带数据则不消耗序号)。发送完后连接已经建立,A进入EATAR-LISHED状态,B在收到A的确认也进入EATAR-LISHED状态。
- 为什么有第三次握手(最后A在发一次确认)?
这是为了意外情况,假设第一次握手,A发送连接请求第一次请求滞留在网络,过一段时间后B没有确认返回,A就超时重传第二次发送连接请求,这时B给了一个确认,A收到连接建立。过一会A第一次发送的滞留在网络中的连接请求,又到达了B,于是B又给了一个确认(如果没有第三次握手,B直接变为EATAR-LISHED状态等待接受这个新连接的数据),但是A前面连接已经建立,所以不会回复B,这时B第二次新建立的连接永远收不到数据,白等浪费资源。
5.9.2:TCP连接的释放
TCP连接释放接着上面对连接,双方是EATAR-LISHED状态状态。
-
连接释放的过程
1)
2)
3)
4)
5)
-
为什么