在开始阅读和撰写数据之前,使用TCP协议的各方必须首先建立连接,双方必须为连接分配必要的内核资源,以便处理连接状态和数据传输。

      最后更新:2021-12-08 23:21:45 手机定位技术交流文章

      TCP协议

      TCP议定书的特点是侧重于连接、字节流和可靠的传输。

      在开始读写数据之前,使用TCP协议的各方必须建立隐蔽关系,双方必须为连接分配所需的内核资源,以管理连接状态和数据传输。TCP连接是全时的,即双方可以通过单一连接完成数据读和写。一旦数据交换完成,双方必须终止连接,以解放系统的资源。

      • TCP协议采用了一种回报确认机制,要求发送人提供的每个TCP部分都由接收人答复,以便交易被视为成功。

      • TCP协议采用一种超期再传送机制,发送者在发送TCP信息后启动计时器,如果在规定时间内没有收到任何答复,该信息就会受到不满。

      • TCP信息最终是从IP数据报告中传送的,在接收端可能会混淆和重复,因此TCP协议将进一步重新排序和排序,并将收到的TCP信息发送到应用层面。

      TCP将把数据存入缓冲区,接收端应用程序可以读取缓冲区内由TCP在一个或母星时间收到的所有数据。 但是,对于UDP提供的每套数据,接收方必须及时完成对每次UDP数据报告的读取操作(使用校正系统),否则软件包将被丢弃。

      image.png

      image.png

      TCP头部结构

      image.png

      • 16 位端口( 端口号) : 通知电文来源于( 源端口) 的主机, 并将电文传送到哪个高级协议或应用程序( 端端口) 。 对于 TCP 连接, 客户通常使用系统选择的临时端口号, 而服务器则使用已知的服务端口号。 所有已知服务的端口号在 / etc/ services 文件 中定义 。

      • 32位元序号:在TCP通信中(从TCP连接到分解)以传输方向以字节表示的每个字节的编号。假设主机A和主机B在发送给B的第一个TCP第1段A中与TCP通信,序号值最初被转换成随机的ISN(初始安全编号,初始序号值)。 在这个传输方向(从A到B),TCP条目中随后的序号将设置在系统中,作为ISN加上输入数据的第一个字节。例如,TCP条目传送的数据是字节流中的1025-2048字节,因此条目的序号是ISN+1025。另一个传输方向(从B到A)的TCP段序号也具有同样的含义。

      • 32位确认编号(承认号):用作对另一方提供的TCP信息的答复。 数值是TCP提交材料中收到的段落的序号加上1.假设主机A和B通过TCP进行互动,A发送的TCP部分不仅包括其本身的序号,而且还包括B提供的TCP部分的确认号。

      • 四个部门主管(标题长度):指定TCP头部的32位(4位元)数。由于四个最大值代表15,TCP头部的最多值为60位元。

      • 六个标记如下:

        • URL 符号, 表示紧急指针( 紧急指针) 是否真实 。
        • ACK 符号表示确认编号是否合法。 带有 ACK 标志的 TCP 条目被称为确认 。
        • PSH标记表明,接收终端程序应迅速读取缓冲区TCP的数据,并清除接收后续数据的空间(如果应用软件不读收到的数据,它们将留在TCP缓冲区),附录表明,接收终端程序应迅速读取缓冲区TCP的数据,并清除接收后续数据的空间(如果应用软件不读收到的数据,它们将留在TCP缓冲区)。
        • 带有RST标志的TCP条目表示另一方必须重新建立连接,我们把带有RST标志的TCP条目作为返回段落。
        • SYN 标识,寻求连接。包含 SYN 标识的 TCP 条目被称为同步文本 。
        • 财务处的签字表明,正在通知另一方关闭连接,使用财务处徽标的TCP部分称为结束段落。
      • 窗口在此指接收通知窗口( 接收窗口, RWND ) 。 它会通知另一侧 TCP 端有多少字节能够接收缓冲区内的数据, 以便另一方能够控制数据传输的速度 。

      • 16 位校验和( TCP 校验和): 接收端由发件人填充, 接收端使用 CRC 报告 方法测试 TCP 电文在传输过程中是否受损。 请注意, 此校验不仅包括 TCP 头部, 也包括数据部分 。

      • 16个紧急指针(紧急指针):正偏差。它将序列号字段的值加到最后一个紧急数据下个字节的数值。 因此,要准确无误,该字段是紧急指针与当前数字的偏差,可称为紧急偏差。

      image.png

      TCP连接

      image.png

      TCP三次握手

      image.png

      1. 客户启动与服务器的连接请求, 将标识 SYN 设置为 1, 生成随机值后端= J, 并将数据包传送到服务器确认 。
      2. 服务器收到数据包后, SYN=1 确认客户请求连接, 服务器将SYN和ACK标签设置为 1,ack=J+1, 产生随机值后继值 K, 并将数据包传送给客户以确认连接请求, 服务器进入 SYN_ RCVD 状态 。
      3. 客户验证标记、确认已建立连接、返回数据包、ACK=1、数据现在可以运输

      TCP四次挥手

      image.png

      由于TCP连接是全时的,每个方向都必须独立终止。 前提是当一方完成数据发布工作时, FIN将被发送终止此方向的连接; 获得 FIN 仅表示此方向没有数据流动, 即不会收到进一步的数据, 但是在FIN 向该方向发送数据之前仍然可以传输此TCP连接的数据 。 关闭的第一个当事方将进行主动关闭, 而另一方将执行被动关闭投送, 这将是收到的进一步数据, 但是仍然可以发送此TCP连接的数据, 直到 FIN 向该方向发送。 关闭的第一个当事方将进行主动关闭, 而另一方将执行被动关闭 。

      1. Clit在客户停止 FIN 结束 Clit 到服务器数据传输后进入 FIN_WAIT_1 条件 。
      2. 收到FIN后,服务器向客户发送ACK,确认收件+1的序列号,并将状态改为CLOSE_WAIT。
      3. 服务器发送 FIN 终止服务器数据传输到客户端, 服务器进入 LAST_ ACK 状态 。
      4. 客户收到FIN后立即输入Time_WAIT模式,然后将ACK发送到服务器,确认序列号为收件+1。

      TCP超时重传

      当客户在很长的时间内没有收到回复时,例如当再传送间隔由内核变量/程序/sys/net/ipv4/tcp_syn_retries决定时,他们再发送信息。每次重新输入的时间翻了一番。在5次失败后, TCP 模块放弃连接并通知应用程序。

      TCP状态转移

      在任何一个时候,TCP连接的任何终点都处于一个状态,目前的状况可以使用网络状态指令加以审查。

      image.png

      客户端状态

      客户端使用连接系统连接到服务器的有效连接。 Connect 呼叫先向服务器发送同步信件, 以便移动连接到 SYN_ SENT 状态 。 自此以后, 连接呼叫可能因两个原因之一无法返回 :

      • 如果连接连接的目标端口不存在( 没有监测进程), 或者如果连接目前被Time_ WAIT 状态中的连接占用, 服务器将向客户端发送回信, 连接电话将失败 。
      • 如果目标端口存在, 连接会失败, 但连接不会在超时内获得服务器的确认信息 。

      如果连接呼叫失败, 连接将立即返回到初始的 CLOSED 状态。 如果客户端从服务器收到同步信件和确认, 连接呼叫返回成功, 连接被切换为已建立状态 。

      当客户进行主动关闭时, 它会向服务器发送连接 FIN_ WAIT_ 1 状态的关闭信息。 如果客户从服务器收到确认信息, 特别是为了确认目的, 连接将移动到 FIN_ WAIT_ 2 状态。 当客户处于 FIN_ WAIT_ 2 状态时, 服务器将处于 CLOSE_ WAIT 状态, 这可能是半封闭状态 。

      服务器状态

      服务器通过监听系统拨打 ListEN 状态, 并被动地等待客户端连接, 从而实施所谓的“ 被动打开 ” 。 一旦服务器收到连接请求( 同步信息), 它会将连接放在等待的内核队列中, 并用 SYN 标记向客户端发送确认信息 。 在此点上, 连接处于 SYN_ RCVD 状态 。

      当客户自愿退出连接( 通过关闭或关闭系统向服务器发送终端信息) 时, 服务器将返回确认信息, 将连接到 CLOSE_ WAIT 状态。 此状态的含义是明确的 : 等待服务器应用程序停止连接 。 通常, 当服务器检测客户端关闭时, 服务器也会给客户发送关闭信息 。

      TCP拥塞控制

      滑动窗口

      TCP 提供了滑动窗口的概念, 以解决可靠的传输和包装问题。 在传输过程中, Clit 和服务器同意接受窗口 rwnd, 然后与 cwnd 压缩器控制窗口一起计算幻灯片窗口 swnd 。 在 Linux 内核执行中, 幻灯片窗口 cwnd 是在软件包中, 因此, swnd 是由 mss (最大区块大小) 来决定的 。

      [公式]

      幻灯片面板分为四个部分:

      • 现已收到 " cock " 识别数据;
      • 另一个组织者(_A)
      • 电文尚未在窗口中传送(接收器仍有空间);
      • 窗口外的数据( 收件人没有空间) 。

      幻灯片图如下(36和46-51的数据背面):

      拥塞控制

      RRT:RRT-Round Trip时间,一个数据包, 从它被传送回发件人那一刻开始, 所以发件人知道它需要多久。

      TCP不能无视网络上发生的事情, 只对数据进行重录, 对网络造成更大的伤害。 TCP背后的理念是TCP不是自私的协议,慢启动算法拥塞避免算法快速重传算法快速恢复算法四部分。

      慢启动算法

      起步迟缓的目的是加入网络,加快网络速度,而不是像那些有特权的汽车一样挤满道路。我们不要破坏已经在高速公路上的秩序。

      慢启动算法如下(cwnnd 全名 Congesion Windows):

      (1) 设置 cwnd = 1 表示MMS尺寸的数据可以广播。

      (2) 每个ACK, cwnd++;线性增长

      (3) 每一RT, cwnd = cwnd *2;按指数排列。

      4)还有一个ssthresh(slow start threshold),是一个上限,当cwnd >= ssthresh时,就会进入“拥塞避免算法”

      正如我们可以看到的那样,如果网网速度快,ACK会迅速返回,而RRT会很简短,这种缓慢的开始并不缓慢。下面的图形描述了这个过程。

      拥塞避免算法

      前面说过,还有一个ssthresh(slow start threshold),是一个上限,当cwnd >= ssthresh时,就会进入“拥塞避免算法”。一般来说ssthresh的值是65535,单位是字节,当cwnd达到这个值时后,算法如下:

      1 cwnd = 1/ cwnd = 1 cwnd = 1/ cwnd

      (2) cwnd = 1 + cwnd = 1 + cwnd

      这将避免过度扩张,因为过度扩张会导致网络拥堵,并导致逐步增长,使之适应网络的最佳价值。 显然,这是一种线性升级方法。

      拥塞状态时的算法

      如前所述,在投下袋子时,有两种可能性:

      1) 如果ROTO用完时间,则重新发送数据包。TCP认为这是一个负面条件,反应严重。

        • sshthresh =  cwnd /2
        • 重置 cwnd 到 1
        • 进入慢启动过程

      2) 快速递解算法,这意味着开始重新传输,而不等到收到三个重复的反包件时,RTO就倒闭。

        • TCP Tahoe的实现符合ROTO的超时。
        • TCP Reno通过以下方式完成:

          • cwnd = cwnd /2
          • sshthresh = cwnd
          • 输入快速恢复算法 - 快速恢复

      上面我们可以看到RTO超时后,sshthresh会变成cwnd的一半,这意味着,如果cwnd<=sshthresh时出现的丢包,那么TCP的sshthresh就会减了一半,然后等cwnd又很快地以指数级增涨爬到这个地方时,就会成慢慢的线性增涨。我们可以看到,TCP是怎么通过这种强烈地震荡快速而小心得找到网站流量的平衡点的。

      快速恢复算法

      TCP Reno

      快速再传输和快速恢复技术经常同时使用。 快速恢复策略是, 您有三只可复制的反弹鼠, 表明网络并不可怕, 所以不需要像 RTO 超时一样强大。 在启动快速恢复方法之前, cwnd 和 sshathresh 已经更新 :

      • cwnd = cwnd /2
      • sshthresh = cwnd

      实际快速报告算法如下:

      • * 海安会(3个表示收到3个数据包)
      • 复制的 ACK 导致数据包受到怨恨 。
      • 如果你得到一个被编辑的阿克, cwnd = cwnd +1。
      • 如果收到新的Ack,则使用 cwnd = sshuthresh 和避免梳理算法。

      本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/14555.html

          热门文章

          文章分类