TCP拥塞控制及连接管理

在阅读此篇之前,博主强烈建议先看看TCP可靠传输及流量控制

一、TCP拥塞控制

  在某段时间,若对网络中某资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏——产生拥塞(congestion)。出现资源拥塞的条件:对资源需求的总和 > 可用资源;拥塞带来的问题:若网络中有许多资源同时产生拥塞,网络的性能就要明显变坏,整个网络的吞吐量将随输入负荷的增大而下降。

1. 拥塞的控制方法一(慢开始和拥塞避免

  发送方维持一个叫做拥塞窗口 cwnd (congestion window)的状态变量。拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。发送方让自己的发送窗口等于拥塞窗口。如再考虑到接收方的接收能力,则发送窗口还可能小于拥塞窗口。发送方控制拥塞窗口的原则是:只要网络没有出现拥塞,拥塞窗口就再增大一些,以便把更多的分组发送出去。但只要网络出现拥塞,拥塞窗口就减小一些,以减少注入到网络中的分组数。

  慢开始算法原理:在主机刚刚开始发送报文段时可先设置拥塞窗口 cwnd = 1,即设置为一个最大报文段 MSS 的数值。在每收到一个对新的报文段的确认后,将拥塞窗口加 1,即增加一个 MSS 的数值。用这样的方法逐步增大发送端的拥塞窗口 cwnd,可以使分组注入到网络的速率更加合理。

  传输轮次:使用慢开始算法后,每经过一个传输轮次,拥塞窗口 cwnd 就加倍。一个传输轮次所经历的时间其实就是往返时间 RTT。“传输轮次”更加强调:把拥塞窗口 cwnd 所允许发送的报文段都连续发送出去,并收到了对已发送的最后一个字节的确认。例如,拥塞窗口 cwnd = 4,这时的往返时间 RTT 就是发送方连续发送 4 个报文段,并收到这 4 个报文段的确认,总共经历的时间。

慢开始门限 ssthresh 的用法如下:

当 cwnd < ssthresh 时,使用慢开始算法。
当 cwnd > ssthresh 时,停止使用慢开始算法而改用拥塞避免算法。
当 cwnd = ssthresh 时,既可使用慢开始算法,也可使用拥塞避免算法。

  拥塞避免算法的思路是让拥塞窗口 cwnd 缓慢地增大,即每经过一个往返时间 RTT 就把发送方的拥塞窗口 cwnd 加 1,而不是加倍,使拥塞窗口 cwnd 按线性规律缓慢增长。

  依据:超时,即没有按时收到确认。无论在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞,就要把慢开始门限 ssthresh 设置为出现拥塞时的发送方窗口值的一半(但不能小于2)。然后把拥塞窗口 cwnd 重新设置为 1,执行慢开始算法。这样做的目的就是要迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够时间把队列中积压的分组处理完毕。

  “乘法减小“是指不论在慢开始阶段还是拥塞避免阶段,只要出现一次超时(即出现一次网络拥塞),就把慢开始门限值 ssthresh 设置为当前的拥塞窗口值乘以 0.5。当网络频繁出现拥塞时,ssthresh 值就下降得很快,大大减少注入到网络中的分组数。

  “加法增大”是指执行拥塞避免算法后,在收到对所有报文段的确认后(即经过一个往返时间),就把拥塞窗口 cwnd增加一个 MSS 大小,使拥塞窗口缓慢增大,以防止网络过早出现拥塞。

2. 拥塞的控制方法二(快重传与快恢复)

  快重传算法首先要求接收方每收到一个失序的报文段后就立即发出重复确认。这样做可以让发送方及早知道有报文段没有到达接收方。发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段。不难看出,快重传并非取消重传计时器,而是在某些情况下可更早地重传丢失的报文段。

  与快重传配合使用的还有快恢复算法

3. 拥塞控制与流量控制的关系

  拥塞控制所要做的都有一个前提,就是网络能够承受现有的网络负荷。拥塞控制是一个全局性的过程,涉及到所有的主机、所有的路由器,以及与降低网络传输性能有关的所有因素。流量控制往往指在给定的发送端和接收端之间的点对点通信量的控制。 流量控制所要做的就是抑制发送端发送数据的速率,以便使接收端来得及接收。如果把拥塞控制和接收方对发送方的流量控制一起考虑,那么很显然,发送方的窗口的上限值应当取为接收方窗口rwnd和拥塞窗口cwnd这两个变量中较小的一个,即:

  当rwnd<cwnd时,是接收方的接收能力限制发送方窗口的最大值;反之,当cwnd<rwnd时,则是网络的拥塞限制发送方窗口的最大值。也就是说,rwnd和cwnd中较小的一个控制发送方发送数据的速率。

二、TCP连接管理

  运输连接有三个阶段,即:连接建立、数据传送和连接释放。运输连接的管理就是使运输连接的建立和释放都能正常地进行。TCP 连接的建立都是采用Client/Server方式。主动发起连接建立的应用进程叫做客户(client)。被动等待连接建立的应用进程叫做服务器(server)。 连接建立过程中要解决以下三个问题:1.要使每一方能够确知对方的存在。2.要允许双方协商一些参数(如最大报文段长度,最大窗口大小,服务质量等)。3.能够对运输实体资源(如缓存大小,连接表中的项目等)进行分配。

1. 三次握手建立TCP连接

  1)A 的 TCP 向 B 发出连接请求报文段,其首部中的同步位 SYN = 1,并选择序号 seq = x,表明传送数据时的第一个数据字节的序号是 x。

  2) B 的 TCP 收到连接请求报文段后,如同意,则发回确认。  B 在确认报文段中应使 SYN = 1,使 ACK = 1,其确认号ack = x ? 1,自己选择的序号 seq = y。

  3) A 收到此报文段后向 B 给出确认,其 ACK = 1,确认号 ack = y ? 1。A 的 TCP 通知上层应用进程,连接已经建立。

  整个连接过程如下图:

2. 四次挥手释放TCP连接

  1)数据传输结束后,通信的双方都可释放连接。现在 A 的应用进程先向其 TCP 发出连接释放报文段,并停止再发送数据,主动关闭 TCP 连接。A 把连接释放报文段首部的 FIN = 1,其序号seq = u,等待 B 的确认。

  2)B 发出确认,确认号 ack = u + 1,而这个报文段自己的序号 seq = v。TCP 服务器进程通知高层应用进程。从 A 到 B 这个方向的连接就释放了,TCP 连接处于半关闭状态。B 若发送数据,A 仍要接收。

  3)  若 B 已经没有要向 A 发送的数据,其应用进程就通知 TCP 释放连接。

  4)   A 收到连接释放报文段后,必须发出确认。 在确认报文段中 ACK = 1,确认号 ack =w + 1,自己的序号 seq = u + 1。

至此,三次握手,四次挥手完毕。

原文地址:https://www.cnblogs.com/ytuan996/p/10626036.html

时间: 2024-11-09 01:23:04

TCP拥塞控制及连接管理的相关文章

TCP的运输连接管理

TCP的运输连接管理 TCP是面向连接的协议,有三个阶段:连接建立.数据传送 和 连接释放.运输连接的管理就是使运输连接的简历和释放都能正常地进行. 在TCP连接建立过程中要解决一下三个问题: 1.  要使每一方都能够确知对方的存在: 所以需要三次握手. 2.  要允许双方协商一些参数(如最大窗口值.是否使用窗口扩大选项和时间戳选项以及服务质量等). 3.  能够对运输实体资源(如缓存大小.连接表中的项目等)进行分配:建立TCB. TCP连接的建立采用跟客户-服务器模式.主动发起连接建立的应用进

http连接管理

1.TCP连接 几乎所有的HTTP通信都有由TCP/IP承载的,TCP/IP是全球计算机及网络设备都在使用的一种常用的分组交换网络分层协议集.一旦连接建立起来,客户端和服务器之间交换的报文就永远不会丢失.受损或失序.但计算机或网络崩溃,会使通信终端. 1.1.TCP可靠数据管道 TCP为HTTP提供了一条可靠的比特传输管道. 浏览器接受到一个URL的时候,会执行以下步骤: #1:客户端解析出主机名: #2:客户端查询这个主机名的IP地址(DNS): #3:客户端解析出端口号: #4:客户端发起到

linux内核工程导论-网络:tcp拥塞控制

这篇文章本来是在tcp那篇里面的,但是那篇太长了,不专一.就完善了一下提取出来了. TCP拥塞控制 拥塞控制讨论的是很多个同时存在的tcp连接应该怎么规划自己的数据包发送和接收速度,以在彼此之间共享带宽,同时与其他实体的机器公平的竞争带宽,而不是自己全占. 拥塞控制的核心是AIMD(additive-increase/multiplicative-decrease ),线性增加乘性减少.为啥不用线性增加线性减少,或者是乘性增加乘性减少呢?这个有人专门研究过,只有AIMD可以收敛聚合使得链路公平.

boost::asio 连接管理11 如何关闭连接

在实际产品运行中,对连接管理有了更新的认识,这里分享一下. shared_ptr管理连接对象的生命周期 shared_ptr的引用计数器决定了连接对象的生命周期.这里我说的连接对象就是在我的前文:http://blog.csdn.net/csfreebird/article/details/8522620 中的Client对象: [cpp] view plaincopyprint? #include "core/connection.h" #include <vector>

TCP系列36—窗口管理&流控—10、linux下的异常报文系列接收

在这篇文章中我们看一下server端在接收到异常数据系列时的处理,主要目的是通过wireshark示例对这些异常数据系列的处理有一个直观的认识,感兴趣的自行阅读相关代码和协议,这里不再进行详细介绍 在进行下面的测试前,首先如下设置相关的参数,其中window参数指定了到127.0.0.2的tcp连接的最大接收窗口. [email protected]:/home/******/tcp12# ip route change local 127.0.0.2 dev lo window 40 一.wi

TCP系列33—窗口管理&流控—7、Silly Window Syndrome(SWS)

一.SWS介绍 前面我们已经通过示例看到如果接收端的应用层一直没有读取数据,那么window size就会慢慢变小最终可能变为0,此时我们假设一种场景,如果应用层读取少量数据(比如十几bytes),接收端TCP有了少量的新的接收缓存后如果立即进行window update把新的window size通告发送端的话,发送端如果立即发送数据,那么接收端缓存可能又会立即耗尽,window size又变为0,接着应用层重复读取少量数据,这个过程重复的话,那么发送端就会频繁的发送大量的小包,这种场景我们就

TCP拥塞控制

TCP必须使用端到端拥塞控制而不是使网络辅助的拥塞控制,因为IP层不向端系统提供显式的网络拥塞反馈.TCP采用的方法是让每一个发送方根据所感知到的网络拥塞程度来限制其能向连接发送流量的速率. TCP限制向其连接发送流量 TCP连接的每一端都是由一个接收缓存.一个发送缓存和几个变量组成.运行在发送方的TCP拥塞控制机制跟踪一个额外的变量,拥塞窗口(cwnd),它对一个TCP发送方能向网络中发送流量的速率进行了限制:在一个发送方中未被确认的数据量不会超过cwnd和rwnd中的最小值,即 LastBy

用phpmyadimn来连接管理多个数据库

用phpmyadimn来连接管理多个数据库要修改配置文件,挺不爽的,并且连接远程数据库,速度不行.可以使用其他数据库管理工具, 请参考,navicat 结合快捷键 非常好用,开源,好用mysql 管理工具 HeidiSQL.如果非要用phpmyadmin,下面有二种方法连接,管理多个mysql服务器. 方法一,修改phpMyAdmin/libraries/config.default.php 修改配置文件前,最好先备份一下,万一改错地方了,显示不了,就郁闷了. /** * allow login

TCP拥塞控制 (1)

Basic: TCP,传输控制协议,是目前网络中应用最广泛的传输协议.SMTP.SSH.FTP.HTTP等因特网底层协议均是TCP. TCP面向连接,提供端到端的数据可靠传输.连接时三次握手,断开是四次挥手.具体表现为: 1.       TCP对传输的数据做了序号标记,其中序号标记安装字节数增长.TCP对端在接收到数据后发出一个ACK给对端(ACK中就包含序列号).TCP使用确认和超时重传机制保障了数据的可靠性传输. 2.       由于发送和接收端的数据处理能力不同,为了避免数据发送过快而