面向数据连接:TCP(上)

简介: 面向数据连接:TCP(上)

面向连接的传输: TCP



TCP:概述


  • 提供的是点对点的服务: 一个发送方,一个接收方
  • 可靠的、按顺序的字节流 : 没有报文边界
  • 管道化(流水线): TCP拥塞控制和流量控制设置 窗口大小
  • 发送和接收:


1691198643691-04133456-0f92-4b10-95cc-ce28c1758bcf.png


  • 全双工数据 : 在同一连接中数据流双向流动 ,两者可以互相发 ( ==MSS:最大报文段大小 [任意一个网络都有它最大的传输部分,如果应用交互的报文非常长的话,就必须打成一个个MSS的大小。每层都要加上头部信息==])
  • 面向连接: 在数据交换之前,通过握手(交换控制报文) 初始化发送方、接收方的状态 变量
  • 有流量控制: 发送方不会淹没接收方


段结构


TCP报文段结构


1691198768540-4c5864d0-ae6e-4c96-83ee-57e04f6e00ba.png

源端口号:16bit


目标端口号: 16bit


序号: 32bit


TCP序号,确认号:


序号:


  • 报文段首字节 的在字节流的编号


如果初始序号为X, 那么第n个序号就是X + n*MSS


序号具体就是: 上层交互的报文 ,我们按照MSS为单位,切割成为一个个的MSS报文段。 每个TCP都有头部和Body部分, Body部分就是MSS的载荷部分。载荷部分(Body)中的第一个字节就是MSS在整个报文中的偏移量.


确认号:


  • 期望从另一方收到的下一个字节的序号
  • 累积确认


发送方发送, 接收方接收, 假设接收方发送了ACK为555, 那么就说明接收方接收到了554及其之前的所有字节。而且期望发送方从556的序号开始发送


首部长度:


  • 4bit


保留未用:不太清楚


标志位: UAPRSF


接收窗口 : 用于流量控制。 (如果接收窗口为 X, 那么就表示能接收 Xbit的数据)


紧急指针: 不怎么用。


1691198863065-8ce65e94-4c44-42b8-a341-cfe69c728821.png

1691200359097-bbae0043-067a-46b4-ac7d-693dacfacc96.png

TCP面临的通信场景(往返延时(RTT)和超时 )


采用自适应的策略和计算。


1.怎样设置TCP 超时?


如果比RTT要长 , 但RTT是变化的


如果太短:太早超时 会产生不必要的重传


如果太长:对报文段丢失 反应太慢,消极


2.怎样估计RTT?


SampleRTT:测量从报文段发出到 收到确认的时间


如果有重传,忽略此次测量


SampleRTT会变化,因此估计的 RTT应该比较平滑


对几个最近的测量值求平均,而 不是仅用当前的SampleRTT


3.EStimatedRTT(估计的往返延迟时间)的计算:


EstimatedRTT = (1- a)*EstimatedRTT + a*SampleRTT


  • 指数加权移动平均
  • 过去样本的影响呈指数衰减
  • 推荐值:a = 0.125


往返延迟时间分布:


1691200839121-08539a93-dcfb-49e1-9380-e5007001e4b2.png

设置超时


平均值越大, 我们设置的超时时间就需要变大


往返延迟的变化越大, 就会越分散 , 超时时间就需要设置的越大。


EstimtedRTT + 安全边界时间


  • EstimatedRTT变化大 (方差大 ) -> 较大的安全边界时间

SampleRTT会偏离EstimatedRTT多远:


1691201044568-73300524-9eee-42b2-975e-7bee25c811be.png


当前的采样值, 离偏差程度的一个平均值。


可靠数据传输(TCP怎么实现RDT)


我们知道IP提供的是不可靠的服务 ,而TCP向上层提供的确是可靠的服务, 那么这是如何实现的呢 ?


TCP在IP不可靠服务的基础上 建立了rdt


  • 管道化的报文段 • GBN or SR (它实现了两者的混合体)
  • 累积确认(像GBN)
  • 单个超时重传定时器(像GBN)
  • 是否可以接受乱序的,没有规范


通过以下事件触发重传


  • 超时(只重发那个最早的未确认 段:SR)
  • 重复的确认 ( 例子:收到了ACK50,之后又收到3 个ACK50 )


首先考虑简化的TCP发 送方:


  • 忽略重复的确认
  • 忽略流量控制和拥塞控 制


TCP 发送方(简化版)


1691201612636-1d1f1429-62e9-4c20-bead-f38eb091b53c.png


TCP发送方事件:


从应用层接收数据:


  • 用nextseq创建报文段
  • 序号nextseq为报文段首字 节的字节流编号
  • 如果还没有运行,启动定 时器
  • 定时器与最早未确认的报文 段关联
  • 过期间隔: TimeOutInterval


超时:


  • 重传后沿最老的报文段
  • 重新启动定时器


收到确认:


  • 如果是对尚未确认的报 文段确认
  • 更新已被确认的报文序号
  • 如果当前还有未被确认的 报文段,重新启动定时器

1691201735775-63948737-c1cc-4f9c-979b-76e501285804.png


ACK7: 表示7之前的都发送了并且已经得到了确认。接下来就需要从8号开始


TCP: 重传


1691202649928-8f124a23-d80c-4870-8d83-cfb137c63634.png1691202664375-fb200b48-d303-4d5c-8767-941eb814b8b5.png



目录
相关文章
|
6天前
|
网络协议 算法 Linux
TCP教程:详解TCP连接过程
TCP教程:详解TCP连接过程
154 0
|
6天前
|
网络协议 算法 安全
TCP 连接建立
TCP 连接建立
33 0
|
9月前
|
网络协议
建立TCP的连接的三次握手
刚才咱们一起学了四次挥手,这来看看三次握手!
52 1
|
9月前
|
网络协议 算法
面向数据连接:TCP(下)
面向数据连接:TCP(下)
77 0
|
网络协议
TCP建立连接的三次握手
看了点网络的书,回顾下TCP的连接细节,记一下
166 0
TCP建立连接的三次握手
|
缓存 网络协议
【计算机网络】传输层 : TCP 连接管理 ( TCP 连接建立 | 三次握手 | TCP 连接释放 | 四次挥手 )
【计算机网络】传输层 : TCP 连接管理 ( TCP 连接建立 | 三次握手 | TCP 连接释放 | 四次挥手 )
148 0
【计算机网络】传输层 : TCP 连接管理 ( TCP 连接建立 | 三次握手 | TCP 连接释放 | 四次挥手 )
|
缓存 网络协议
TCP连接的 三次握手
TCP连接的 三次握手
|
网络协议
tcp建立连接为什么需要三次握手
这是一个看似很“简单”的问题,但貌似并没有一个官方统一的答案。搜索了相关的资料,列举出一些答案。 以下部分转载自:tcp建立连接为什么需要三次握手 在《计算机网络》一书中其中有提到,三次握手的目的是“为了防止已经失效的连接请求报文段突然又传到服务端,因而产生错误”,这种情况是:一端(client)A发出去的第一个连接请求报文并没有丢失,而是因为某些未知的原因在某个网络节点上发生滞留,导致延迟到连接释放以后的某个时间才到达另一端(server)B。
1063 0