TCP协议详解

TCP协议详解

TCP协议:传输控制协议,TCP协议是一个基于连接的协议,连接双方可见提供可靠的数据传输。相较于IP协议,更靠近应用层,可以为用户提供更强的可操作性。

1、TCP协议特点

TCP协议提供,面向连接,面向字节流的可靠的传输服务。使用TCP的双方首先必须建立连接,然后才能开始数据的发送与接收,因为TCP是面向连接的,因此只能提供端到端的数据传输。另外为了维护这个有状态的连接,双方都需要开辟一些额外的资源,进行保存状态相关的一些东西。
TCP协议是面向字节流的,也就是说,当TCP报文被分多次写到发送缓冲区后,发送缓冲区可能会将这些数据可能会封装成一个或者多个报文直接发送。所以TCP报文的发送个数与应用程序执行写操作的个数是没有固定的关系的。而且当数据到达接收方缓冲区后,接收方可能一次也有可能分多次读取TCP报文,这取决于应用进程缓冲区的大小,因此应用进程读取的次数,与发送方写的次数没有固定关系。

而UDP则不然,这种面向数据报的协议,应用程序每写一个报文,UDP模块就需要将其封装成一个报文,然后发送出去,接收方必须针对每一个数据报进行读操作。也就是说发送端发送的次数与接收端接收的次数是一致的。

在这里插入图片描述

2、 TCP协议报头说明

在这里插入图片描述

  • 源端口号,和目的端口号,确定收发方的进程。

  • 32位序号,32位确认序号:发送的数据的序号,在三次握手的时候确定初始值。

  • 4位首部长度:确定TCP报头的大小,以4字节为单位,因此TCP报头最大15 * 4 = 60个字节。

  • 6位保留,方便以后的拓展

  • 6位标志位

    • URG:标明紧急指针是否有效。
    • ACK:确认信号是否有效,携带ACK的报文是应答报文。
    • PSH:接受端立即将数据从缓冲区取走
    • RST:复位报文段,重新建立连接,或者关闭连接
    • SYN:请求建立连接
    • FIN:结束标志位,通知对端,本端要断开连接
  • 16位窗口大小:接收方通知发送方当前接收缓冲区的空闲空间是多少。是进行流量控制的一个手段。

  • 16位校验和:对整个TCP头部进行校验

  • 16位紧急指针:指向数据的末尾,表明该段数据为紧急数据

  • 选项部分:选项部分也是一个非常重要的字段,如MSS信息(双方协商的最大报文大小,一般是MTU-20-20 分别减去TCP头和IP头,这样就不用IP分片了),窗口的扩大因子,是否开启SACK,选择性确认功能。

  • 数据:发送的数据 。

3、TCP的超时重传机制

当网络状况不好,数据就会出现丢包,超时等现象。为了保证可靠性,TCP每发送一个报文都要维护一个定时器,当超过一定的时间还没有收到确认报文的话,发送端就认为这个报文丢失了,因此就会重新发送这个报文,而且会重置定时器,虽然超时会触发TCP的重传现象,这个比较被动,只能等到一定的超时时间后再进行重传,还有一种快速重传机制,用于快速重传丢失的数据报,不需要等到指定时间后再进行重传。

4、TCP的拥塞控制—取决于网络状态

TCP还有一个重要的任务,就是最大可能的提高网络利用率,降低丢包率。这个就是所谓的拥塞控制。拥塞控制包括四个部分,分别是慢启动,快速恢复,快速重传,快速恢复。发送方一次放松的数据大小取决于接收端的窗口,和拥塞控制变量的较小值。

网络拥塞是造成数据丢失最主要的原因,因此在传输过程中如何避免拥塞是一个主要的问题。
TCP流控制就是使得发送者的传输速率与接收者和网络的传输速率相匹配。接收者通过16位窗口大小(通告窗口)告知发送方还可以发送多少数据且无需等待ACK。
刚开始发送的时候,虽然滑动窗口的值很大,但为了能够发送可靠的数据,一次性不能发送过大,因为此时不清楚网络状况,很有可能造成丢包。
因此先发送一点数据,进行测试,同时启动一个计时器,如果接收端的ACK确认很快到达代表网络状况良好,可以逐步扩大发送的数据量,这个过程称为网络探测。当某一次的ACK回复很慢的话,则发送量重新置为1,重复网络探测过程。这个过程也就是所谓TCP的慢启动快增长。
当增长的一定的大小,将会维持不变,如果网络出现问题,又回退回到之前的大小。
在这里插入图片描述

5、TCP的确认应答机制与超时重传机制

发送端将数据发送给接受端,如果接受端接收到数据,则回复一个ACK报文包含下一个需要发送的报文的开始ID,代表成功接收,否则发送端重新发送该段报文。当然可能会由于网络阻塞等原因,导致报文延迟到达,但发送方已经重发,这种情况,对于后面到来的报文则会被丢弃。

6、 TCP的滑动窗口

传输层会将数据拆成段,基于效率的问题,每次发送的时候不可能一段一段发送,等到收到ACK确认后,再发送另一段,也就是串行发送。这样效率很低,因此可以将多个段一起发送,使得等待ACK的时间重叠在一起。

发送多个数据段之后,每收到一个ACK确认报,则在发送缓冲区中将该段删除,同时还引入了TCP的捎带应答机制。也就是如果前面的ACK丢失,只要后面的ACK确认信息到达之后,也可以确认是前面的ACK丢失而不是数据丢失。如果数据段丢失,则接受端会向发送端发送丢失的序列号,代表该序列号的数据还没收到,如果发送了三次,则发送端重新发送数据段。

7、 TCP的流量控制—取决于滑动窗口

接收端处理数据的能力是有限的如果接收缓冲区,已经接近于饱和而发送端还在不断发送数据,则会造成丢包,重传等一系列问题,因此TCP支持根据接受端的处理能力,来决定发送端的发送速度,这个机制就叫做流量控制。
接受端将自己的空闲缓冲区大小,放入TCP报文的窗口大小字段中,通过ACK通知发送端,如果接收区缓冲区已满,则这个字段的值为0,这时发送方不再发送数据,而是定期发送一个窗口探测数据段,使得接受端把最新的缓冲区大小告诉发送端。流量控制主要依赖上述的滑动窗口来实现的。

8、TCP的延迟应答机制

因为缓冲区的空闲空间决定滑动窗口的大小,当数据到达接收缓冲区后,可能会暂存一会然后才有可能被处理,因此如果延迟应答的时间大于暂存的时间,则会使得滑动窗口的空间增大,进而提升吞吐量。

9、TCP的粘包问题

因为TCP是面向字节流的,且数据存储在缓冲区中因此必然导致多个数据包粘连在一起,不能找到划分界限(TCP头部没有UDP头中的报文长度这个字段)。

解决方法:
对于定长的数据报:每次都按该报文的长度发送即可。
对于非定长的数据段:可以模仿UDP的做法在报头的位置,设置一个报文总长度的字段,这样就知道每次发送的报文的总的长度。也可以在报文与报文之间设立间隔,明确划分报文间隔。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值