文章目录

  • TCP概述
  • TCP报文结构
  • TCP连接的建立与释放
  • TCP可靠性传输
    • 应答确认
    • 超时重传
    • 快速重传
    • 乱序重排
    • 流量控制
    • TCP拥塞控制
      • 拥塞控制概念
      • TCP拥塞控制算法

TCP概述

TCP,Transmission Control Protocol(传输控制协议)是一种面向连接,可靠的,基于字节流服务的传输层的通信协议。
面向连接:TCP和UDP不同,TCP是面向连接的,关于面向连接,是指通信的双方要先建立连接,然后才能进行数据的读写。这是字节流服务的特点,通信双方的线路是存储在路由器中的。相当于一个“虚电路”。
可靠:TCP通过应答确认和超时重传的机制保证通信是可靠的。TCP是把数据交给IP层,从IP层的角度看,如果网络环境不好,就会出现丢包的情况,这是无法避免的,IP层只是尽自己最大的努力吧数据传输过去,TCP对此也无能为力,只能通过自身的算法来弥补网络环境不好造成的不足。

TCP报文结构


序号:和确认号两者共同保证TCP的可靠性。序号是建立在传送的字节流之上,而不是建立在传送的报文段之上。通俗的讲就是序号是以字节为单位进行编号,每个字节对应一个字节流编号,这个工作由TCP协议底层完成,我们用户是感受不到的。一个报文段的序号是该报文段首字节的字节流编号。

假设主机A的一个进程想通过一条TCP连接向主机B上的一个进程发送一个数据流,主机A中的TCP将隐式地对数据流中的每一个字节编号。假定数据流由一个包含500 000字节的文件组成,其MSS(最大报文段长度)为1000字节,数据流的首字节编号是0,如下图所示:

该TCP将为该数据流构建500个报文段,给第一个报文段分配序号0,第二个报文段分配序号1000,以此类推,每一个序号被填入到相应TCP报文段首部的序号字段中

确认号:TCP是全双工的,即主机A在向主机B发送数据的同时,也许也在接收来自主机B的数据。从主机B到达的每个报文段中都有一个序号用于从B流向A的数据。主机A填充进报文段的确认号是主机A期望从主机B收到的下一字节的序号。

例子1:假设主机A已经收到了来自主机B的编号为0-535的所有字节,同时假设它打算发送一个报文段给主机B,主机A等待主机B的数据流中字节536及其后的所有字节,所以主机A会在它发往主机B的报文段的确认号字段中填上536。(即seq + 1)。
例子2:假设主机A已收到主机B的包含字节0-535字节的报文段,以及另一个包含字节900-1000的报文段。由于某种原因,主机A还没有收到字节536-899的报文段。在这个例子里,主机A为了重新构建主机B的数据流,仍在等待字节536(和其后的字节)。因此,A到B的下一个报文段将在确认号字段中包含536。因为TCP只确认该流中到第一个丢失字节为止的字节,所以TCP提供的是累积确认
主机A虽然收到了字节900-1000的报文段,但是并不会在下一个发往主机B的报文段的确认号字段中填1001,因为535后面的字节还没有得到确认,而收到的900-1000字节的报文段属于失序到达,对于失序到达的报文段的处理方法由TCP编程人员去具体实现,有两个基本选择:一是丢弃失序报文段,二是保留失序字节并等待缺少的字节以填补该间隔(这是实践中采用的方法)

标志位
SYN(请求建立连接–synchronous)
FIN (请求断开连接–finish)
RST(重新建立连接–reset 复位报文段)
ACK(确认 – acknowledgement)
URG(表示紧急指针域有效–urgent)
PSH(push操作)所谓Push操作就是指在数据包到达接收端以后,立即传送给应用程序,而不是在缓冲区中排队

窗口大小:用来流量控制,指示接收方愿意接受的字节数量。由接收端填充。

4位 头部长度:标识该TCP头部有多少个32bit字(4字节)。因为4位最大能标识15,所以TCP头部最长是60字节。

16位校验和:由发送端填充,接收端对TCP报文段执行CRC算法以检验TCP报文段在传输过程中是否损坏。注意,这个校验不仅包括TCP头部,也包括数据部分。这也是TCP可靠传输的一个重要保障。

16位紧急指针:是一个正的偏移量。它和序号字段的值相加表示最后一个紧急数据的下一字节的序号。因此,确切地说,这个字段是紧急指针相对当前序号的偏移,不妨称之为紧急偏移。TCP的紧急指针是发送端向接收端发送紧急数据的方法。

TCP头部选项:TCP头部的最后一个选项字段(options)是可变长的可选信息。这部分最多包含40字节,因为TCP头部最长是60字节

TCP连接的建立与释放

三次握手四次挥手

TCP可靠性传输

应答确认

是指每次发送端给接收端发送一段数据m1,接收端收到数据之后会给客户端回复一个ACK报文,表明数据已经收到。在发送方未收到m1的确认信息之前,m1应该保留。直到收到确认信息才能丢弃。

超时重传

超时重传是指当发送端发送数据给接收端的时候会设置一个定时器,当超过定时器的时间,仍然没有接收到来自接收端的应答回复,这时候发送端就认为发送的数据没有到达接收端,将会重新发送数据给接收端。
关于没有接收到数据有两种情况:①发送的数据确实没有到达接收端 ②发送的数据到达了接收端,但是接收端回复的ack报文没有到达发送端,这种情况当接收端再次接到同样的报文的时候会丢弃重复的报文。
超时重传最核心的是确定超时重传的时间,这个时间不能过长,因为会导致访问变慢,但也不能过短,因为报文还没传输完成就认为没有到达,重新发送,引起不必要的重传即时间必须大于往返时间(RTT)。

快速重传

在超时重传中,重点是定时器溢出超时了才认为发送的数据包丢失,快速重传机制,实现了另外的一种丢包评定标准,即如果我连续收到3次dup ACK,发送方就认为这个seq的包丢失了,立刻进行重传,这样如果接收端回复及时的话,基本就是在重传定时器到期之前,提高了重传的效率。

在传输过程中会出现out-of-order的现象,但是在滑动窗口中会有严格的顺序控制,假设有4,5,6三个待接收的数据包,先收到了5,6,协议栈是不会回复对5,6包的确认,而是根据TCP协议的规定,当接收方收到乱序片段时,需要重复发送ACK, 在这个地方会发送报文4 seq的ACK,表明需要报文4没有被接收到,如果此后收到的是报文7,那么仍然要回报文4 seq的ACK如果连续发送3个 dup ACK,接收端认为这个片段已经丢失,进行快速重传。也就是tcp回复的确认号是我下次想接收到的序号。

乱序重排

TCP具有乱序重排的功能。当发送端想接收端发送数据的时候,可能某一条线路堵塞导致先发送的数据可能后到达,对于传输层来说,可能报文顺序乱了,但是传输层会根据报文序号排序,再交给应用层。

流量控制

一般来说,我们希望数据传输的更快一些,不会一次只发一个字节,但是如果太快的话,接收方可能没有足够的时间接收数据,造成数据的丢失。所谓流量控制就是让发送方不要发送的太快,让接收方也有足够的时间接收。TCP利用滑动窗口实现流量控制。

在 TCP 的报头中有一个字段叫做接收通告窗口,这个字段由接收端填充,是接收端告诉发送端自己还有多少缓冲区可以接收数据。于是发送端就可以根据这个接收端的处理能力来发送数据,而不会导致接收端处理不过来。所以发送端就会有一个发送窗口,这个发送窗口的大小是由接收端填充的接收通告窗口的大小决定的,并且窗口的位置会随着发送端数据的发送和接收到接收端对数据的确认而不断的向右滑动,将之称为滑动窗口。



流程:


死锁

死锁的解决

TCP为每一个连接设置一个持续计时器,如果TCP的一端收到另一端的0窗口报文,就是启动持续计时器,让持续计时器时间到的时候,会向另一方发送一个探测报文(携带一字节数据),另一方如果收到之后,会回复自己的窗口状态,如果窗口仍然为0,那么继续启动持续计时器,如果不是0,那么死锁的僵局就可以打破了。


TCP规定即使接收窗口为0,也要接受确认报文段,零窗口探测报文段,携带有紧急数据的报文段。

rwnd:receive Window 接收窗口

注意点:

TCP拥塞控制

拥塞控制概念

 拥塞控制也是通过窗口的大小来控制的,前面的滑动窗口rwnd是怕发送方把接收方缓存塞满,拥塞窗口cwnd是怕把网络塞满。(congestion window )

 在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络性能就要变坏。这种情况就叫做拥塞(congestion)。
 在计算机网络中的链路容量(即带宽)、交换结点中的缓存和处理机等,都是网络的资源。
若出现拥塞而不进行控制,整个网络的吞吐量将随输入负荷的增大而下降。

图示:

理想状态下的拥塞控制是输入负载等于吞吐量。

TCP拥塞控制算法

  • 慢开始算法
  • 拥塞避免算法
  • 快重传算法
  • 快恢复算法

介绍算法之前,我们假定这些条件:

慢开始和拥塞避免

慢开始算法是将拥塞窗口的值指数级增长
拥塞避免算法是将拥塞窗口的值递增增长

图示:

快重传算法


快恢复算法

四种算法的描述:


粘包及解决方案

参考:计算机网络微课堂.湖科大教书匠

运输层协议---TCP协议总结相关推荐

  1. 【计算机网络】传输层 : 总结 ( TCP / UDP 协议 | 寻址与端口 | UDP 协议 | TCP 协议特点 | TCP 连接释放 | TCP 流量控制 | TCP 拥塞控制 ) ★★★

    文章目录 一.传输层 TCP / UDP 协议 ★ 二.寻址端口号 ★ 三.UDP 协议特点 四.UDP 协议首部格式 五.UDP 校验 六.TCP 协议 特点 ★ 七.TCP 报文段首部格式 八.T ...

  2. 传输层协议 ——— TCP协议

    文章目录 TCP协议 谈谈可靠性 TCP协议格式 序号与确认序号 窗口大小 六个标志位 确认应答机制(ACK) 超时重传机制 连接管理机制 三次握手 四次挥手 流量控制 滑动窗口 拥塞控制 延迟应答 ...

  3. 运输层协议——TCP协议

    一. 概述 1. 面向连接:每次使用TCP协议之前,必须建立TCP连接,传送数据完毕后,必须释放TCP连接: 2. 连接只能是点对点(一对一): 3. 提供可靠交付的服务:传送的数据无差错,不丢失,不 ...

  4. 经久不衰的运输层协议 —— TCP协议

    文章目录 TCP基础概念 TCP报文结构 序号和确认号 TCP连接的建立 三次握手 数据发送 TCP连接的断开 超时重传机制 往返时延和超时 往返时延 重传超时间隔公式 回到超时重传 加倍超时间隔 快 ...

  5. 网络协议-TCP协议详解

    本文转载自:https://www.pdai.tech/md/develop/protocol/dev-protocol-tcpip.html 重点:TCP滑动窗口,TCP握手,TCP重传机制. 简述 ...

  6. 【计算机网络】传输层 : TCP 协议 ( TCP 协议特点 | TCP 报文段首部格式 | TCP 报文段控制位 )

    文章目录 一.TCP 协议 特点 二.TCP 报文段首部格式 三.TCP 报文段首部 666 控制位 一.TCP 协议 特点 TCP 协议 特点 : ① 面向连接 : TCP 协议的连接是 " ...

  7. TCP/IP协议——TCP协议

    今天算是对了TCP协议有个肤浅的理解了! 尽管TCP和UDP都是一样的网络层IP,但是TCP却和UDP实现着不一样的服务,TCP是一个面向连接的,可靠地字节流服务! 面向连接是指:两个使用TCP的程序 ...

  8. 传输层协议------TCP协议

    这里写目录标题 协议段格式 确认应答机制 超时重传机制 协议特性 面向连接 三次握手建立连接和四次挥手断开连接 理解TIME_WAIT的状态 解决TIME_WAIT状态引起bind失败的方法 理解CL ...

  9. 网络协议 — TCP协议与HTTP协议

    HTTP HTTP协议是超文本传输协议(默认端口80),服务器传输超文本到本地浏览器的传送协议,HTTP是一个基于TCP/IP通信协议来传送数据的,HTTP就是客户端→服务端的数据传输. 大致工作流程 ...

最新文章

  1. 通过 GitExtensions 来使用 Git 子模块功能
  2. SVN之如何解决从一个svn路径下载项目快速提交到其它svn路径
  3. 【研究方向是SDN该怎么做?】软件定义网络(SDN)的安全挑战和机遇
  4. C++/C--lambda表达式与函数对象【转载】
  5. RT-Thread移植
  6. 数据链路层的一些总结
  7. vs2015打开EXCEL文档范例及其注意事项!!!
  8. 一招判断三元催化堵塞_汽车的氧传感器和三元催化器故障如何判断呢?用这些方法判断...
  9. 花书+吴恩达深度学习(七)优化方法之基本算法(Momentum, Nesterov, AdaGrad, RMSProp, Adam)
  10. Markdown Cookbook by Eric
  11. 华为hcna认证有哪些优势?华为hcna认证好考吗?
  12. lycos搜索引擎_Lycos中国推出全新搜索引擎
  13. 28张高清数据分析全知识地图,强烈建议收藏
  14. 学计算机的人可以定位找人吗,电脑如何实现查找“附近的人”?
  15. Flink二:IngestionTime与ProcessingTime
  16. python中count方法
  17. android 小米8底部黑色高度太高,小米8评测:众多黑科技加持,能否跃身高端行列?...
  18. 老毛桃U盘启动,装Linux
  19. JavaScript的入门(下)
  20. MT6755 datasheet资料,MT6755芯片处理器参数

热门文章

  1. 苹果uwb_在哪都能找到你!苹果新iPhone将支持UWB高精度室内定位
  2. 百度搜索引擎中的快照及快照更新机制
  3. msgsnd/msgrcv
  4. 用vb.net编写的软件有哪些?
  5. 几款主流的App统计工具解析:友盟、Talking Data、openinstall...
  6. vue中element ui 中tree组件怎么自定义前缀图标呢?
  7. java中哪些类是线程安全的
  8. 零基础Python完全自学教程3:Python开发工具介绍
  9. idea关闭所有打开的项目窗口
  10. 【中间件技术】第三部分 Java企业版规范与中间件(8) EJB 构件开发