分组—面向连接
数据报—无链接
消息边界是两次写入之间的位置或字节便移量,举个例子,TCP协议是面向流的无消息边界,假设接收端有3个来自发送端的分组,但是3个总大小都小于接收端的接收缓冲区大小,则接收端可以将3个分组一起从缓冲区读出来;UDP是面向数据报的有消息边界,无论数据报有多大,接收端都需要为每个单独的数据报执行接收动作
编号 | 名称 | 描述/例子 |
---|---|---|
7 | 应用层 | 指定完成用户初始化任务的方法。应用协议通常由应用开发者设计实现。FTP、WWW、Telnet、NFS、SMTP、Gateway、SNMP等 |
6 | 表示层 | 针对应用的数据表示格式和转换规则的方法 |
5 | 会话层 | 指定多个链接组成一个通信会话的方法。 |
4 | 传输层 | 这层的功能包括是否选择差错恢复协议还是无差错恢复协议,及在同一主机上对不同应用的数据流的输入进行复用,还包括对收到的顺序不对的数据包的重新排序功能。TCP UDP |
3 | 网络层 | 这层对端到端的包传输进行定义,它定义了能够标识所有结点的逻辑地址,还定义了路由实现的方式和学习的方式。为了适应最大传输单元长度小于包长度的传输介质,网络层还定义了如何将一个包分解成更小的包的分段方法。IP协议、ICMP协议、ARP协议、RARP协议。 |
2 | 数据链路层 | 它定义了在单个链路上如何传输数据。这些协议与被讨论的各种介质有关。ppp |
1 | 物理层 | 有关传输介质的特性标准 |
在OSI7层模型中,发送时每一层都有自己的消息对象(PDU),每一层都将来自上一层的PDU视为不透明无需解释的信息,不会查看具体内容。然后将上层取得的PDU封装(增加头部尾部),接收时相反(分解)。每层都会有一个标示符,允许接收方决定哪些协议或数据流可以复用在一起
熟知端口号0 - 1023
注册端口号1024 - 49151
动态/私有端口49152 - 65535
协议名称 | 端口号 |
---|---|
ssh | 22 |
ftp | 20 21 |
telnet | 23 |
SMTP | 25 |
dns(是一个分布式数据库) | 53 |
http | 80 |
https | 443 |
有些应用以更分布式的形式设计,没有固定的服务器,每个应用即可以是客户端,又可以是服务端,又可以两者都是。这种应用成为对等或这种应用成为对等或P2P应用,并发P2P应用接收到传入的请求确定他能否响应,如果不能则转发给其他对等方。这种由一组P2P应用共同形成的应用网络称为覆盖网络 如Skype
IPv4长度为32位,IPv6长度为128位
A类地址: 0 + 7(网络号) + 24(主机)
B类地址: 10 + 14(网络号) + 16(主机)
C类地址: 110 + 21(网络号) + 8(主机)
D类地址: 1110 + 28(组播地址)
E类地址: 1111 + 28(保留)
地址块中第一和最后一个地址通常不使用
子网寻址 保留一些剩余主机号进一步用于站点内分配。该站点可能将基础地址中的主机进一步分为子网号和主机号
子网掩码 用于区分多个IP地址是否在同一个网络内,IP地址和子网掩码作与操作,如果得到的值相同,那么这两台主机就可以直接通信,如果不同,则会发往默认网关,由其负责路由转发
分层路由研究,将网络拓扑排序位一棵树,这样既可以使每个路由器的路由表都相对较小,同时保持到所有目的地的最短路径 —-图 2-8右侧树
路由聚合 图2-9
CSMA/CD:带冲突检测的载波侦听多路访问 – 检测网络,并在网络空闲时发送自己的帧,如果碰巧有其他站同时发送,发生重叠的电信号被检测为一次碰撞。这种情况下每个站等待一个随机的时间,然后再次尝试发送。这个时间量的选择依据一个统一的概率分布,随后每个碰撞被检测到的时间加倍,最终每个站都会找到机会发送或者在尝试一定时间后超时
链路聚合:两个或更多的接口被视为一个,通过冗余或将数据分割到多个接口,提高性能并获得更好的可靠性
以太网通过使用PAUSE消息实现流量控制 –链路层流量控制
分片仅用于目的地址为单播的帧
管理帧用于创建,维持,终止站和接入点之间的连接,也被用于确定是否采用加密,传输网络名称(SSID和ESSID),支持哪种传输速率,以及采用的时间数据库等
流量控制帧:RTS/CTS,一个站在发送数据之前发送一个RTS帧,如果接收方愿意接收额外的流浪,就会响应一个CTS帧
帧聚合包括A-MSDU和A-MPDU,A-MSDU只包含一个FCS(帧检验序列),效率高,但是如果出错,则需要重传整个聚合帧,A-MPDU每个子帧含有自己的FCS,并且可以使用ACK确认,如果出错只需要重传出错子帧就行
IP发送的数据报如果比MTU(最大传输单元)大,则需要分片
ARP 提供从IP地址到MAC地址的映射
RARP 提供从MAC地址到IP地址的映射
IP提供了一种尽力而为、无连接的数据报交付服务,任何可靠性必须由上层(传输层)提供
IP转发:如果目的IP是直接相连的,IP数据报直接发送(直接交付),如果不是,发送到默认路由(间接交付)
主机与路由器处理IP数据报的区别在于:主机不转发那些不是由他自己生成的数据报
移动IP:移动节点以固定的IP地址,实现跨越不同网段的漫游功能。主要步骤是:有主机向移动节点发送IP数据包,移动节点的家代理截获数据包,将包的目的地址与自己的移动绑定表中移动节点的家地址比较,若与其中任意地址相同,则家代理将数据包封装,通过隧道发送给移动节点的转发地址,移动节点的当地代理收到该包去除封装,发送给移动节点,移动节点收到数据采用便准路由机制与主机建立连接
强主机模式:数据报中的目的IP地址与到达接口的IP地址匹配才接收
弱主机模式:数据包中的目的IP地址与到达的任何接口的任何本地地址匹配,则可以被任何接口接收
数据报的目的IP地址经过每跳时都不会改变,但是链路层封装和链路层目重传的地址每跳都会改变。主机和路由器使用转发表和最长前缀匹配算法,以确定匹配的最好的条目来作为转发路径的下一跳
在动态分配中,DHCP客户机请求一个IP地址,服务器从可用的地址池中选择一个地址作为响应,这个地址池通常是为DHCP用途专门分配的一个连续的IP范围,分配给主机的地址只在一段时间内有效,称为租用期,客户机可以请求续期,此时可以跳过第一个广播阶段
典型的DHCP交换:客户机通过广播发现一组服务器和可提供的地址,它请求自己想获得的地址,并接收到选定服务器的确认 图6-2
DHCP中继代理可以将DHCP操作扩展到一个网段之外
DHCP快速确认可以快速配置可能频繁改变其网络接口的主机(移动主机),它可以跳过offer和request,直接使用ACK响应DISCOVER消息
PPPoe起始就是以太网上的PPP,用于广域网连接设备是交换机或者网桥而不是路由器的情况下
防火墙分为
包过滤防火墙 :过滤丢弃一些网络流量,过滤器可以自己配置
代理防火墙 :本质上是运行一个或多个应用层网关,能够在应用层中继两个连接/关联之间的流量,代理防火墙可以毫无破绽的伪装成Internet上的真实服务器,它可以伪装发送端。
网关 :简单来说就是连接两个不同网络的设备
主机本身不具有路由寻址能力,要把所有IP数据包发送到一个默认的中转地址上进行转发,这就是默认网关
代理防火墙最常见的两种形式为HTTP代理防火墙和SOCKS代理防火墙
HTTP代理防火墙也成为web代理,只能用于HTTP和HTTPS协议,这种代理对于通过它访问网站的用户来说就像是web服务器,对于所访问的网站来说就像是web客户端,一些web代理也经常被用作内容过滤器,基于“黑名单”来阻止用户访问某些web网站,隧道代理服务器刚好相反,它能避免用户被内容过滤器封阻
NAT :允许在互联网的不同地方重复使用相同的IP地址集的机制,NAT设备将内部系统的地址空间和全球互联网地址空间分隔开,所有进出流量均通过一台NAT设备,而只有这台NAT设备上才使用全球互联网地址空间中的IP,NAT的广泛使用带来的问题就是IPv6的推广受阻
普通情况下,互联网主机不能访问到位于NAT之后的主机(假设IP地址为10.0.0.3)提供的服务,NAT作为互联网路由器它必须同意转发目的IP地址为10.0.0.3传入的流量,更重要的是互联网的主机也无法识别这个IP,也无法路由到该IP。于是便需要用到端口转发机制。
端口转发:通过端口转发,进入NAT的流量被转发到其配置的目的地址处,通常需要用服务器IP地址和端口号来配置这个静态NAT
发夹和NAT环回问题:两台位于NAT私有空间的主机间通信,源地址是填NAT外部IP还是填写自己的主机IP?通常是NAT外部IP
那么如何不经过NAT实现两台NAT私有空间的主机间通信呢?这就需要用到NAT穿越技术
ICMP控制报文协议与IP协议结合使用,以便提供与IP协议层配置和数据包处置相关的诊断和控制信息,它既不是网络层协议也不是传输层协议,而是位于两者之间(最常见的应用就是Ping程序)
ICMP报文可分为两大类:有关信息传递的ICMP也称差错报文,以及有关信息采集和配置的ICMP称为查询或信息类报文
传入的信息类ICMP报文请求被操作系统自动处理,而差错类ICMP报文传递给用户或传输层协议
ICMP差错报文不会对某些报文进行响应(361页),这样作是为了限制生成所谓的广播风暴
当传入的数据报的目的应用程序还没准备好接收它时,会生成一个端口不可达报文
加入一个路由器收到一个来自主机的数据报,并确定自身并不是主机将数据包投递到目的地址的吓一跳地址,于是路由器发送一个重定向报文到主机,并将该报文发送到正确的路由器
唯一保存下来的广泛使用的ICMP查询/信息类报文是回显请求/应答报文,也就是Ping
它是不可靠的,不提供差错纠正,队列管理,重复消除, 流量控制, 拥塞控制,但它拥有差错检测(校验和)
两个完全不同的服务器可以使用相同的端口号和IP地址,只要他们使用不同的传输协议
UDP校验和是一个端到端的传输层校验和,UDP的差错检测就是基于检验和的,由发送方计算得到,最终的目的方校验,这也就说明,UDP数据报的校验和在传输过程中不会被修改,而IP数据报头部中的校验和,每一跳都会重新计算,因为其TTL字段每次转发都会减少
Teredo隧道为没有其他IPv6选项的系统传送IPv6数据报,方法是将IPv6数据报至于UDP/IPv4数据报的负载区里
链路层通常对可传输的每个帧的最大长度有一个上限,所以IP分片和重组发生在IP层
分片的计算的例子 —–图10-9
分片过后,标示符字段(IP头部中)被复制到每个分片,再结合分片偏移字段就能将分片的UDP数据报重组,分片导致的一个问题是如果任何一个分片丢失,那么整个数据报就丢失了
如果有很多个数据报都只到达了部分分片,这样将导致这些分片都待在接收方缓存中等待重组,这样势必会导致接收方缓存用尽,于是IP层使用了计时器来处理这种情况
路径MTU发现机制使用ICMP PTB消息来确认一个路径不引起分片的最大分组大小
IP数据包的每个分片都需要请求ARP
带指定IP地址的端点优先级比带通配符的优先级高
Local Adress本地地址,只有到达的数据报的目的地址和本地地址匹配的数据报才接收
Foreign Adress 外部地址,只有到达的数据报的源地址和外部地址匹配的数据报才接收
大多数UDP服务器是迭代服务器,每个UDP端口都有一个大小有限的队列与之对应,到达的数据报按先后顺序排在队列中等待应用程序处理,然后UDP是不可靠的,它不提供流量控制,如果队列满了,那么后续到达的数据报只是简单的被丢弃。而同样的问题也会发生在发送方和接收方之间的路由器上,这种情况叫做拥塞,拥塞是非常严重的,因为它不止影响一对发送法和接收方,所有经过该路由器的流量都会被影响。
ARQ:自动重复请求,当一个分组丢失或者有错时,发送方就接收不到接收方传来的直接使用ACK,于是他就会重新发送分组窗口:发送方已经注入,但还没有完成确认的分组存在的集合
滑动窗口:在发送方,记录着哪些窗口已经被确认可释放,哪些正在等待ACK, 哪些还不能被发送,在接收方,记录着哪些窗口已经被接收和确认,哪些是下一步期望的(已经分配内存来保护),以及哪些分组因为缓冲区满而会被丢弃
流量控制分为基于速率的流量控制和基于窗口的流量控制
基于速率:给发送方指定某个速率,同时确保速率永远不能超过这个速率发送
基于窗口:滑动窗口大小不固定,允许随着时间而变动,窗口通告让接收方通知发送方使用多大的窗口,发送方根据窗口通高作出调整,窗口通告往往会和ACK一起发送,发送方在收到确认后随即调整窗口大小
然而就像前面所说的那样,接收方和发送方之间往往会存在中间路由,而那个既适合发送方也适合接收方的速率很有可能并不适合中间路由,从而导致拥塞,这便需要 拥塞控制 来处理
TCP不会解读字节流中的字节内容,它不知道正在交换的数据字节是不是二进制数据或者ASCII码或者其他东西。所以TCP并不推荐使用紧急机制
TCP把要发送的字节流转换成一组IP可以携带的分组(每个分组都是最佳大小,不分片),称为组包。这些分组中包含序列号(每个分组第一个字节在整个字节流的偏移位置),这允许分组在传送中是可变大小的,并允许重新组合,称为重新组包
TCP传给IP的块称为报文段
TCP使用的ACK是累计的,一个指示字节号N的ACK,暗示着所有直到N的字节已经被接收成功,但这同时页出现一个问题,假设3, 4, 5三个数据报,接收方收到了3和5,但他并没有收到4,于是它会等待接收4,才会发送5的ACK,假如发生超时,则5也会被重传,于是就需要用到 SACK ,SACK选择确认选项,当乱序到达的数据报导致出现空洞时(上面例子中的4),如果使用了SACK选项,就可以帮助发送方有效的进行重传
TCP是一种面向连接的单播协议,服务模型是字节流,并且需要对连接状态进行管理
三次握手和四次挥手 图13-1
同时打开和同时关闭 图13-3和13-4
初始序列号会根据时间而改变,这就保证了每个连接都有不同的初始序列号
一条连接的两个方向的路径最大传输单元是不同的
分组层路径最大传输单元发现:—–436-437页
TCP状态转换图 图13-8
TIME_WAIT的2MSL:在本地与外地IP还有端口号都相同的情况下,2MSL状态能够将防止新的连接将前一个连接的延迟报文段解释成自身数据,但是这都是建立在正常处于这种状态的情况下的,如果主机崩溃并在MSL内重启,之前延迟的数据依然会被认为是新连接的数据,所以在主机崩溃重启到建立连接之前应等待MSL,这段时间称为静默时间。
可以发送一条RTS报文段代替FIN来终止连接(非正常),这种情况下,任何排队数据都会丢弃,并且接收方或说明发送方采用了终止的方式而不是正常方式关闭连接,
半开连接:在未告诉对端的情况下关闭或终止了连接,常常是因为主机崩溃
时间等待错误:图13-10
处于ESTABLISHED(客户端完成连接后的状态)状态的节点不能接收SYN报文段,处于LISTEN状态(服务器等待连接)的节点不能接收数据段
处于侦听状态下的节点维护着一个连接队列,其中的连接三次握手已经完成,但并未被应用程序接受。
设置重传超时(RTO)的值(465页)
在测量RTT的过程中很容易出现问题,比如一个数据报超时重传,那么收到这个包的确认信息对第一次的还是第二次的,这就是重传二义性,可用Karn算法解决,它规定收到重传的确认信息时进行RTT的测量,对该数据包之后的包采用退避策略,直到收到一个没有重传的数据包的确认信息时才将RTT用于更新SRTT(平滑的RTT估计值)
快速重传机制是基于接收端的反馈信息来引发重传的,当失序数据到达时,(接收端)重复ACK(收到乱序报文时发出的TCP报文)立即返回,不延时,同时重复ACK包中包含SACK信息,利用该信息即可获知多个空缺,从而避免重传正确接收的数据,当接收到3个重复ACK后,则发送端立即重传可能丢失的数据分组,而不必等待超时。不采用SACK,接收到有效ACK之前只能重传一个报文段,而使用SACK,则ACK可以包含额外信息,可以在每个RTT时间段内填补多个空缺。
有时,没有出现数据丢失也可能引发重传,称为伪重传,原因是伪超时,过早判定超时,原因可能是网络吞吐量过慢导致数据传输过慢或者ACK丢失或者ACK传输过慢。处理方法为,检测算法和响应算法,前者判断是否是真的超时,后者响应处理,用于减轻或撤销超时带来的影响
DSACK(重复SACK)用于判断何时的重传是不必要的
Eifel检测算法通过超时重传后接收到的第一个ACK来判断是否为伪超时,然后Eifel响应算法处理伪超时,检测算法和响应算法是相互独立的,如果使用其他方法获知发生了伪重传,一样可以使用Eifel响应算法(但不针对迟伪超时)。
Eifel检测算法:当发送一个重传报文段后,保存它的时间戳值,接收到相应的ACK后检测它的时间戳回显,如果小于之前保存的值,则可判定该ACK对应的时前一个原始的报文段,判定发生了伪重传。
Eifel响应算法:485页
F-RTO也是伪超时的检测算法:在超时重传后,收到第一个ACK,修改TCP的行为,让TCP发送一个新的数据包,而非检测ACK,然后再收到后一个ACK后,如果ACK有一个是重复的,则此次重传正确,如果,两个都不是重复ACK,则该重传 是伪重传
F-RTO和Eifel检测算法检测的时伪超时,通过检测第一个ACK来反映是否与原始报文段对应,DSACK检测的是迟伪超时,基于超时引发的重传所返回的ACK来判定
在交互式通信中,例如使用ssh远程连接服务器,ssh会在远程系统调用一个shell,对客户端的输入字符做出回显。因此每个字符都会生成4个TCP数据段,就算使用稍带延时确认也会需要3个数据段,有效的数据所占比例甚微,处理这种小数据包多的连接Nagle算法可以较好的解决,当一个TCP连接中有在传数据,小的报文段就不能被发送,直到所有在传数据都收到了ACK,然后再将这些小数据整合到一个报文段发送。算法的精妙之出在于,它实现了自时钟,ACK返回越快,数据传输也就越快
然而延时ACK和Nagle算法结合使用往往会导致某种程度的死锁,考虑,客户端使用延时ACK方法发送对一个服务器的请求,而服务器端开启了Nagle算法,服务器端发送一个全长数据包,然后准备发送一个小包,但是由于全长数据包还没有收到ACK,所以小包不能发送,而客户端由于使用了延时ACK,所以它需要等待两个全长数据包的到达再回应一个ACK,于是便产生了死锁,不过这种死锁在ACK计时器超时后便会解锁。
由于TCP的累计ACK结构,只有当窗口序列号等于左边界时才不会被丢弃 图15-10
当窗口大小(窗口大小只窗口当前可用空间)变为0时,返回的ACK中带有窗口通告,可以有效阻止发送端继续发送,直到窗口大小恢复为非0,接收端会给发送端传输一个窗口更新通告,通常不包含数据,为纯ACK,不能保证其传输的可靠性,很有可能就会发生死锁,为防止这种死锁,发送端会采用一种持续计时器,持续计时器会触发窗口探测机制强制性的要求接收端返回一个包含一个窗口大小的ACK。
糊涂窗口综合征:当发送端应用进程产生数据很慢、或接收端应用进程处理接收缓冲区数据很慢,或二者兼而有之;就会使应用进程间传送的报文段很小,特别是有效载荷很小; 极端情况下,有效载荷可能只有1个字节;传输开销有40字节(20字节的IP头+20字节的TCP头) 这种现象。应对方法是,接收端直到能够接收一个全长报文段或者缓冲区有一半可用时才发送窗口更新通告,对于发送端,则不应发送小的报文段,使用Nagle算法控制,直到满足下列任意条件时才可发送报文段,1.全长报文段,2.数据段长度>=接收端通告过的最大的窗口的一半时,3.没有在传的未经确认的数据或者禁用Nagle算法。
上面提到过,如果发送端或接收端指定一个很小的缓冲,即使另一边指定了一个大缓存,效率一样会很低,所以TCP协议栈中上层应用指定的缓存大小会被忽视,有操作系统来指定一个较大的动态变化的计算值。
拥塞控制的基本方法就是,在有理由认为网络即将进入拥塞状态(路由器丢包)时减缓TCP传输,难点就在于如何准确判断何时减缓何时恢复
拥塞窗口和发送端接收端窗口一样,是反映网络传输能力的变量,所以发送端窗口应等于接收端窗口和拥塞窗口的较小值
拥塞控制的经典算法
TCP通过与接收方交换一个数据就能获得接收端的窗口,但是拥塞窗口只能通过一次次的的增加发送速率直到包丢失才能获取拥塞窗口,由于多个TCP连接共享同一个网络传送路径,如果直接以全速启动会影响其他传输的性能,所以会采用特定的算法来控制过快的启动,稳定传输后,才会运行相应的算法。
发送方的拥塞控制是基于某种守恒来的,即发送一个包就会收到一个ACK(这里指数量,而不是次数,因为考虑会使用累计ACK),发送方接收到一个ACK就表明可以发送下一个数据包,这叫做自同步
前面提到的慢启动在传输之初和重传计时器检测到丢包之后,以及长时间处于空闲状态都会执行,因为网络传输能力未知。 慢启动方法图16-2
慢启动:在接收到一个数据段的ACK后,拥塞窗口翻倍(初始为1),然后发送数据也翻倍,变为发送2个数据段,依次类推,k轮后,发送端的发送窗口就会变为2^k,拥塞窗口也是,然而大量的数据包的发送总有一刻会导致网络出现问题,这个阙值就是慢启动阙值,也是慢启动阶段到拥塞避免阶段的转折点
拥塞避免:由于慢启动阶段是指数型增长的,所以通常情况下,未超过慢启动阙值和超过慢启动阙值之间跨度往往很大,很有可能还可以增长但是不能以指数型增长,于是拥塞避免就可以较好的解决这个问题,慢启动到达阙值后,转为拥塞避免阶段,拥塞避免阶段以较小的波动增长,线性增长 图16-3
Tahoe算法:连接指出处于慢启动阶段,监测到丢包则将拥塞窗口减小为初值并且重新进入慢启动状态,改进方法是,如果是因为重复ACK引起的丢包,引发快速重传,则将拥塞窗口改为上一步的大小。
标准TCP(Reno):在TCP建立连接之初处于慢启动阶段,慢启动阙值通常取较大值至少为接收端通知的窗口大小,接收到一个好的ACK则会更新拥塞窗口大小(前面讲的慢启动阶段转拥塞控制阶段,临界点就是阙值),当收到3次重复ACK,则证明网络上存在丢包问题,当前网络状况不能承载当前这么多的网络流量,如果不减少拥塞窗口,则网络流量继续按当前这么多来通信,则很可能会再次导致丢包,则将慢启动阙值减小为当前发送端窗口大小的一半(不低于2个全长数据段,这一步可能增加也可能减少阙值),然后进入快速恢复,当接收到一个好的ACK,则拥塞窗口重设为当前阙值(收缩)
快速恢复:快速恢复算法,先启动快速重传算法,快速重传算法则会先将拥塞窗口减为一半,因为收到了3个重复的ACK,所以至少可以证明3个数据都是被收到了的,只是可能存在上面提到过的失序造成漏洞,所以拥塞窗口变为阙值+3SMSS(此时阙值已经被减半),每收到一个重复的ACK,则证明之前发送的数据都是收到了的,证明当前网络可以承受当前网络流量,则试探性的将拥塞窗口暂时加一(临时膨胀),退出条件是收到一个非重复的ACK。(这里收到的3个重复的ACK,以及后来收到的重复ACK,都是之前丢包的那段时间发送的数据包)
NewReno:当处于快速恢复阶段时,如果接收到一个非重复ACK,就会停止快速恢复,转而进行正常的拥塞窗口更新,即未发生快速重传之前的更新方式,然而很多时候都会出现多个数据包丢失,如果只收到了一个ACK就停止,并将其减少到阙值,那么可能导致,在重传计时器超时之前,传输通道都处于局部空闲状态(因为讲道理的话,既然丢失的数据包都没有完全传输成功,那么拥塞窗口的膨胀就应该继续,那么如果减少拥塞窗口,传输的数据势必就会减少,就会导致传输通道没有完全利用起来)。于是NewReno算法做出了改进,它记录了上一次传输窗口传输的数据的最高序列号,在未收到该序列号的数据包对应的ACK之前都不停止快速恢复。
选择确认机制的拥塞控制:采用SACK后,发送端可以知道,漏洞有哪些,于是可以即时的重传丢失的数据,但是如果不考虑拥塞控制,如果需要重传的数据太多(快速重传的优势就是可以在每个RTT时间内填补多个漏洞)则很有可能削弱拥塞控制的效果。于是TCP还负责记录发送端注入网络的数据量,如果拥塞窗口大于这个数据量,且差值大于一个发送端最大数据段,则发送端可以继续发送。
速率减半:在快速重传结束后,拥塞窗口减半,在发送新数据之前至少可以接收一半的已发送数据的ACK,我们不希望在前一半时间内一直等待ACK,后一半时间才发送数据,所以就要用到速率减半。基本思想是在接收到两个重复的ACK后就发送一个新数据,这样数据发送会比较均衡。
拥塞窗口校验:在发送端长时间暂停下(可能由于本来就没有数据需要发送,或其他原因),之前维护的拥塞窗口大小可能不能反映当前网络状况。拥塞窗口校验的基本思想是,如果距离上次发送时间超过一次RTO,则更新阙值为max(当前阙值, 3/4 * 当前拥塞窗口大小),没经过一个空闲的RTT,则将拥塞窗口减少为一半。我们注意到这并没有减少阙值,而只是减少了拥塞窗口的大小,这是因为长时间暂停后发送方通常会进入慢启动阶段。
当一个TCP关闭时,需要保存RTT测量值,拥塞窗口大小,以及阙值,当相同主机间建立新连接时,该信息就可以拿来用。
TCP友好性:多个TCP共享带宽资源时,他们并非均匀的共享,而是根据连接参数,环境变量(丢包率,RTT)来加权平均。
基于延迟的拥塞控制算法
vegas算法:首先估算一定时间内网络能够传输的数据量,然后与实际的传输能力相比较,若本该传输的数据没有被传输,那么就有可能是被链路上某个路由器挂起,如果持续发生这种情况,则减小发送端的发送速率。
FAST算法:FAST算法原理上与vegas算法一直,但他的特性是它能应对高速网络环境,高速网络环境中延迟与阙值差距较大,它会根据差距调整增长或减缓的速率的增量(差距较大则让他进行较快的增长,反之亦然)
双方建立交互的连接,但是并不是一直存在数据交互,有些连接会在数据交互完毕后,主动释放连接,而有些不会,那么在长时间无数据交互的时间段内,交互双方都有可能出现掉电、死机、异常重启等各种意外,当这些意外发生之后,这些TCP连接并未来得及正常释放,那么,连接的另一方并不知道对端的情况,它会一直维护这个连接,长时间的积累会导致非常多的半打开连接,造成端系统资源的消耗和浪费,为了解决这个问题,在传输层可以利用TCP的保活报文来实现。
发送端(开启了保活功能)向接收端发送一个保活探测报文,如果发送端没有收到响应,经过一个提前设置的保活时间间隔,继续发送,如果达到了提前设置的保活探测次数,则对方主机被判定为不可达,断开连接。探测以及响应报文都不包含任何有效数据,当他们丢失时也不进行重传