TCP是因特网传输层的面向连接的可靠的运输协议。
 
TCP被称为是面向连接的:通信双方在发送数据之前必须建立连接,连接状态只在连接的两端中维护,在沿途节点中并不维护状态。
TCP连接包括:两台主机上的缓存、连接状态变量、socket等。
TCP连接提供的是全双工服务(同一连接中能够传输双向数据流)
 
TCP报文段结构:
  • 16比特的源端口号和16比特的目的端口号
被用于多路复用/分解来自或送到上层应用的数据
  • 32 比特的序号字段和32 比特的确认号字段
被TCP 发送方和接收方用来实现可靠数据传输服务。即使报文段里没有数据也要填写。
一个报文段的序号实际是该报文段首字节的字节流编号,而不是报文段的编号。
确认号是接收方希望接收到的下一个字节的序列号,TCP是累计确认的(该序列号之前的所有字节均已被正确接收到)
乱序到达的段如何处理TCP规范中没有规定,由TCP的实现者做出决策。
  • 4 比特的首部长度字段
指示了以32比特的字为单位的TCP 首部长度。
由于TCP 选项字段的原因, TCP 首部的长度是可变的。
通常,选项字段为空,所以TCP 首部的典型长度就是20 字节
  • URG比特指示报文段里存在着被发送端的上层实体置为紧急的数据
  • ACK比特指示确认字段中的值是有效的, 即该报文段包括一个对已被成功接收报文段的确认。
  • 当PSH比特被设置的时候, 就指示接收方应立即将数据交给上层。
  • RST、SYN、FIN比特用于连接的建立与拆除
  • 16 比特的接收窗口字段,用于流量控制,指示接收方愿意接受的字节数量。
  • 因特网检验和
  • 紧急数据指针字段
指出紧急数据的最后一个字节。当紧急数据存在并给出指向紧急数据尾的指针的时候,TCP必须通知接收端的上层实体。
 
TCP收到上层应用的数据时启动定时器。
TCP使用单一重传定时器,触发重传的事件有:超时、收到重复ACK,会重启定时器
 
每当超时事件发生时,TCP重传具有最小序号的还未被确认的报文段,并将下一次的超时间隔设为先前值的两倍
冗余ACK:再次确认某个报文段的ACK,而发送方先前已经收到对该报文段的确认。
如果某个分组丢失,可能会引发多个重复的ACK。
发送方可以在超时事件发生之前通过它来较好地检测到丢包情况。收到三次冗余ACK,无需等待计时器溢出直接快速重传。
 
TCP提供可靠、按序的字节流:
TCP ACK的处理:
将ACK的值y与它的最早未被确认字节序号SendBase进行比较。
(1)如果y>SendBase,则该ACK是在确认一个或多个先前未被确认的报文段。
因此发送方更新它的SendBase变量;如果当前有未被确认的报文段,TCP还要重启定时器。
(2)如果收到冗余ACK,且已经收到3次,则快速重传从y开始的报文段(如果超时间隔未到,TCP只会重传这一个报文段)
TCP ACK的生成:
(1)具有所期望序号的按序报文段到达。所有在期望序号及以前的数据都已经被确认
接收方对另一个按序报文段的到达最多等待500ms。如果下一个按序报文段在这个时间间隔内没有到达,则发送一个ACK。
(2)具有所期望序号的按序报文段到达。另一个按序报文段等待ACK传输。
立即发送单个累积ACK,以确认两个按序报文段。
(3)比期望序号大的失序报文段到达。检测出间隔
立即发送冗余ACK,指示下一个期待字节的序号(间隔的低端的序号)
(4)能完全或者部分填充接收数据间隔的报文段到达
假设该报文段起始于间隔的低端,则立刻发送ACK
RTT的估计方法:
测量从段发出去到收到ACK的时间得到SampleRTT(忽略重传)
测量多个SampleRTT,求平均值,形成RTT的估计值EstimatedRTT
EstimatedRTT = (1- α)*EstimatedRTT +α*SampleRTT,其中指数加权移动平均α典型值为0.125
定义RTT 偏差DevRTT,用于估算SimpleRTT一般会偏离EstimatedRTT的程度:
DevRTT = (1- β)*DevRTT +β *(SampleRTT-EstimatedRTT),其中β的推荐值为0.25
定时器超时时间设置为TimeoutInterval = EstimatedRTT + 4*DevRTT
 
TCP 为它的应用程序提供了流量控制服务以消除发送方使接收方缓存溢出的可能性。流量控制是一个速度匹配服务,即发送方的发送速率与接收方应用程序的读取速率相匹配。
图中空闲空间大小rwnd=RevBuffer -[ LastByteRcvd -LastByteRead]
接收方通过把当前的rwnd 值放入它发给发送方的报文段接收窗口字段中,通知发送方在该连接的缓存中还有多少可用空间。
当接收方的接收窗口为0时,发送方会继续发送只有一个字节数据的报文段。这些报文段将会被接收方确认。直到缓存将开始清空,并且确认报文里包含一个非0的rwnd值。
 
建立TCP连接:
(1)客户端的TCP首先向服务器端的TCP发送SYN报文段。该报文段中不包含应用层数据。但是在报文段的首部的标志位SYN比特被置为1。另外,客户端会随机地选择一个初始序号client_isn ,并将此编号放置于该报文段的序号字段中。该报文段会被封装在一个IP数据报中,并发送给服务器。
(2)一旦包含TCP SYN 报文段的IP数据报到达服务器主机,服务器会从该数据报中提取出TCP SYN报文段,为该TCP连接分配TCP缓存和变量,并向该客户TCP 发送允许连接的SYNACK报文段(在完成三次握手的第三步之前分配这些缓存和变量,使得TCP 易于受到称为SYN洪泛的拒绝服务攻击)。这个允许连接的报文段也不包含应用层数据。但是,在报文段的首部标志位SYN比特被置为1 、首部的确认号字段被置为client_isn+1 、服务器端随机选择自己的初始序号server_isn并将其放置到该报文段首部的序号字段中。
(3)在收到SYNACK报文段后,客户也要给该连接分配缓存和变量。客户主机则向服务器发送另外一个报文段,对服务器的允许连接的报文段进行了确认,将值server_isn+1放置到TCP报文段首部的确认字段中。因为连接已经建立了,所以该SYN比特被置为0。该阶段可以在报文段中携带客户到服务器的数据。
关闭TCP连接:
(1)客户应用进程发出一个关闭连接命令。这会引起客户TCP向服务器进程发送一个特殊的TCP报文段。这个特殊的报文段让其首
部中的标志位FIN比特被置1。
(2)当服务器接收到该报文段后,就向发送方回送一个确认报文段。然后,服务器关闭连接,发送它自己的终止报文段,其FIN比特被置1。
(3)该客户收到终止报文段FIN,回复ACK进行确认,随后进入等待状态。如果再次收到FIN会重新回复ACK。
(4)服务器收到ACK,连接关闭。
 
拥塞控制的两种主流方法:
(1)网络辅助的拥塞控制:
路由器向发送方显式地反馈网络拥塞信息,这种反馈可以用一个简单的比特来指示网络中的拥塞情况,指示发送方应该采取何种速率
早期IMB SNA和DEC DECnet中采用, 也用于ATM可用比特率(ABR)拥塞控制
ATM网络使用面向虚电路(VC)的方法处理分组交换。网络交换机上的逐VC状态使ATM非常适合执行网络辅助拥塞控制
ABR(available bit rate)被设计成一种弹性数据传输服务,如果网络轻载ABR服务充分使用可用带宽;如果发送方路径拥塞则将发送速率降到最低保障速率
发送方发送资源管理信元(Resource-Management cell, RM信元)和数据新元(data cell),接收方会把RM cell返回给发送方。
ABR提供三种机制用于从交换机向接收方发送与拥塞相关的信令信息:
  • data cell中的EFCI位(显示转发拥塞指示位)
拥塞的交换机将其设为1,如果RM cell前面的data cell的EFCI位被设为1,那么接收方在返回的RM cell中置CI位
  • RM cell中的CI、NI位
RM 信元中有一个拥塞指示(Congestion Indication, Cl) 比特和无增长(No Increase, NI) 比特
这两个比特位可被一台拥堵的交换机设置
轻微拥堵,NI置1,rate不许增长
严重拥堵,CI置1
  • RM cell中的2字节显式速率(Explicit Rate, ER)字段
拥塞的交换机可以将ER置为更低的值,发送方获知路径所能支持的最小速率
(2)端到端拥塞控制:
网络层不需要显式的提供支持;端系统通过观察loss,delay等网络行为判断是否发生拥塞
TCP采取这种方法
运行在发送方的TCP拥塞控制机制跟踪一个额外的变量,即拥塞窗口cwnd
在一个发送方中未被确认的数据量不会超过cwnd与rwnd中的最小值
LastByteSent - LastByteAcked ≤ min{cwnd,rwnd}
上面的约束限制的发送方中未被确认的数据量,在每个RTT的起始时间发出,在结束时收到数据的确认报文
rate≈cwnd/RTT 
Loss事件=timeout或3个重复ACK,发生loss事件后,发送方降低速率
TCP拥塞控制算法:
  • 慢启动SS
初始cwnd为一个最大段长度MSS,每个传输的报文段被首次确认将cwnd增大一个MSS(相当于每个RTT翻倍),发生loss后将cwnd减半
(1)如果存在一个由超时引发的丢包事件,TCP发送方将cwnd置1MSS、修改ssthresh并重新开始慢启动
(2)当swnd达到ssthresh(上次loss事件发生前拥塞窗口值的一半)时,结束慢启动,TCP进入到拥塞避免模式
(3)如果收到三个重复ACK,TCP执行快速重传并进入快速恢复状态
  • 拥塞避免
当swnd达到ssthresh时进入拥塞避免模式,每个RTT只将swnd的值增加1MSS
  • 快速恢复
对收到的每个冗余ACK,swnd增加1MSS,如果收到三个重复ACK,TCP执行快速重传并进入快速恢复状态,直到丢失报文段的一个ACK到达时,TCP发送方将cwnd减半、修改ssthresh并重新开始慢启动
此时采用加性增—乘性减(AIMD)策略,逐渐增加发送速率,谨慎探测可用带宽,直到发生loss
综上:假设发生丢包事件时的窗口长度W保持不变,一条连接的平均吞吐率为0.75W/RTT (忽略慢启动阶段,因为很短)
 
为了取得10Gbps的吞吐率,今天的TCP拥塞控制算法仅能容忍2*10^10的报文段丢失概率,因此高速网络下需要设计新的TCP。
 
 
TCP是具有公平性的,例如两个连接共享瓶颈带宽R时, 图中两条连接实现的带宽最终将沿着平等带宽共享曲线在波动
如果K个TCP连接共享相同的瓶颈带宽R,那么每个连接的平均速率为R/K
但多媒体应用通常不使用TCP,以免被拥塞控制机制限制速率,UDP 源有可能压制TCP 流量
当今的一个主要研究领域就是开发一种因特网中的拥塞控制机制,用于阻止UDP流量不断压制直至中断因特网吞吐量的情况
此外某些应用会打开多个并发连接,产生公平性问题

计算机网络-传输层(3)TCP协议与拥堵控制的更多相关文章

  1. 计算机网络传输层之TCP协议(tcp协议特点、tcp报文段首部格式、tcp连接建立---三次握手、tcp连接释放---四次握手)

    文章转自:https://blog.csdn.net/weixin_43914604/article/details/105516090 学习课程:<2019王道考研计算机网络> 学习目的 ...

  2. 传输层:TCP 协议

    传输层:TCP 协议 一.概述 TCP 和 UDP 处在同一层——运输层,但是它们有很多的不同.TCP 是 TCP/IP 系列协议中最复杂的部分,它具有以下特点: (1) TCP 提供 可靠的 数据传 ...

  3. 计算机网络 学习笔记-传输层:TCP协议简介

    概述: TCP传输前先要建立连接 TCP在传输层 点对点,一条TCP只能连接两个端点 可靠传输.无差错.不丢失.不重复.按顺序 全双工 字节流 TCP报文段 TCP报文段的报头前20字节是固定的,后面 ...

  4. 计算机网络传输层之TCP流量控制

    文章转自:https://blog.csdn.net/weixin_43914604/article/details/105531547 学习课程:<2019王道考研计算机网络> 学习目的 ...

  5. 网络通信协议八之(传输层)TCP协议详解

    传输层协议 分段是为了提高传输效率,封装是指给每个数据段添加一个编号 端到端的传输是逻辑上的端到端,并不是真正意义上的发送方某层与接收方某层之间的传输 IP协议只是保证数据报文发送到目的地,为主机之间 ...

  6. 计算机网络传输层之TCP拥塞控制(慢开始与拥塞避免、快重传和快恢复)

    文章转自:https://blog.csdn.net/weixin_43914604/article/details/105532044 学习课程:<2019王道考研计算机网络> 学习目的 ...

  7. 实验:传输层:TCP协议

    一.概述 TCP和UDP处在同一层——运输层,但是它们有很多的不同.TCP是TCP/IP系列协议中最复杂的部分,它具有以下特点: (1) TCP提供 可靠的 数据传输服务,TCP是 面向连接的 .应用 ...

  8. 计算机网络传输层之TCP可靠传输

    文章转自:https://blog.csdn.net/weixin_43914604/article/details/105524592 学习课程:<2019王道考研计算机网络> 学习目的 ...

  9. 实验:传输层:UDP协议 学习笔记

    一.传输层协议 从之前介绍的网络层协议来看,通信的两端是两台主机,IP数据报首部就标明了这两台主机的IP地址.但是从传输层来看,是发送方主机中的一个进程与接收方主机中的一个进程在交换数据,因此,严格地 ...

随机推荐

  1. Linux下给PHP安装redis扩展

    一.下载redis扩展源码包 PHP官网下载地址:http://pecl.php.net/package/redis 二.安装依赖插件 yum -y install wget make gcc gcc ...

  2. SPRING 阅读--JdkDynamicAopProxy

    一.简介 JdkDynamicAopProxy 代理类是spring 默认的JDK动态的代理类实现.它实现了Java 动态代理接口InvocationHandler接口和Spring定义的AopPro ...

  3. MySQL乱码问题(为什么?追根溯源)

    引言 定位:查询数据库得到的结果集乱码,client端向数据库插入数据乱码. 网上有不少帖子,手把手地教给我们如何去改这一问题.方案大多数如下: 方案中最多介绍的就是更改配置文件,win下my.ini ...

  4. Python os.link() 方法

    概述 os.link() 方法用于创建硬链接,名为参数 dst,指向参数 src.高佣联盟 www.cgewang.com 该方法对于创建一个已存在文件的拷贝是非常有用的. 只支持在 Unix, Wi ...

  5. PHP symlink() 函数

    定义和用法 symlink() 函数创建一个从指定名称连接的现存目标文件开始的符号连接. 如果成功,该函数返回 TRUE.如果失败,则返回 FALSE. 语法 symlink(target,link) ...

  6. PHP get_resource_type() 函数

    get_resource_type() 返回资源(resource)类型. 版本要求:PHP 4 >= 4.0.2, PHP 5, PHP 7高佣联盟 www.cgewang.com 语法 st ...

  7. PHP __construct() 函数

    实例 函数创建一个新的 SimpleXMLElement 对象,然后输出 body 节点的内容:高佣联盟 www.cgewang.com <?php $note=<<<XML ...

  8. Linux 如何以管理员身份运行终端

    如何以管理员身份在终端执行指令: 目录 如何以管理员身份在终端执行指令: 1. 以sudo 指令在其他指令前加上sudo 2. 以su 进入root权限,以管理员方式执行命令 设置root初始密码: ...

  9. 数据量大了一定要分表,分库分表组件Sharding-JDBC入门与项目实战

    最近项目中不少表的数据量越来越大,并且导致了一些数据库的性能问题.因此想借助一些分库分表的中间件,实现自动化分库分表实现.调研下来,发现Sharding-JDBC目前成熟度最高并且应用最广的Java分 ...

  10. 2017面向对象程序设计(Java)第十三周助教工作总结

    时间飞逝,本学期即将接近尾声.不知不觉同学们已经学习java十三个星期了,想必同学们对Java课程体系及内容有了更加深入的理解,也应该摸索出了一套适用于自己的学习方法. 下面我对上周工作做以简单总结: ...