数以亿计的计算互连设备、通信链路、分组交换:路由器和交换机
主机(host)=端系统(end system)
通信链路(link)
双绞线,光纤, 无线电频谱, 卫星
传输速率 = 带宽(bandwidth)
带宽单位为bps,bit per second每秒传输的位数,例如百兆光纤就是100M bps,实际传输使用的单位为BPS,1B=8bit,所以传输速率为100/8=12.5M BPS,就是12.5MB/s
通信链路只有极限带宽,例如5号线极限带宽为300M,不能接千兆网卡,只能接百兆网卡
网卡有传输的能力,传输速率取决于网卡能传输的能力,例如百兆,千兆网卡
分组(packet)交换:
电话交换机接通电话线的方式成为电路交换
每次会话预留沿其路径(线路)所需的独占资源--电话网
从主机A到主机B经一个电路交换网络需要多长时间发送一个640Kb的文件?
电路交换的频分和时分
举例子:
过程
优点
缺点
频分-frequency division
时分-time division
每个端到端的数据流被划分成分组
1.节点处理时延nodal processing delay:分析地址部分,进行差错检验等花费的时间
检查错误位
选择输出链路
高速路由器处理延迟-微秒级
等待被发送到输出链路上的时间
取决于路由器的拥塞程度
R=链路带宽 (bps)
L=分组长度 (bits)
发送分组比特流的时间 = L/R
d = 物理链路的长度
s = 介质的信号传播速度 (~2x108 m/sec)
传播延迟 = d/s
注意: s和R是两个完全不同的速度参量!
L=分组长度 (bits)
a=平均分组到达率 average packet arrival rate
R=链路带宽 (bps)
流量强度:traffic intensity = La/R
La/R ~ 0: 分组稀疏到达,无队列,平均排队延迟极小接近于0
La/R -> 1: 分组猝发到达,形成队列,队列长度迅速增加,排队延迟大幅增大
La/R > 1: 输出队列平均位到达速率超过送走这些位的极限速率,输出队列持续增长,排队延迟趋于无穷大
网络吞吐量:
bps或data packets per second
吞吐量: 接收端接收到数据的比特速率 (bps )
瞬时吞吐量: 某一瞬间的吞吐量
平均吞吐量: 一段时间内的吞吐量均值
主机与主机间分组传送
IP、路由协议
物理介质上的比特传送
对等实体:
服务器:具有客户资源
客户机:发出请求和接受数据
IP地址+端口号
网页
由许多对象组成
对象就是文件,可以是HTML文件, JPEG图像, Java applet, 音频文件…
多数网页由单个基本HTML文件和若干个所引用的对象构成
每个TCP连接上只传送一个对象,下载多个对象需要建立多个TCP连接
HTTP/1.0使用非持久HTTP连接
非持久HTTP详解
第一步:建立TCP连接
- HTTP客户机初始化与服务器主机中HTTP服务器的TCP连接
- 服务器中HTTP服务器在80端口监听TCP连接。收到请求连接,接受,建立连接,通知客户
第二步:HTTP请求连接
- HTTP客户发送HTTP请求消息,包含URL到TCP连接套接字,消息指出客户所需要的web对象
- HTTP服务器接受请求消息,产生一个响应消息,包含被请求对象,并发送这个消息到自身TCP连接套接字
- HTTP服务器结束TCP连接
- HTTP 客户接收包含html文件的响应消息, 显示html. 解析html文件,找出10个jpeg对象
- 对十个引用对象重复上述操作(图中是并行的,串行的话需要一个一个按顺序来)
在非持久HTTP连接下,上述只需4RTT
由于是非持续的,那么建立一次连接服务器返回消息之后就会断开连接,所以先建立TCP连接,发HTTP请求得到HTML对象,然后解析得到10个图片对象然后重新建立连接发送请求就得到对象了
缺点:
例子:
cookie文件是存在用户本地的!!!
把无状态的Http协议进行状态化!!!
Cookie和隐私:
所有HTTP请求指向缓存
为什么需要Web服务器?
条件get方法
确认缓存服务器中的对象是否为最新的,使用户拿到最新的数据
web缓存中的文件都有两个附加字段,last-modified最近一次修改时间和expires有效时间
先请求web缓存,如果未过期,则直接返回;如果过期了,则请求原始服务器
web缓存向原始服务器发送请求,包含last-modified,和自己的进行比对,如果相同则返回304 not modified,不附加其他数据,如果已更改,就返回已更改的对象
结构:用户代理,邮件服务器,电子邮件使用的协议
过程
用户代理(UA):
用户和电子邮件系统的接口
用户代理向用户提供一个很友好的接口来发送和接收邮件,用户代理至少应当具有撰写、显示和邮件处理的功能
邮件服务器:
它的功能是发送和接收邮件,同时还要向发信人报告邮件传送的情况(已交付、被拒绝、丢失等)。
邮件服务器采用客户/服务器方式工作,
但它必须能够同时充当客户和服务器邮件发送协议和读取协议∶
邮件发送协议用于用户代理向邮件服务器发送邮件或在邮件服务器之间发送邮件,如SMTP;
邮件读取协议用于用户代理从邮件服务器读取邮件,如POP3
SMTP用的是“推”(Push)的通信方式,POP3用的是“拉”(Pull)的通信方式
电子邮件格式与MIME
多用途网际邮件扩充(MIME)
由于SMTP只能传送一定长度的ASCII码,
许多其他非英语国家的文字(如中文、俄文,甚至带重音符号的法文或德文)就无法传送,
且无法传送可执行文件及其他二进制对象,因此提出了用途网络邮件扩充
Simple Mail Transfer Protocol
客户使用 TCP 来可靠传输邮件消息到 服务器端口号25
直接传送: 发送服务器到接收服务器
传输的3个阶段
连接建立(握手)
发件人的邮件发送到发送方的邮件服务器的缓存中;
SMTP客户每隔一段时间就对邮件缓存扫描一次,如果发现有邮件就建立TCP连接
邮件消息的传输
连接建立后,就可开始传送邮件。邮件的传送从 MAIL 命令开始,MAIL 命令后面有发件人的地址
连接释放(结束)
邮件发送完毕后,SMTP 客户应发送 QUIT 命令。
SMTP 服务器返回的信息是 221(服务关闭),表示 SMTP 同意释放TCP 连接
命令/应答的交互
SMTP总结
SMTP与HTTP的比较
HTTP:拉协议
SMTP:推协议
HTTP: 每个对象封装在它各自的HTTP响应消息中发送
SMTP: 一个邮件内各个对象置于同一个邮件消息的多目部分发送
SMTP协议只能传送7bit的ASCII码文本数据,不能传可执行文件或者其他二进制对象
SMTP不能传送多媒体文件,以及其他非英语国家的文字
解决不能传送ASCII码数据的问题,一处多用途因特网邮件扩展MIME
MIME还可以用于面向非ASCII码的Http!!!
POP也使用客户/服务器的工作方式,在传输层使用TCP,端口号为110。IMAP4使用143
POP有两种工作方式:
“下载并保留"和"下载并删除”
SMTP: 用来交换邮件消息的协议
RFC 822: 文本邮件消息格式标准
信头-头部行。如:
To:
From:
Subject:
这些头部不同于SMTP命令!
信体
邮件消息也必须是ASCII字符
功能
特点:
为什么不集中式DNS?
DNS分类
或者这么划分
根名字服务器
顶级域名服务器
权威DNS服务器
在因特网上具有公共可访问主机(如Web服务器和邮件服务器)的每个组织机构必须提供公共可访问的DNS记录,
这些记录将这些主机的名字映射为IP地址。
组织机构的权威DNS服务器负责保存这些DNS记录。
多数大学和公司维护它们的基本权威DNS服务器
本地DNS服务器
严格来说不属于该服务器的层次结构
每个ISP(如居民区ISP、公司、大学)都有一个本地DNS也叫默认服务器
当主机发出DNS请求时,该请求被发往本地DNS服务器。
起着代理的作用,转发请求到层次结构中。
总结
递归查询:我帮你查了,妈的;查不到我让你帮我查,查到了告诉我
迭代查询:我不知道,但是我可以让你去找别人
注意,本地域名服务器查不到直接向跟域名服务器请求,然后才是接下来的操作
本地主机中也有DNS高速缓存,当高速缓存有的时候就不需要进入本地域名服务器了
RR 格式: (name, value, type,ttl)
Type=A(Address地址)
Type=CNAME(canonical别名)
Type=NS( name server )
Type=MX(mail exchange)
查询报文与应答报文 , 但具有同样的报文格式
报文头部
标识符: 16位,查询和应答报文使用相同的标识符
标志:有若干个标志构成,分别标识不同的功能
查询/应答-0/ 1
查询希望是/非递归查询-1/0
应答可/否获得(支持)递归查询-1/0
应答是/否来自权威名字服务器-1/ 0
运输层通信的双方是进程到进程,而网络层是主机到主机
运输层屏蔽了下层网络核心的细节,使应用进程看起来就好像是两个运输层实体之间有一条端到端的逻辑通信通道!!!
运输层使用端口号来区分不同的应用进程!!!
从通信和信息处理的角度看,传输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最低层
传输层位于网络层之上,它为运行在不同主机上的进程之间提供了逻辑通信,而网络层提供主机之间的逻辑通信。
显然,即使网络层协议不可靠(网络层协议使分组丢失、混乱或重复),传输层同样能为应用程序提供可靠的服务
传输层提供应用进程之间的逻辑通信(即端到端的通信)
与网络层的区别是,网络层提供的是主机之间的逻辑通信复用和分用。
在两个不同的主机上运行的应用程序之间提供逻辑通信
传输层协议运行在端系统
发送方: 将应用程序报文分成数据段传递给网络层
接受方: 将数据段重新组装成报文传递到应用层
两个进程之间的逻辑通信
可靠, 增强的网络层服务
引入端口号的原因:不同操作系统对进程PID的表示不同,为了统一,就是用端口号来在网络中表示应用层的不同进程
应用层把应用层数据协议单元交给运输层,运输层判断采用udp还是tcp,分别封装为udp对应的用户数据报和tcp对应的tcp报文段,这称作复用,将对应数据交给网络层封装成IP数据报,这称作IP复用,接收方采取相反的策略即可
应用层的协议对应的运输层协议以及端口号
udp无连接,tcp有连接
udp支持单播,多播和广播,而tcp只支持单播(建立连接)
udp面向应用报文,tcp面向字节流
udp仅加上一个udp数据首部;
tcp将应用层协议数据单元视作连续的字节流,以字节为基础进行发送,然后在接受方重新拼接
udp提供无连接不可靠的服务,tcp提供面向连接的可靠服务
udp和tcp的首部不同
UDP使用应用层协议提供可靠性!!!
在计算校验和的时候,UDP数据报之前需要加上 12B 的伪首部,伪首部并不是UDP的真正首部,只是在计算校验和的时候,加在前面构成一个临时的数据报,校验和既不向下传送也不向上递交,只是为了计算校验和
熟知端口号:0-1023;可提供 2^16个 不同端口
TCP 是在不可靠的 IP 层之上实现的可靠的(rdt服务)数据传输协议,它主要解决传输的可靠、有序、无丢失和不重复问题。
点到点:
可靠:
面向字节流:
全双工数据:
没有信息边界
TCP拥塞控制设置窗口大小
面向连接
流量控制
报文段分为首部和数据两个部分
32bit,指出本报文段数据载荷的第一个字节的序号
代表希望收到的下一个数据载荷第一个字节的序号,页是最前面所有数据的确认
在建立连接之后所有的报文段都设置ACK=1,ACK=0的数据无效
4bit,并且以4字节为单位,实际上指出了TCP首部的长度,实际大小取决于扩展首部
占6bit,保留为今后使用,目前设置为0
指出发送本报文一方的接收窗口
计算检验和时需要加上12字节的伪首部,和udp一样
源端口目的端口:2字节
序号Seq:4字节,TCP连接中传送的数据流中的每一个字节都编上一个序号。序号字段的值则指的是本报文段所发送的数据的第一个字节的序号
确认号:期望接收的下一个报文段的数据的第一个字节的序号;如果是N,则表示到序号 N-1 为止,所有数据都正确收到
数据偏移:4比特,以32为为单位,首指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远;因此当此字段的值为 15 时,达到 TCP 首部的最大长度 60B
紧急位 URG:URG=1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)
确认位 ACK:确认。只有当ACK=1时确认号字段才有效。当ACK=0时,确认号无效;TCP规定,在连接建立之后所有传送的报文段都必须把ACK置为1
推送位 PSH:接收方TCP收到PSH=1的报文段,就尽快地交付给接收应用进程,而不再等到整个缓存都填满后再向上交付
同步位 SYN:SYN=1 表示这是一个连接请求或连接接收报文
终止位 FIN:用来释放一个连接。当 FIN = 1时,表明此报文段的发送方的数据已发送完毕,并要求释放传输连接。
RST:当RST=1时表示出现严重差错,必须释放连接重新建立连接
FIN:FIN=1,表明次报文段的发送端数据已发送完毕并要求释放连接
窗口:2字节,让对方设置发送窗口的依据。单位是字节
检验和:2字节,检验首部和数据两个部分。计算检验和时,要在TCP报文段前面加上12字节的伪首部(和UDP相同)
保留字段:6位,全为0
基本概念
有线链路误码率较低,一般交给运输层来进行处理;但是无线链路易受干扰,误码率比较高,要求数据链路层必须提供可靠数据传输服务
确认与否认:
发送方发送一个数据分组之后,必须停止下来等待接收方对于该分组的确认ACK,确认之后才能进行下一个分组的发送,如果发生误码,接收方通过fcs段检测到误码之后就会发送NAK,发送方就重传该分组,所以在收到确认之前,发送方不能删除该分组的缓存
超时重传:
若分组发生丢失,这种情况在数据链路层的传递不太容易发生,但是在不同网络之间,通过路由器连接形成的复杂网络系统下就是经常发生的事情,这个时候需要设置一个超市定时器,如果超时了仍然没有收到确认,那么有可能发生了丢失,立即重传
确认丢失:
确认ACK丢失了,超时进行重传,那么接收方如何判断收到的是相同的分组呢?
给发送数据的分组加上序号,在停等协议中使用01即可,一个bit位,当接收方发现两个数据相同则丢弃;
那么如果确认分组迟到了呢?第四个图
ACK0迟到了,导致超时重传DATA0,接收方收到DATA0之后将其丢弃并且发送ACK,那么这个时候发送方就受到了两个一样的确认分组了,同理带上序号,ACK0第二次收到就被丢弃;在前面收到ACK0的时候发送DATA1,接收方收到并且发送ACK1,这就和前面的不同了,所以可以接着发送下一个数据
由此可见,序号的作用是用来判断该分组和上一个分组是否相同,所以用01就可以了,一个bit位
信道利用率
信道利用率一般比较低,如果超时重传那更低了,所以产生了另外两种协议
是一种连续ARQ协议
无差错情况
发送窗口和接收窗口,在回退N帧协议中,接收窗口大小固定为1,发送方看情况
假设这里用3个bit,也就是0-7;发送窗口的大小取值范围为,这里取5,取1就是停等协议
发送方在发送的过程中,可以连续将发送窗口内的分组发给接收方,假设正确接收,每接受一个,接收方就返回一个ACK确认分组,并且把接收窗口后移,发送方接收到确认分组之后就把发送窗口后移,并且可以将确认完的分组将缓存中删除了
注意,接受并且后移的时候分组的序号要和窗口当前的序号相匹配
累计确认
接收方可以不用一个一个发送确认,可以用累计确认,比如ACK1表示1及其以前的所有分组被正确接收,也就是0 1
这里假设发送ACK1和ACK4,ACK1丢失了,但是可以通过ACK4得知已经正确接收,所以省掉了重传的步骤
即使发生确认分组丢失,发送方也不一定就必须重传!
并且还可以减少网络资源的占用,减小接收方的开销等等
有差错情况
这里5号分组发生了误码,被接受方丢弃了,剩余的分组与接收窗口不匹配,接收方无法接受,只能将这四个分组丢弃
丢弃之后,每丢弃一个序号不匹配的分组,就发送一个已经接受的ACK,这里就是ACK4,发送方接收到这些确认分组之后,就知道发送出现了问题,根据具体实现来确定收到几个重复确认来重传,总之,要么就是不等计时器重传,要么就是等待计时器结束然后进行重传
数据链路层的ACK和运输层的ack有区别,数据链路层的ACKn标识n及其以前的数据分组被正确接收
GO-Back-N
发送窗口超过上限举例
发送窗口在这里的范围显示是:1< Wt <=7,不能取8,当取8时如下
发送方一次性发送0-7,接收方正确接收并且发送累计确认ACK7,但是确认分组丢失了,于是超时之后重传该分组,重复分组进来之后发现0和0匹配,可以接受,但是这个时候接受的是重复的分组,就出现了问题
接收方无法分辨新旧分组!!!
总结
选择重传的接收窗口应该大于1,接收方只能按序接受正确到达的数据分组
选择重传应采用逐一确认而不是累计确认!!!
举例:
本例中WtWr4
发送方发送0-3号分组,接收方接受的时候2号分组丢失了,接收方先接受01,发送确认分组,然后将接收窗口后移;接受3号分组,但是不能将接收窗口后移,因为接收到的是失序分组,然后返回ACK3
发送方接收到01分组确认之后就将发送窗口后移,这时候45在里面,可以发送45号数据分组;与此同时,发送方接收到了3号确认分组,将3号分组的定时器暂停避免超时重传,表示已经收到,但是这个时候不能移动发送窗口,因为发送方收到的是失序的确认分组,需要等待2号分组定时器超时,然后进行重传
超时之后重传2号分组,在这之前也许45号分组已经被正确接受,但是由于失序,不能移动接收窗口,发送方接受到确认之后,由于确认分组失序,不能移动发送窗口,并且需要暂停45计时器,现在就只剩下2号分组的重传了
2号分组被正确接收后终于有序,接受窗口后移;发送方接收到确认分组后终于有序,发送窗口后移;进而可以进行后续的传输
发送,接受窗口尺寸问题
注意这里和回退N帧区别,一个是 2(n-1),一个是2n -1
如果超出界限举例
这个例子最大取4,我们取5
发送方发送0-4,接收方接受并且返回确认分组,但是0号确认丢失,发送窗口不能移动;但是接收窗口移动了,如图所示
一段时间过后重传0号分组,接收方窗口中0存在,可以接受,但是这个0并不是我们想要的0,就导致了无法区分新旧数据分组;
如果大小合适接收窗口中应该没有0,这个时候接收方知道确认分组丢失了,所以重新发送确认分组ACK0,发送方接受,正常运作
总结
是以上上面三种协议为基础实现的,并没有独立使用哪一种
TCP以字节为单位的滑动窗口实现可靠数据传输
补充:
注意RTT是往返时延,L/R就是指的是传输速率!!!
注意这里细节:
序号500开始,再发送500,最后一个字节是999,ACK是期望收到,所以是ACK1000!!!
TCP规定只能对按序到达的最高序号进行确认,所以这个1000实际上是累计确认!!!
提供了差错检测和接收方反馈(ACK,NAK)
停-等协议
Rdt2.0的致命缺陷
如果ACK/NAK混淆了会发生什么?
发送方并不知道接收方发生了什么!
万能做法:重发
不能正确重发: 可能重复
处理重复:
发送方给每个分组加一个序号
在 ACK/NAK 混淆时发送方重发当前分组
接收方丢弃重复的分组(并不向上传递)
——停等协议数据包需要多少序号?
rdt2.1接收方处理混乱的ACK/NAKs
性能
流水线技术 go-back-N
滑动窗口
发送方:
在分组头中规定一个k位的序号
窗口:允许的连续未确认的报文
接收方:
选择性重传 Selective Repeat, SR
接收方分别确认已经收到的分组
发送者只重发没有收到确认的分组
发送窗口
N 个连续序号
限制被发送的未确认的分组数量
窗口大小和序号大小的关系
快速重传
超时触发重传存在问题:超时周期往往太长——重传丢失报文之前要等待很长时间,因此增加了网络的时延
发送方可以在超时之前通过重复的ACK检测丢失报文段
发送方常常一个接一个地发送很多报文段
如果报文段丢失,则发送方将可能接收到很多重复的 ACKs
如果发送方收到一个确认后再收到3个对同样报文段的确认,发送方应意识到不对劲——生成三个重复ACK,是因为接收方存在缺失报文段
启动快速重传: 在定时器超时之前重发丢失的报文段
运输层的流量控制和数据链路层的流量控制的区别是:
传输层定义端到端用户之间的流量控制,
数据链路层定义两个中间的相邻结点的流量控制。
另外,数据链路层的滑动窗口协议的窗口大小不能动态变化,传输层的则可以动态变化
TCP连接的接收方有一个接收缓冲区
发送速率和接收应用程序的提取速率匹配
流量控制:发送方不能发送的太多太快,让接收缓冲区溢出
工作机制(假设 TCP 接收方丢弃失序的报文段)
前面的过程不再赘述
后续打破死锁
发送窗口为0之后启动持续计时器,为什么要引入持续计时器呢?
如果等待接收方通知,如果这个报文丢失了那么两方就陷入了互相等待的死锁状态;
当持续计时器超时,那么发送零窗口探测报文,如果为0返回确认,然后再启动一个持续计时器;
值得一提的是,零窗口探测报文也是具有计时器的,当超时就重发
那么接收窗口满了还能接受报文吗?TCP规定,像零窗口探测报文,确认报文,带有紧急事务的报文是必须被接受的!!!
第一步,设置SYN=1,给定一个初始序号seq=x,发送给Tcp服务器;
第二步,服务器收到之后发送针对TCP连接请求的确认报文,SYN=1,ACK=1,seq=y,ack=x+1;TCP服务器进入同步已接收状态,TCP客户进入连接已建立状态
TCP规定,SYN=1的请求连接的报文不能携带数据,但是需要消耗一个序号
第三步,客户端发送针对TCP服务器确认的确认,ACK=1,seq=x+1,ack=y+1,这是一个普通的报文段,如果不携带数据不消耗序号,下一个序号从x+1开始!!!这时TCP服务器才进入连接已建立阶段
为什么不用两次握手?(面试常考)
浪费资源,同时
用户发送TCP SYN 报文段到服务器
客户机TCP向服务器的TCP发送请求连接的报文段
这个报文段置同步位SYN为1,同时指定一个初始的序号 seq = x
TCP规定,SYN不能携带数据,并且要消耗掉一个序号
指定初始的序号
没有数据
服务器接收SYN,回复SYN/ACK报文段
如同意建立连接,则向客户机发回确认,并为该TCP连接分配缓存和变量。
在确认报文段中,把SYN位和ACK位都置1 , 确认号是 ack=x +1 ,
同时也为自己选择一个初始序号 scq=y 。 注 意 , 确认报文段不能携带数据,但也要消耗掉一个序号
服务器分配缓冲区和变量
指定服务器的初始序号
客户接收SYN/ACK,回复ACK报文段
当客户机收到确认报文段后,还要向服务器给出确 认,并为该TCP连接分配缓存和变量 。
确认报文段的ACK位置1,确认号 ack=y+1 ,序号seq=x+1。
该报文段可以携带数据, 若不携带数据则不消耗序号
可能包含数据
第一步,TCP客户端向服务器发送终止报文,FIN=1,ACK=1,seq=u,ack=v,seq和ack针对上一次发送和接受的数据进行设置
TCP规定FIN=1的终止报文段即使不携带数据也要消耗一个序号
第二步,TCP服务器向客户端发送普通确认报文,ACK=1,seq=v,ack=u+1,seq和ack由上一条得出
这样TCP客户到服务器单方向的传送就关闭了
第三步,TCP服务器还可能进行一些数据传输,最后发送终止报文,FIN=1,ACK=1,seq=w,ack=u+1,w是根据自己这边数据传输得出的,u+1是因为客户端没有发送报文了,这是对u前面的重复确认
第四步,TCP客户端发送普通的确认报文,ACK=1,seq=u+1,ack=w+1
注意一点:Tcp发送确认报文之后还要经过2MSL才会完全关闭,下面探讨为什么
如果最后一个报文段丢失了那么会导致服务器一直重发这条报文,所以需要设置一段等待时间
TCP服务器为了避免TCP客户端出现问题而无法及时发送报文段,设置了一个保活计时器,每收到一个报文就重置一下该计时器
如果到了规定时间还未收到数据,那么TCP服务器进程会像TCP客户进程发送探测保温段,如果发送了很多(10)个仍无响应,则关闭连接
**客户关闭套接字: **clientSocket.close()
Step 1: 客户发送 TCP FIN 控制报文段到服务器
该报文段的终止位 FIN 置 1 , 序 号 seq=u ,它等于前面已传送过的数据的最后一个字节的序号加1,
FIN报文段即使不携带数据,也消耗掉一个序号
Step 2: 服务器接收 FIN, 回复 ACK. 进入半关闭连接状态
确认号ack=u+1 , 序 号 seq=w , 等于它前面已传送过的数据的最后一个字节的序号加1
此时,从客户机到服务器这个方向的连接就释放了
Step 3: 服务器发送FIN到客户,客户接收 FIN, 回复 ACK
进入 “time wait”状态等待结束时释放连接资源
Step 4: 服务器接收 ACK. 连接关闭.
拥塞控制是指防止过多的数据注入网络,保证网络中的路由器或链路不至于过载
拥塞控制和流量控制的区别:
拥塞控制是让网络能够承受现有的网络负荷,是一个全局性的过程,涉及所有的主机、所有的路由器,以及与降低网络传输性能有关的所有因素。强调全局
相反,流量控制往往是指点对点的通信量的控制,是个端到端的问题(接收端控制发送端),它所要做的是抑制发送端发送数据的速率,以便使接收端来得及接收。强调点对点
术语
拥塞:
从信息系角度:太多源主机发送太多的数据,速度太快以至于网络来不及处理
与流量控制不同
表现:
丢失分组 (路由器的缓冲区溢出)
长延迟 (在路由器的缓冲区排队)
控制方法
归纳
只要网络没有出现拥塞,拥塞窗口就可以再大一些;只要出现拥塞,就减少一些
判断是否出现网络拥塞:没有及时收到按时到达的确认报文(发生超时重传)
发送方将拥塞窗口作为发送窗口
提前设置一个慢开始门限值,这里是16,然后采用指数的形式上涨,每次增加一倍;初值为1
如果慢启动加倍后超过了门限值,那么发送窗口去门限值!!!
超过慢开始门限之后每次增加一倍了,而是固定的增加1
如果过程中丢失了几个报文,导致重传计时器超时,那么判断网络很可能出现了拥塞,那么如下操作:
更新门限值为当前拥塞窗口的一半,设置拥塞窗口为1,重新开始慢启动
每经过一个往返时延 RTT 就把发送方的拥塞窗口cwnd加1,而不是加倍
使拥塞窗口cwnd按线性规律缓慢增长(即加法增大),这比慢开始算法的拥塞窗口增长速率要缓慢得多
上面的意思简单来说就是:当发送方连续收到三个重复的 ACK 报文时,直接重传对方尚未收到的报文段,而不必等待那个报文段设置的重传计时器超时
快速重传
注意细节(大题考)
确认M2的意思是:我现在确认了M2,我想要的是M3!!!
收到三个重复确认的时候就对相应的报文段立即重传,而不是等待计时器超时,超时了就可能认为网络拥塞,导致网络传输效率减慢
快恢复算法
针对只是个别报文段进行丢失的情况,在收到三个重复确认的时候启动快恢复算法而不是慢启动算法
将慢开始门限和拥塞窗口都调为当前窗口的一半,开始拥塞避免算法;也有的把拥塞窗口调整为新的门限加3
做题时记得加上3!!!
(在三个重复ACK之后)这个时候调成发送窗口为门限值大小!!!