zoukankan      html  css  js  c++  java
  • MOOC_TCP简述

    TCP基本特点

    1. 可靠的, 按序的字节流
    2. 流水线机制
      TCP拥塞控制可流量控制机制设置窗口尺寸
    3. 发送方/接收方都拥有缓存
    4. 全双工: 同一连接中能够双向传输数据
    5. 面向连接
      a. 通信双方在发送数据之前必须建立连接
      b. 连接状态只在连接的两端中维护,在沿途的节点不维护连接状态
      c. TCP连接包括:两台主机上的缓存, 连接状态变量, socket等
    6. 流量控制

    TCP段结构

    TCP的工作流程简述

    TCP是面向连接的协议,在进行数据传输之前要先建立客户机到服务器的连接,然后才能进行通信,TCP的工作流程如下:

    1. 连接的建立
    2. 数据传输
    3. 连接的拆除

    连接的建立 & 数据传输

    连接的建立的过程通常被称为三次握手: 第一次: 客户端告诉服务器我想和你建立连接, 数据传输序号从client_isn开始, 第二次服务器告诉客户端, 我同意该连接, 我的序号是server_isn, 我期望收到的段序号是client_isn + 1, 第三次, 客户端向服务器报告,对连接进行确认, 同时可以传输数据.

    1. 连接建立主要完成以下任务:
      • 始化TCP变量包括:生成套接字 分配buffer, 生成流量控制信息等.
      • 客户端发起请求
      • 客户端等待客户的连接请求
    2. 客户端发送 TCP SYN段到服务器
      • SYN段: 该段不包含上层应用的任何信息, 该段的SYN比特被置为1, 客户随机分配一个初始序号(client_isn)到Sequence numbers字段
    3. 服务器接收到客户机的SYN段后, 提取 TCP SYN报文段, 为该TCP连接分配TCP缓存和变量, 并向该客户端分配允许连接的报文段
      • 该报文也不含上层应用的任何信息, SYN比特置为1, ACK = client_isn + 1, Sequence number = server_isn
    4. 客户端接收到服务器的信息后, 为该TCP连接分配缓存和变量, 并发送另一个报文段, 该报文段中可以传输上层应用的数据
      • 该报文段: SYN bit = 0 , Sequence number = client_isn + 1, ACK = server_isn + 1, 因为连接已经建立,所以此后的报文段中 SYN bit 都等于0

    连接的拆除

    1. 客户端向服务器发送TCP FIN 段
    2. 服务器收到FIN, 回复ACK, 关闭连接, 发送FIN
    3. 服务器收到FIN, 回复ACK
      1. 进入等待-如果收到FIN, 会重新发送ACK
    4. 服务器收到ACK, 连接关闭

    TCP的可靠数据传输机制

    TCP在IP层提供的 不可靠 的数据传输的基础上提供可靠的数据传输.

    1. 流水线机制
    2. 累积确认机制
    3. 使用单一定时器定时实现重传

    可靠数据传输是通过 校验和 + 序列号 + ACK + 重传 +定时器 来实现的

    校验和 + 分组序列号 + ACK + 重传 可以解决传输过程中发生的比特位翻转的问题, 使用 定时器 + 重传 可以解决传输过程中发生丢包的问题, 可靠数据传输要解决的重要问题是定时器超时时间的设定

    超时时间的设定

    超时时间的应该大于RTT,过短,会引起不必要的重发, 过长对段丢失的反应慢, 故,

    [定时时间 = RTT时间 + 安全边界 ]

    RTT的变化越大, 所要求的安全边界也就越大

    如何估算RTT

    测量每次发送到收到ACK的时间作为SampleRTT, 多次测量求平均值形成估计值EstimatedRTT

    [EstimatedRTT = (1 - α) * EstimatedRTT + α * SimpleRTT (α的典型值: 0.125) ]

    估算安全边界

    安全边界的建立是为了解决在RTT变动时, 超时时间仍然能够大于RTT, 可见, 安全边界与RTT的变化有关, 测量每一次的EstimatedRTT 与当次的SimpleRTT的差值, 即可得到RTT的动态变化范围, 每一次数据传输都计算该差值,并加权平均, 即可得到一个平均的安全边界(DevRTT)

    [DevRTT = (1 - β) * DevRTT + β * |SampleRTT - EstimatedRTT| ( β的典型值为0.25 ) ]

    考虑一定的余量, 通常使用n倍的DevRTT, 故, 超时时间公式为

    [TimeoutInterval = EstimatedRTT + 4 * DevRTT ]

    针对超时时间过长的快速重传机制

    在实际使用中, 如果TCP连接发生一次超时, 根据超时时间计算公式, 超时时间将会被重新设置的很大, 导致系统响应变慢, 如果Sender发送了多个分组, 如果某个分组丢失, 会产生多个相同的ACK.

    假定如果收到三个重复的ACK则认为该段数据已经丢失, 则在定时器超时之前进行重传.

    TCP流量控制机制

    流量控制主要解决, 发送方发送太快而导致接收方淹没(buffer溢出)的问题(也可能是上层应用处理数据较慢,导致接收方接收速度相对较慢)
    流量控制有别于拥塞控制, 流量控制更侧重于,端与端之间的速度匹配, 拥塞控制更关心传输网络上的速度匹配.

    [RcvBuffer = space room + TCPdataInBuffer ]

    Buffer中的可用空间spaceroom:

    [Spaceroom = RcvBuffer - TCPdataInBuffer =RcvBuffer - [LastByteRcvd - LastByteRead] ]

    计算出来得到的Spaceroom告诉发送方, 还能够接收多少数据,借此实现速度匹配.

  • 相关阅读:
    Sql题目精选练习
    SqlServer2008数据库的备份与还原
    SqlServer视图介绍以及创建方式
    Java反射详解
    for(foo('a') ; foo('b') && (i<2);foo('c'))的执行结果
    jdk与jre与jdk都是干什么的有什么区别和jvm详解:
    List去重为什么要写equals(),hashCode()方法
    String类的常用方法以及知识点总结
    o enclosing instance of type ArrayList_day02 is accessible. Must qualify the allocation with an enclosing instance of type ArrayList_day02
    JAVA整理01--面向对象基础
  • 原文地址:https://www.cnblogs.com/sophomores/p/12641022.html
Copyright © 2011-2022 走看看