【计算机网络】传输层——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 的相关文章

  • 套接字编程Python:如何确保收到完整消息?

    我正在使用 python 3 x 和套接字模块 服务器在 ipv4 地址上运行并使用 tcp 我阅读了一些有关如何发送和接收数据的教程 对于服务器或客户端 要确保发送整个消息 您可以简单地检查发送的数据量是否等于消息的大小 def myse
  • Linux Socket write() 的错误文件描述符 错误的文件描述符 C

    我对 write 2 函数有一个有趣的问题 PrepareResponseForSetCoordinates 函数会导致写入时出现错误的文件描述符错误 这是错误行 perror 写入套接字时出错 总产量 写入套接字时出错 文件描述符错误 我
  • Nodejs TCP连接客户端端口分配

    我使用nodejs在客户端和服务器之间创建了tcp连接 网络模块 https nodejs org api net html 服务器正在侦听已经预定义的端口 并且客户端正在连接到该端口 据我了解客户端的端口是由节点动态分配的 那是对的吗 节
  • TCP Socket无连接超时

    我打开一个 TCP 套接字并将其连接到网络上其他位置的另一个套接字 然后我就可以成功发送和接收数据 我有一个计时器 每秒向套接字发送一些内容 然后 我通过强行断开连接 在本例中拔出以太网电缆 来粗暴地中断连接 我的套接字仍然报告它每秒都在成
  • 什么是消息边界?

    什么是 消息边界 在以下情况下 TCP 和 UDP 之间的区别之一是 UDP 保留消息 边界 我理解之间的区别TCP and UDP 但我不确定的定义 消息边界 由于 UDP 在每个单独的数据包中包含目的地和端口信息 因此是否可以为消息提供
  • Web 服务器可以处理多少个套接字连接?

    假设我要获得共享 虚拟或专用托管 我在某处读到服务器 计算机一次只能处理 64 000 个 TCP 连接 这是真的吗 无论带宽如何 任何类型的托管可以处理多少个 我假设 HTTP 通过 TCP 工作 这是否意味着只有 64 000 个用户可
  • Linux环境下串口数据转换为TCP/IP

    我需要从Linux系统的串口获取数据并将其转换为TCP IP发送到服务器 这很难做到吗 我有一些基本的编程经验 但对 Linux 的经验不多 有没有开源应用程序可以做到这一点 在 Linux 中您不需要编写程序来执行此操作 只是pipe h
  • 数据包丢失和数据包重复

    我试图找出数据包丢失和数据包重复问题之间的区别 有谁知道 数据包重复 是什么意思 和TCP检测到丢失时重传数据包一样吗 No In TCP 数据包 的传递是可靠的 我认为在这种情况下术语数据应该更好 因为它是面向流的协议 数据包丢失和重复是
  • 构建多线程 TCP/IP 服务器

    我想构建一个可供最多 100 个并发客户端使用的 TCP IP 服务器 但仍不确定如何开始 至少我需要服务器 监听客户端 并将它们全部存储在数组或列表中 对于每个客户端 它需要根据其客户端状态接收和发送数据 当有人连接或断开连接时 服务器应
  • 在 Golang Server 中接受持久的 tcp 连接

    我正在尝试使用 Go 并且想创建一个 TCP 服务器 我可以通过 telnet 访问该服务器 发送命令并接收响应 const CONN HOST localhost CONN PORT 3333 CONN TYPE tcp func mai
  • C# Socket.receive连续接收0字节且循环中不阻塞

    我正在尝试用 C 编写一个最简单的多线程 TCP 服务器 它接收来自多个客户端的数据 每次连接新客户端时 都会建立套接字连接 并将套接字作为参数传递给新类函数 之后运行 while 循环并接收数据 直到客户端连接为止 这里的问题是 sock
  • AMQP如何克服直接使用TCP的困难?

    AMQP如何克服直接使用TCP发送消息时的困难 或者更具体地说 在发布 订阅场景中 在 AMQP 中 有一个代理 该代理接收消息 然后完成将消息路由到交换器和队列的困难部分 您还可以设置持久队列 即使客户端断开连接 也可以为客户端保存消息
  • 是否可以找到哪个用户位于 localhost TCP 连接的另一端?

    这是一个编程问题 但它是 Linux Unix 特定的 如果我从本地主机获得 TCP 连接 是否有一种简单的方法可以告诉哪个用户在 C 程序内建立了连接而无需 shell 我知道这对于 Unix 域套接字来说并不太难 我已经知道远程 IP
  • iOS 上的多个 HTTP 请求与单个 TCP 连接

    我正在开发一个 iPhone 应用程序 它使用我控制的基于 Web 的 API 连接到持续打开的 TCP 端口并通过 TCP API 发出请求 或者为我想要获取的所有数据发出新的 HTTP 请求 会更快或更高效吗 我认为差异可以忽略不计 但
  • 如果其中一台机器死机,TCP 连接如何终止?

    如果两个主机 A 和 B 之间建立了 TCP 连接 假设主机 A 已向主机 B 发送了 5 个八位字节 然后主机 B 崩溃了 由于未知原因 主机 A 将等待确认 但如果没有收到确认 将重新发送八位字节并减小发送者窗口大小 这将重复几次 直到
  • 当我使用“control-c”关闭发送对等方的套接字时,为什么接收对等方的套接字不断接收“”

    我是套接字编程的新手 我知道使用 control c 关闭套接字是一个坏习惯 但是为什么在我使用 control c 关闭发送进程后 接收方上的套接字不断接收 在 control c 退出进程后 发送方的套接字不应该关闭吗 谢谢 我知道使用
  • 如何抑制Windows防火墙的Windows安全警报?

    当我从这里找到的 ZeroMQ 指南中用 C 创建 Hello World 示例时 http zguide zeromq org page all Ask and Ye Shall Receive http zguide zeromq or
  • 当 TCP 序列号到达而不是预期时会发生什么情况?

    我正在编写一个程序 使用 libpcap 捕获数据包并重新组装 TCP 流 我的程序只是监视流量 因此我无法控制数据包的接收和发送 我的程序忽略所有非 TCP IP 流量 我根据 ISN 计算下一个预期序列号 然后计算连续的 SEQ 号 我
  • 将 C++ TCP/IP 应用程序从 IPv4 转换为 IPv6。难的?值得这么麻烦吗?

    多年来 我使用 WinSock 为 Windows 开发了少量 C 服务器 客户端应用程序 路由器 Web 邮件 FTP 服务器等 等等 我开始越来越多地考虑创建这些应用程序的 IPv6 版本 当然 同时也保留原始的 IPv4 版本 问题
  • Apache HttpClient TCP Keep-Alive(套接字保持活动)

    我的 http 请求需要太多时间才能被服务器处理 大约 5 分钟 由于连接闲置 5 分钟 代理服务器将关闭连接 我正在尝试在 Apache DefaultHttpClient 中使用 TCP Keep Alive 来使连接长时间处于活动状态

随机推荐

  • 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拥塞控制 慢开始和拥塞避免 慢开始算法 拥塞避免算法