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

2023-11-04

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的一半;
快恢复算法的实现过程

快恢复算法的实现过程

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【计算机网络】传输层——TCP 的相关文章

  • 视频流上的 TCP 与 UDP

    我刚从网络编程考试回来 他们问我们的问题之一是 如果您要传输视频 您会使用 TCP 还是 UDP 请解释一下存储视频和实时视频流 对于这个问题 他们只是希望得到一个简短的答案 TCP 用于存储视频 UDP 用于实时视频 但我在回家的路上想到
  • 自动打开命名管道和 tcp\ip

    我正在安装一个需要修改 SQL Server 的新产品 具体来说 启用 tcp ip 并打开命名管道 我知道如何手动完成 我想要的是一种通过 SQL 或 C 代码为新客户自动化执行此操作的方法 我希望有任何关于正确方向的建议 您可以使用 C
  • 是否可以找到哪个用户位于 localhost TCP 连接的另一端?

    这是一个编程问题 但它是 Linux Unix 特定的 如果我从本地主机获得 TCP 连接 是否有一种简单的方法可以告诉哪个用户在 C 程序内建立了连接而无需 shell 我知道这对于 Unix 域套接字来说并不太难 我已经知道远程 IP
  • 为什么我收到的数据包数据大小大于mss?

    我在两台 PC 上使用 ifconfig ethX mtu 300 修改了 MTU 并使用 netperf 测试网络 我用 WireShark 嗅探了 SYN 数据包中的 MSS 260 但我得到了一些大于 260 的数据包 为什么 嗅探器
  • 当使用环回地址使用 TCP/IP 套接字进行 IPC 时,常见的网络堆栈是否会跳过将消息帧封装在较低级别的 PDU 中?

    在某些环境 例如 Java 中 很自然地使用 TCP IP 套接字通过 localhost 地址 IPv4 中的 127 0 0 1 或 IPv6 中的 1 在同一主机上的进程之间传递消息 因为Java倾向于不在其API中公开其他IPC机制
  • 如果其中一台机器死机,TCP 连接如何终止?

    如果两个主机 A 和 B 之间建立了 TCP 连接 假设主机 A 已向主机 B 发送了 5 个八位字节 然后主机 B 崩溃了 由于未知原因 主机 A 将等待确认 但如果没有收到确认 将重新发送八位字节并减小发送者窗口大小 这将重复几次 直到
  • UWP 无法在两个应用程序之间创建本地主机连接

    我正在尝试在两个 UWP 应用程序之间设置 TCP 连接 当服务器和客户端在同一个应用程序中运行时 它可以正常工作 但是 当我将服务器部分移动到一个应用程序并将客户端部分移动到另一个应用程序时 ConnectAsync 会引发异常 服务器未
  • 为什么SOCKS5需要通过UDP中继UDP?

    The SOCKS5 https en wikipedia org wiki SOCKS SOCKS5协议 描述为RFC1928 https www rfc editor org rfc rfc1928提供对 UDP 的支持 总而言之 希望
  • 通过 TCP/.NET SSLStream 发送文件很慢/无法正常工作

    我正在编写一个与 SSL 配合使用的服务器 客户端应用程序 通过SSLStream 它必须做很多事情 不仅仅是文件接收 发送 目前 它的工作原理是 只有一个连接 我总是使用从客户端 服务器发送数据SSLStream WriteLine 并使
  • 计算 TCP 重传次数

    我想知道在LINUX中是否有一种方法可以计算一个流中发生的TCP重传的次数 无论是在客户端还是服务器端 好像netstat s解决了我的目的
  • 套接字编程-listen() 和accept() 有什么区别?

    我一直在读本教程 http www cs rpi edu moorthy Courses os98 Pgms socket html了解套接字编程 看来listen and accept 系统调用都做同样的事情 即阻塞并等待客户端连接到使用
  • 了解 netty 通道缓冲区和水印

    我正在尝试了解网络缓冲区和水印 作为一个测试用例 我有一个 netty 服务器 它向客户端写入数据 客户端被阻止 基本上每次读取之间有 10 秒的睡眠时间 在正常 I O 下 如果接收方被阻塞 TCP 发送方将受到限制 由于流量控制 发送速
  • C#:如何在 Socket.BeginReceive 回调之前终止套接字?

    我有一个接收来自客户端的连接请求的服务器 该服务器使用异步Socket BeginReceive and Socket EndReceive方法 该代码与找到的代码非常相似here http msdn microsoft com en us
  • Docker 容器是否有自己的 TCP/IP 堆栈?

    我试图了解来自连接到主机的线路并定向到 Docker 容器内的应用程序的网络数据包在幕后发生了什么 如果它是一个经典的 VM 我知道到达主机的数据包将由虚拟机管理程序 例如 VMware VBox 等 传输到 VM 的虚拟 NIC 并从那里
  • StreamWriter的正确使用

    经过几次尝试后 我无法让 StreamWriter 正确构建 工作 所以我做了一些根本错误的事情 C Visual Studio 我有一个现有的 TCP 客户端 它连接并充当读取器 它工作正常 private System Net Sock
  • 具有非阻塞或多线程功能的 Ruby Tcp Server 类

    找不到任何可以帮助创建非阻塞 多线程服务器的 gem 或类 哪里可以找到 The Ruby 文档 http ruby doc org core classes Socket html M002091关于套接字有一些很好的例子 使用该页面中的
  • 10G 链路的 netcat 和 iperf 结果存在巨大差异

    我很困惑看到 netcat 和 iperf 结果之间的巨大差异 我有 10 G 链路连接我的服务器和客户端 iperf 的速度约为 10Gb s 但 netcat 的速度仅为约 280 MB s 可能是什么错误 对于 Iperf Serve
  • TCP 校验和可能无法检测到错误吗?如果是的话,这件事是如何处理的?

    如果 TCP 有效负载在传输过程中被损坏 则重新计算的校验和将与传输的校验和不匹配 太好了 到目前为止一切都很好 如果 TCP 校验和在传输过程中损坏 则重新计算的校验和将与现在损坏的校验和不匹配 太好了 到目前为止一切都很好 当有效负载和
  • 伪TCP通道

    什么是伪 TCP 通道以及如何实现 伪 TCP 是一种协议 它实现了 TCP 的一些思想 通过不可靠的基于数据包的接口提供可靠的数据流 例如 如果您只能访问 UDP 但想要 一种可靠的方式来传递数据 则可以使用此方法 您可以在这里找到示例代
  • 对卡在 CLOSE_WAIT 状态的连接进行故障排除

    我有一个在 Windows 上的 WebLogic 11g 中运行的 Java 应用程序 几天后它变得没有响应 我注意到的一个可疑症状是大量连接 大约 3000 个 出现在netstat即使服务器空闲 也具有 CLOSE WAIT 状态 由

随机推荐

  • linux环境安装工具

    安装mysql http istester com article 258 html 安装git https wx zsxq com dweb2 index group 88512425825412 from mweb type detai
  • java批量生成二维码图片,并打包成ZIP

    最近开发遇到了一个批量打印二维码并生成zip包的需求 先记录下来 pom依赖
  • MySQL(免安装版)的安装与配置详细教程及相关问题解决办法、开启远程连接

    免安装版的Mysql MySQL关是一种关系数据库管理系统 所使用的 SQL 语言是用于访问数据库的最常用的标准化语言 其特点为体积小 速度快 总体拥有成本低 尤其是开放源码这一特点 在 Web应用方面 MySQL 是最好RDBMS Rel
  • 小程序设计规范(一)

    小程序设计规范 标签 相比APP而言 开发一款小程序的开发成本更低 周期更短 同时开发难度和维护成本也相对降低 因此越来越多的开发者开始入坑小程序 正好最近我也要开发小程序 所以今天我就从设计方面聊一聊微信小程序设计规范 埋上设计中可能会出
  • CTP:报单错误:不允许重复报单(原因及解决方案)

    CTP 报单错误 不允许重复报单 原因及解决方案 使用QT5 10 上期的CTP平台开发了一整套程序化交易系统 开发的过程中遇到了各种各样的问题 其中关于CTP接口的开发就遇到了很多坑 甚至很多坑是经过了一段时间的实盘测试才能被发现 本文所
  • python中斐波那契数列_斐波那契数列–在Python,JavaScript,C ++,Java和Swift中进行了解释...

    python中斐波那契数列 by Pau Pav n 通过保罗 帕文 PauPav n The Fibonacci sequence is by definition the integer sequence in which every
  • 学习梦想家CMS内容管理系统-模板的使用

    准备网站下载器 网上可以自己百度搜索 我使用的这个工具就是HTTrack Website Copier 通过这个工具完成一个网站的获取 主要是获取静态文件 这里需要自己去分析这个静态文件 我们获取到的页面主要是需要css images js
  • linux 命令:ping、fping、gping、hping3、tracert、traceroute

    From Nmap Netcat Hping3工具对比 http www 2cto com article 201210 158961 html hping3 命令 http man linuxde net hping3 示例 Testin
  • 2023年最热门的网络安全行业岗位分析

    前言 大数据 人工智能 云计算 物联网 5G等新兴技术的高速发展 蒸蒸日上 但是随之也出现了许多问题 比如 政府单位 企业 个人信息泄露 网络安全问题日益严峻 网络空间安全建设刻不容缓 网络安全人才需求量巨大 人才缺口高达95 人才输送与人
  • m = (++i)+(++i)+(++i) 问题

    m i i i 问题 问题描述 m i i i i初始值为1 求m计算结果 解析 计算机在计算m a b c d e f 先计算 a b c d 并把结果存储 例如 存储在j中 然后再计算j e f j 所以计算机先计算了两个 i 前两项i
  • SpringBoot+Netty实现WebSocket服务器

    前言 传统的请求 应答模式 http 越来越不能满足现实需求 服务器过于被动 而采用轮训或者long poll的方式过于浪费资源 这便有了WebSocket WebSocket是HTML5出的东西 协议 也就是说HTTP协议没有变化 或者说
  • 闲鱼x-sign参数

    据说淘宝的x sign程序已经人手一份了 闲鱼的好像不太多 最近研究了下闲鱼以x sign为代码的请求参数 包括x sign x mini wua x umt等等参数 效果如下 可以看到基本的请求参数和请求包数据都已经在里面了 上面的是po
  • 【React】react 性能优化的方式有哪些

    文章目录 1 Reac memo 缓存组件 2 使用 useMemo 缓存大量的计算 3 避免使用 内联对象 4 避免使用 匿名函数 5 延迟加载不是立即需要的组件 6 调整CSS而不是强制组件加载和卸载 7 使用React Fragmen
  • 两台虚拟机互相ping通(互相通讯)

    要是两台虚拟机能够PING通下列要求缺一不可 1 你所设置的虚拟网络的网络号不能跟外面你正在使用的真实的网络号一样 2 防火墙必须关闭 ubuntu命令 ufw disable 3 你设置的那俩台虚拟机必须在同一网段内 同一网段类似192
  • Ubuntu终端以及浏览器连接不上Github的解决办法

    项目场景 在安装一些其他库时 按照官网教程的步骤 其中需要利用ssh或者https方式从github克隆一些资源 问题描述 从github克隆下载资源会等待很久并且最后提醒失败 原因分析 网络原因 解决方案 用到的网站 站长工具 站长之家
  • 如何解决不可信输入带来的安全问题

    高质量程序设计艺术 样章连载 3 5 不可信输入 原书名 Code Quality The Open Source Perspective
  • Vue3通透教程【十七】Vite构建TS版本Vue项目

    文章目录 写在前面 创建TS版本的Vue3项目 插件安装 写在最后 写在前面 专栏介绍 凉哥作为 Vue 的忠实 粉丝输出过大量的 Vue 文章 应粉丝要求开始更新 Vue3 的相关技术文章 Vue 框架目前的地位大家应该都晓得 所谓三大框
  • 当pycharm里的进程无法终止的情况

    当一直处于这种状态时 解决办法 在Run右边的tab栏 右键出现close tab 点击 之后便可以终止进程
  • MyBatisPlus多表查询的问题

    1 问题描述 有一个Person表和一个Pay表 person表中的id与pay表中ID一致 可以定位到一个人的pay情况 目前是想根据部门id person表中的一个字段 找到本部门下的pay 2 代码实现 根据部门id查询出person
  • 【计算机网络】传输层——TCP

    文章目录 TCP TCP协议的特点 TCP报文段 TCP连接管理 TCP连接的建立 TCP连接的释放 TCP可靠传输 序号 确认 重传 超时 冗余ACK 冗余确认 TCP流量控制 TCP拥塞控制 慢开始和拥塞避免 慢开始算法 拥塞避免算法