面向数据连接: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



目录
相关文章
无缝融合:使用 Python 和 PyFFmpeg 合并视频的完整指南
使用Python和PyFFmpeg合并视频教程:安装pyffmpeg和subprocess模块,编写merge_videos函数,通过ffmpeg命令行工具进行视频拼接。运行脚本将多个.mp4文件合并为一个,并保存为merged_video.mp4。简单易用,提升内容创作效率。
|
监控 网络协议 物联网
一款轻量级的通信协议---MQTT (内含Linux环境搭建)
**MQTT协议摘要** MQTT是一种轻量级的发布/订阅型网络协议,适用于低带宽、高延迟或不可靠的网络环境,尤其适合物联网(IoT)设备。其主要特点包括: 1. **发布/订阅模型**:设备通过主题进行通信,发布者无需知道订阅者,订阅者也不需知道消息来源。 2. **轻量级**:协议头部小,减少网络负载,适合资源受限的设备。 3. **断线重连**:支持客户端在失去连接后重新连接,保持通信。 4. **服务质量级别(QoS)**:提供0(最多一次)、1(至少一次)和2(恰好一次)三种级别,保证消息传递的可靠性。
503 0
|
存储 数据可视化 数据挖掘
实时数据分析系统的构建与优化
【7月更文挑战第29天】实时数据分析系统的构建与优化是一个复杂而细致的过程,需要从需求分析、数据源确定、数据采集与传输、数据处理与分析、数据存储、数据可视化、系统部署与配置、监控与优化等多个方面进行综合考虑。通过选择合适的技术栈和优化策略,可以构建出高效、稳定的实时数据分析系统,为企业决策提供强有力的支持。
|
数据采集 传感器 存储
ESP32+MQTT+MySQL实现发布订阅【气味数据收集】
ESP32+MQTT+MySQL实现发布订阅【气味数据收集】
ESP32+MQTT+MySQL实现发布订阅【气味数据收集】
|
存储 编解码 算法
视频基础知识 1
视频基础知识
990 0
|
存储 网络协议 安全
深入解析TCP/IP协议栈:了解网络通信的核心
深入解析TCP/IP协议栈:了解网络通信的核心
面试官:Redis分布式锁超时了,任务还没执行完怎么办?
今天主要分享的是面试中常见的redis的一些面试内容。如果你正好需要刚好可以帮你回顾一下,如果不需要可以收藏起来后面用到的时候翻出来回顾。
|
Web App开发 测试技术 API
Python 资源大全中文版
GitHub 上有一个 Awesome - XXX 系列的资源整理,资源非常丰富,涉及面非常广。awesome-python 是 vinta 发起维护的 Python 资源列表,内容包括:Web框架、网络爬虫、网络内容提取、模板引擎、数据库、数据可视化、图片处理、文本处理、自然语言处理、机器学习、日志、代码分析等。
3097 0
MFC 对话框编程 -- 总结 .
一、创建对话框对象 1.首先利用资源编辑器创建对话框资源,并针对该对话框资源定义一个对话框类:class   CTestDlg :  public CDialog 2.创建话话框对象 模态对话框的创建:     如:      CTestDlg    dlg;      dlg.DoModal();   非模态对话框创建:    如:    CTestDlg    dlg;    dlg.Create(IDD_DIALOG, this);    但这样是得不到一个正常显示的非模态对话框的。
1245 0