【计算机网络】传输层——TCP

TCP

TCP协议的特点
  • 主要解决传输的可靠、有效、无丢失和不重复问题;
  • 主要特点:
    1. TCP是面向连接的传输层协议;
    2. 每条TCP连接只能有两个端点,每条TCP连接只能是点对点的;
    3. TCP提供可靠的交付服务,保证传送的数据无差错、不丢失、不重复且有序;
    4. TCP提供全双工通信,允许通信双方的应用进程在任何时候都可以发送数据,为此TCP连接的两端都设有发送缓存和接收缓存,用来临时存放双方通信的数据;
      • 发送缓存用来暂时存放:
        1. 发送应用程序传送给发送方TCP准备发送的数据;
        2. TCP已发送但尚未收到确认的数据;
      • 接收缓存用来暂时存放:
        1. 按序到达但尚未被接收应用程序读取的数据;
        2. 不按序到达的数据;
    5. TCP是面向字节流的,虽然应用程序和TCP的交互是一次一个数据块,但TCP把应用程序交下来的数据仅视为一连串的无结构的字节流;
TCP报文段
  • TCP报文段既可以用来运载数据,又可以用来建立连接、释放连接和应答;

TCP报文段

  • 各字段意义:
    1. 源端口和目的端口:各占2B,端口是传输层与应用层的服务接口,传输层的复用和分用功能都要通过端口实现;
    2. 序号:占4B,范围0~232-1,共232个序号,序号字段的值是指本报文段所发送的数据的第一个字节的序号;
    3. 确认号:占4B,是期望收到对方下一个报文段的第一个数据字节的序号。若确认号为N,则表明到序号N-1为止的所有数据都已正确收到;
    4. 数据偏移:即首部长度,占4位,表示首部长度,指出TCP报文段的数据起始处距离TCP报文段的起始处有多远;
    5. 保留:占6位,保留为今后使用,目前应置为0;
    6. 紧急位URG:URG = 1表明紧急指针字段有效,告诉系统有紧急数据应尽快传送;
    7. 确认位ACK:ACK = 1时确认号字段有效,在连接建立后所有传送的报文段都必须把ACK置1;
    8. 推送位PSH:接收方TCP收到PSH = 1的报文段,尽快交付给接收应用程序,而不再等到整个缓存都填满后再向上交付;
    9. 复位位RST:RST = 1时,表明TCP连接中出现严重差错,必须释放连接,然后重新建立传输连接;
    10. 同步位SYN:同步SYN = 1表示这是一个连接请求或连接接受报文;
    11. 终止位FIN:用来释放一个连接,FIN = 1时,表明此报文段的发送方的数据已发送完毕,并要求释放传输连接;
    12. 窗口:占2B,范围0~216-1,指出现在允许对方发送的数据量,接收方的数据缓存空间是有限的,因此用窗口值作为接收方让发送方设置其发送窗口的依据;
    13. 校验和:占2B;
    14. 紧急指针:占2B,紧急指针仅在URG = 1时才有意义,指出本报文段中紧急数据共有多少字节,紧急数据在报文段数据的最前面;
    15. 选项:长度可变;
    16. 填充:为了使整个首部长度时4B的整数倍;
TCP连接管理
  • TCP连接的三个阶段:连接建立、数据传送、连接释放;
  • 需解决问题:
    1. 钥匙每一方能够确知对方的存在;
    2. 要允许双方协商一些参数,如最大窗口值,、是否使用窗口扩大选项、时间戳选项及服务质量等;
    3. 能够对运输实体资源,如缓存大小、连接表中的项目进行分配;
  • 连接的建立采用客户/服务器方式,主动发起连接建立的应用进程称为客户,而被动等待连接建立的应用进程称为服务器;
TCP连接的建立

TCP三次握手

  • 连接建立前,服务器进程处于LISTEN(收听)状态,等待客户的连接请求;
  • 连接建立步骤:
    • 第一步:
      • 客户机的TCP首先向服务器的TCP发送连接请求报文;
      • SYN = 1, seq = x;
    • 第二步:
      • 服务器的TCP收到连接请求报文段后,如同意建立连接,则向客户机发回确认,并为该TCP连接分配缓存和变量;
      • SYN = 1, ACK = 1, seq = y, ack = x+1;
    • 第三步:
      • 当客户机收到确认报文段后,还要向服务器给出确认,并为该TCP连接分配缓存和变量;
      • ACK = 1, seq = x+1, ack = y+1;
  • 提供全双工通信,因此通信双方的应用进程在任何时候都能发送数据;

注意

  • 服务端的资源是在完成第二次握手时分配的,客户端资源是在完成第三次握手时分配的;
  • 使得服务器易于收到SYN洪范攻击;
TCP连接的释放

释放TCP连接

  • 连接释放步骤:
    • 第一步:
      • 客户机打算关闭连接时,向其TCP发送连接释放报文段,并停止发送数据,主动关闭TCP连接;
      • TCP是全双工的,可以想象为一条TCP连接上有两条数据通路,发送FIN的一端不能在发送数据,即关闭了其中一条数据通路,但对方还可以发送数据;
      • FIN = 1, seq = u;
    • 第二步:
      • 服务器收到连接释放报文段后即发出确认;
      • 此时,从客户机到服务器这个方向的连接就释放了,TCP连接处于半关闭状态,但服务器若发送数据,客户机仍要接收,即从服务器到客户机这个方向的连接并未关闭;
      • ACK = 1, seq = v, ack = u+1;
    • 第三步:
      • 若服务器已经没有要向客户机发送的数据,就通知TCP释放连接;
      • FIN = 1, ACK = 1, seq = w, ack = u+1;
    • 第四步:
      • 客户机收到连接释放报文段后,必须发出确认;
      • ACK = 1, seq = u+1, ack = w+1;
TCP可靠传输
  • TCP的任务是在IP层不可靠的、尽力而为服务的基础上建立一种可靠数据传输服务;
  • TCP提供的可靠数据传输服务保证接收方进程从缓存区读出的字节流与发送方发出的字节流完全一样;
  • TCP使用了校验、序号、确认和重传等机制达到可靠传输目的;
序号
  • TCP首部的序号字段用来保证数据能有效提交给应用层,TCP把数据视为一个无结构但有序的字节流;
  • 序号建立在传送的字节流之上,而不建立在报文段之上;
  • TCP连接传送的数据流中的每个字节都编上一个序号,序号字段的值是指本报文段所发送的数据的第一个字节的序号;
确认
  • TCP首部的确认号是期望收到对方的下一个报文段的数据的第一个字节的序号;
  • 发送方缓存区会继续存储那些已发送但未收到确认的报文段,以便在需要时重传;
  • TCP默认使用累计确认,即TCP只确认数据流中至第一个丢失字节为止的字节;
重传
  • 有两种事件会导致TCP对报文段进行重传:超时和冗余ACK;
超时
  • TCP每发送一个报文段,就对这个报文段设置一次计时器,计时器设置的重传时间到期但还未收到确认时,就要重传这一报文段;
  • 为计算超时计时器的重传时间,TCP采用一种自适应算法,它记录一个报文段发出的时间,以及收到相应确认的时间,这两时间之差称为报文段的往返时间RTT,TCP保留了RTT的一个加权平均往返时间RTTs,他会随新测量RTT样本值的变化而变化;
冗余ACK(冗余确认)
  • 超时触发重传存在的一个问题时超时周期往往太长;
  • 发送方通常可在超时事件发生之前通过注意所谓的冗余ACK来较好地检测丢包情况;
  • 冗余ACK就是再次确认某个报文段地ACK,而发送方先前已收到过该报文段地确认;
TCP流量控制
  • TCP提供流量控制服务来消除发送方发送速率太快使接收方缓存区溢出地可能性,因此可以说流量控制是一个速度匹配服务,匹配发送方的发送速率与接收方的读取速率;
  • TCP提供一种基于滑动窗口协议的流量控制机制;
    • 在通信过程中,接收方根据自己接收缓存的大小,动态地调整发送方地发送窗口大小,这称为接收窗口rwnd;
    • 发送方根据其对当前网络拥塞程度的估计而确定的窗口值,这称为拥塞窗口cwnd,其大小与网络带宽和时延密切相关;
  • 一个例子

利用可变窗口进行流量控制

  • 传输层和数据链路层的流量控制的区别:
    • 传输层定义端到端用户之间的流量控制;
    • 数据链路层定理两个中间的相邻结点的流量控制;
    • 传输层的窗口协议的窗口大小可以动态变化;
    • 数据链路层的窗口协议的窗口大小不能动态变化;
TCP拥塞控制
  • 拥塞控制是指防止过多的数据注入网络,保证网络中的路由器或链路不致过载;
  • 拥塞控制与流量控制的区别:
    • 拥塞控制是让网络能够承受现有的网络负荷,是一个全局性的过程,涉及所有的主机、所有的路由器,以及与降低网络传输性能有关的所有因素;
    • 流量控制是指点对点的通信量控制,是个端到端的问题,他所要做的是一直发送端发送数据的速率,以便使接收端来得及接收;
  • 拥塞控制与流量控制的相似:
    • 都通过控制发送方发送数据的速率来达到控制效果;
  • 进行拥塞控制的4种算法:
    • 慢开始;
    • 拥塞避免;
    • 快重传;
    • 快恢复;
  • TCP协议要求发送方维护以下两个窗口:
    1. 接收窗口rwnd:
      • 接收方根据目前接收缓存大小所许诺的最新窗口值,反映接收方的容量;
      • 由接收方根据其放在TCP报文的首部的窗口字段通知发送方;
    2. 拥塞窗口cwnd:
      • 发送方根据自己估算的网络拥塞成都而设置的窗口值,反映网络的当前容量;
      • 只要网络未出现拥塞,拥塞窗口就再增大一些,以便把更多的分组发送出去;
      • 只要网络出现拥塞,拥塞窗口就减小一些,以减少注入网络的分组数;
    • 发送方上限值应取接收窗口rwnd和拥塞窗口cwnd中较小的一个,即:
      • 发送窗口上限值 = min[rwnd, cwnd];
慢开始和拥塞避免
慢开始算法
  • 在TCP刚连接好并开始发送TCP报文段时,先令拥塞窗口cwnd = 1,即一个最大报文段长度MSS;
  • 每收到一个对新报文段的确认后,将cwnd加1,即增大一个MSS;
  • 使用慢开始算法后,每经过一个传输轮次RTT,cwnd就会加倍,即cwnd的大小指数式增长;
  • 直到cwnd增大到一个规定的慢开始门限ssthresh阈值,然后改用拥塞避免算法;
拥塞避免算法
  • 每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,使拥塞窗口cwnd按线性规律缓慢增长;
  • 归纳如下:
    1. swnd < ssthresh,使用慢开始算法;
    2. swnd > ssthresh,停止使用慢开始算法而改用拥塞避免算法;
    3. swnd = ssthresh,即可使用慢开始算法,又可使用拥塞避免算法;
慢开始和拥塞避免算法的实现过程

慢开始和拥塞避免的实现过程

快重传和快恢复
快重传
  • 当发送方连续收到三个重复的ACK报文时,直接重传对方尚未收到的报文段,而不必等待那个报文段设置的重传计时器超时;
快恢复
  • 原理:当发送方连续收到三个冗余ACK时,执行“乘法减小”算法,把慢开始门限ssthresh设置为此时发送方swnd的一半;
快恢复算法的实现过程

快恢复算法的实现过程

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值