TCP是因特网传输层的面向连接的可靠的运输协议。
TCP被称为是面向连接的:通信双方在发送数据之前必须建立连接,连接状态只在连接的两端中维护,在沿途节点中并不维护状态。
TCP连接包括:两台主机上的缓存、连接状态变量、socket等。
TCP连接提供的是全双工服务(同一连接中能够传输双向数据流)
TCP报文段结构:
被用于多路复用/分解来自或送到上层应用的数据
被TCP 发送方和接收方用来实现可靠数据传输服务。即使报文段里没有数据也要填写。
一个报文段的序号实际是该报文段首字节的字节流编号,而不是报文段的编号。
确认号是接收方希望接收到的下一个字节的序列号,TCP是累计确认的(该序列号之前的所有字节均已被正确接收到)
乱序到达的段如何处理TCP规范中没有规定,由TCP的实现者做出决策。
指示了以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 信元中有一个拥塞指示(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拥塞控制算法:
初始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流量不断压制直至中断因特网吞吐量的情况
此外某些应用会打开多个并发连接,产生公平性问题
- 计算机网络传输层之TCP协议(tcp协议特点、tcp报文段首部格式、tcp连接建立---三次握手、tcp连接释放---四次握手)
文章转自:https://blog.csdn.net/weixin_43914604/article/details/105516090 学习课程:<2019王道考研计算机网络> 学习目的 ...
- 传输层:TCP 协议
传输层:TCP 协议 一.概述 TCP 和 UDP 处在同一层——运输层,但是它们有很多的不同.TCP 是 TCP/IP 系列协议中最复杂的部分,它具有以下特点: (1) TCP 提供 可靠的 数据传 ...
- 计算机网络 学习笔记-传输层:TCP协议简介
概述: TCP传输前先要建立连接 TCP在传输层 点对点,一条TCP只能连接两个端点 可靠传输.无差错.不丢失.不重复.按顺序 全双工 字节流 TCP报文段 TCP报文段的报头前20字节是固定的,后面 ...
- 计算机网络传输层之TCP流量控制
文章转自:https://blog.csdn.net/weixin_43914604/article/details/105531547 学习课程:<2019王道考研计算机网络> 学习目的 ...
- 网络通信协议八之(传输层)TCP协议详解
传输层协议 分段是为了提高传输效率,封装是指给每个数据段添加一个编号 端到端的传输是逻辑上的端到端,并不是真正意义上的发送方某层与接收方某层之间的传输 IP协议只是保证数据报文发送到目的地,为主机之间 ...
- 计算机网络传输层之TCP拥塞控制(慢开始与拥塞避免、快重传和快恢复)
文章转自:https://blog.csdn.net/weixin_43914604/article/details/105532044 学习课程:<2019王道考研计算机网络> 学习目的 ...
- 实验:传输层:TCP协议
一.概述 TCP和UDP处在同一层——运输层,但是它们有很多的不同.TCP是TCP/IP系列协议中最复杂的部分,它具有以下特点: (1) TCP提供 可靠的 数据传输服务,TCP是 面向连接的 .应用 ...
- 计算机网络传输层之TCP可靠传输
文章转自:https://blog.csdn.net/weixin_43914604/article/details/105524592 学习课程:<2019王道考研计算机网络> 学习目的 ...
- 实验:传输层:UDP协议 学习笔记
一.传输层协议 从之前介绍的网络层协议来看,通信的两端是两台主机,IP数据报首部就标明了这两台主机的IP地址.但是从传输层来看,是发送方主机中的一个进程与接收方主机中的一个进程在交换数据,因此,严格地 ...
随机推荐
- python unicode和string byte
python unicode 和string那 开发过程中总是会碰到string, unicode, ASCII, 中文字符等编码的问题, 每次碰到都要现搜, 很是浪费时间, 于是这次狠下心, 一定要 ...
- File类的基本概念与递归
一.File类 1.概念 File类:是文件和目录路径名的抽象表示形式. 即,Java中把文件或者目录(文件夹)都封装成File对象.也就是说如果我们要去操作硬盘上的文件,或者文件夹只要找到File这 ...
- 对于Javaweb初学者的一些坑。#Javaweb
1.在配置好Tomcat之后 ,编译阶段发现报错 这种对于我个人来说一般有两种情况: ①在编写代码时(比如servlet)发现爆红,一般是maven的依赖没有导入,这个时候在xml文件中导入需要的包的 ...
- LQB2018A09倍数问题
这个题,第一反应一定是三个for嵌套加一个max比较. 超级无敌大暴搜 #include <iostream> #include <string> #include <s ...
- mongoose子文档生成不了_id,查询困难的解决办法
以下是我的数据库表 本来是想设置一个自增属性,比如listId,来定义我的子list,sliderlist这些,这样能确保他的唯一性,结果尝试了很久都无法成功,原生,插件都无法成功, 这两个网址是讲的 ...
- Django学习路11_向数据库中添加 和 获取指定条件数据
在 views.py 中添加函数 向数据库中添加数据 def add_persons(request): for i in range(15): person = Person() flag = ra ...
- Excel绘制经典图表
1.柱形图 2.条形图 3.饼图---复合饼图 4.圆环图 5.组合图 设置不同的纵轴 6.漏斗图 其中:合计呈逐渐下降的趋势,可以用漏斗图进行展示! 绘制漏斗图首先需要构建辅助列,在插入图形的时候选 ...
- JWT到底是个什么鬼?
前面一篇我们了解了微服务安全认证架构是如何演进而来的,但是发现v2.5架构仍然较重,有没有轻量级一点的方法呢?其实业界早已有了实践,它就是基于JWT的安全认证架构.JWT到底是个什么鬼呢?本篇为你解答 ...
- Python编程基础(一)编程语言是什么?编译型语言和解释型语言的区别|Python是什么?
编程语言是什么? 其实,程序指的就是一系列指令,用来告诉计算机做什么,而编写程序的关键在于,我们需要用计算机可以理解的语言来提供这些指令. 虽然借助 Siri(Apple).Google Now(An ...
- 错误记录:MIME type may not contain reserved characters
最近遇到个问题,随手记录一下! 新做了一个项目,要通过HTTP请求发送ZIP文件到OSS平台,但上传过程中,总是出现下面错误提示: 初步判定,应该是包冲突原因!于是,分析MIME-TYPE获取源码发现 ...