TCP协议核心一文搞懂<随手笔记>

在这里插入图片描述

1.简介

传输控制协议,是一种面向连接的、可靠的、基于IP的传输层协议。

TCP工作于传输层,IP在网络层,ARP在数据链路层

在这里插入图片描述

  • 源端口和目的端口: 各占两个字节,这两个值加上IP首部中的源端IP地址和目的端IP地址唯一确定一个TCP连接。一个IP一个端口也称为Socket
  • seq序号: 占4个字节,是本报文段发送的数据项目组的第一个字节的序号。
  • ack确认号: 占4个字节,是期望对方下一个报文端的第一个数据字节序号,也就是期望收到的下一个报文段的首部中的序号;确认序号应该是上次已成功收到数据字节序号+1,且只有ACK标志位1时,确认序号才有效。

    TCP传送的数据流中,每个字节都有一个序号,序号是32bit的无符号数,到达 a 32 − 1 a^{32}-1 a321后从0开始

  • 数据偏移: 4bit,表示数据开始的地方离TCP段的起始出有多远。实际上就是TCP段首部的长度
  • 保留字段: 占4bit,为TCP将来的发展预留空间,且必须全部为0.
  • 标志位字段:
    1. URG:为1时,表此报文应尽快送达,而不要按照本来的列队次序传送,与紧急指针字段共同应用。
    2. ACK:只有ACK=1时,确认字段序号才有效。
    3. PSH:当PSH=1时,接受方应该尽快将本报文立即传送给其应用层。
    4. RST:当RST=1时,表示出现连接错误,必须释放连接然后再重建传送连接。
    5. SYN:当SYN=1时,表示请求建立一个连接,携带SYN标志的TCP报文段为同步报文段;只有前两次握手中SYN才为1
    6. FIN:发送端完成发送任务。
  • 窗口:
    • TCP通过滑动窗口的概念来进行流量控制,协调通信双方的工作节调,保证数据不丢失。
    • 滑动窗口可以理解为接收端所能提供的缓冲区大小,TCP利用一个滑动窗口来告诉发送端对他发送的数据能提供多大的缓冲区。
    • 窗口大小为字节数起始于确认号字段指明的值,此值为接收端期望接收的字节,大小为16bit字段,因此最大为65535字节。
  • 检验和: 用于确认传输的数据是否有损坏。发送端基于数据内容校验生成一个值,接收端根据接收的数据检验生成一个值,两个值必须相同才能证明数据是有效的。如果两个值不同,则丢掉这个数据包。

    CheckSum是根据伪头+TCP头+TCP数据三部分进行计算的

  • 紧急指针:
    1. 只有当URG标志置为1时紧急指针才有效。
    2. 是一个正的偏移量,和序号字段中的值相加表示紧急数据最后一个字节序号。
    3. 当所有紧急数据处理完后,TCP就会告诉应用程序回复正常操作。
    4. 即使当前窗口大小为0,也可以发送紧急数据,因为紧急数据无需缓冲。
  • 可选字段: 长度不定,长度必须为32bit的整数倍

2.TCP连接

2.1.建立TCP连接(三次握手)

信息对等和防止超时。

  • 信息对等:自己发送报文的能力、自己接受报文的能力、对方发送报文的能力、对方接受报文的能力
    在这里插入图片描述
  1. 第一次握手:Client将标志位SYN置为1(表示要发起一个连接),随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
  2. 第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
  3. 第三次握手:Client收到确认后,检查ack是否为J+1ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。

2.2.断开连接(四次挥手)

在这里插入图片描述

  1. Client发送关闭数据包将FIN设为1,假设序列号为u,发送关闭数据包后此时client处理FIN-WAIT-1状态。server收到关闭连接请求后通知应用程序处理完剩下的数据。
  2. server响应client的关闭连接请求,将ACK设为1seq为vack为u+1,随后server处于close_wait状态。client收到应答后处于FIN-WAIT-2状态,继续等待server的FIN数据包。
  3. server处理好现场后主动向client发送数据包,并将FIN和ACK标志设置为1seq为wack为u+1,随后处于TIME-WAIT状态等待client的应答。
  4. client收到FIN数据包后,随后发送ACK数据包seq为u+1ack为w+1,此时client处理TIME-WAIT的状态。server收到ACK响应包后进行closed状态,连接正常关闭。client在TIME-WAIT状态等待2msl后,也进入closed状态,连接关闭。

2msl(2 maximum segment life time),即两个最大的报文段寿命:

  1. 保证客户端发送的最后一个Ack报文能到达服务器,这个报文可能丢失导致处于LAST-ACK的服务器接收不到,此时服务器会重新发送FIN+ACK报文,而2msl时间内客户端就会收到这个报文,接着重传一次ACK报文,重新启动2msl计时器,直到客户端和服务端都进入closed状态。
  2. 防止已失效的连接请求报文出现本连接中。和上面三次捂手是一个道理的。经过2个msl是本次连接产生的所有报文段都消失在网络中,使下一个连接不会出现这种旧的连接报文。

3.TCP可靠传输的实现

TCP发送的报文是交付给网络层的,而网络层不会保证报文不会出差错的送达,所以TCP必须采取措施使得通信可靠。TCP为了保证可靠的传输,设计了以下几种机制:

3.1.重传机制

在发送某一个数据以后开启一个计时器,在一定时间内如没得到发送的数据报的ack报文,那么久重新发送数据,直到发送成功为止。

3.2. 流量控制(滑动窗口协议)

点对点通信流量控制,也是通过接收方来控制流量的方式。

TCP通信用滑动窗口来提高通信效率,通信双方都会操作系统的缓冲区维护一个窗口。放放可以发送一组数据出去而不需要等待接收方的应答,接收方可以采用累计确认。如此窗口定的太大,接收方接不过来导致一直重传,所以流量控制就是让发送方发送的速率不要太快。滑动窗口就是接收数据端的窗口大小,用来告诉发送端接收端的缓冲大小,以此控制发送端发送数据的大小,从而达到流量控制的目的。

rwnd(window size):接受窗口,单位是字节,用于流量控制。

3.3. TCP拥塞控制

是针对全局网络的,也是通过发送方来控制流量的方式

  • 拥塞窗口: 发送方维持一个叫拥塞窗口cmnd的状态变量1。拥塞窗口的大小取决于网络的拥塞程度并且动态变化。原则是网络未出现拥塞,拥塞窗口就大一些,出现网络拥塞则小一些,以减少注入到网络中的分组数

    cwnd初始化为1mss,之后没收到一个ack,cwnd成指数增长一次。

  • TCP拥塞控制的方法: 慢开始slow-start,拥塞避免congestion avoidance,快重传fast retransmission,快恢复fast recovery

    1. 慢开始
      TCP在完成连接的三次握手之后慢慢开始传数据,并不是一开始项网络通道中发送大量的数据,如不清楚网络的符合情况立即把大量的数据字节注入网络,可能会引起网络拥塞。因此现在的TCP协议规定了新建立的连接不能一开始就发送大尺寸的数据包,而只能从一个小尺寸的包开始发送。在发送和接收的过程中去计算对方的接收速度,来逐步增加每次发送的数据量。 (最后到达一个稳定的值,进入高速传输阶段)即有小到大的发送数据。

      慢启动阙值(ssthresh):用来限制cwnd的指数激增,一般大小为65535字节。
      cwnd < ssthresh,使用慢开始算法
      cwnd > ssthresh,使用拥塞避免算法
      cwnd = ssthresh,以上两者皆可用

    2. 拥塞避免
      当cwnd>=ssthresh时,cwnd的值不在指数上升,开始加法增加。此时当窗口中的所有报文端都被确认时,cwnd的大小加1,cwnd的值就会随着RTT开始线性增加,以此避免增长过快导致网络拥塞,慢慢的增加和调整到网络的最佳值。

      无论是慢开始算法还是拥塞避免算法,只要是发送方判断网络出现拥塞,就要吧ssthresh设置为当时发送窗口值的一半,然后cwnd重新设置为1,执行慢开始算法

      判断网络拥塞的方法:

      • RTO超时重传
      • 快速重传
    3. 快速重传
      必要性: TCP要保证所有的数据包都可以到达,所以必需有重传机制。

      • 超时重传机制: 不用ack死等③,当发送方发现收不到③的ack超时后会重传③,也有可能导致④和⑤的重传。如:发送端发了①②③④⑤五个包,接受端收到了①②,于是ack③,然后收到④。
      • 快速重传机制: 以上问题TCP引入一种叫做Fast retransmit的算法。不以时间驱动而以数据驱动重传。如包没有连续到达,就ack最后那个可能丢了的包,如发送方连续收到了3次相同的ack就重传。
    4. 快恢复
      原理: 当接收方发送了三个重复确认之后,发送方知道有报文丢失了,发送方不启动慢开始,而是执行快速恢复算法,此时发送方调整ssthresh为一半,同时设置拥塞窗口为最新的ssthresh值,并开始执行拥塞避免算法。


  1. 取拥塞窗口与滑动窗口的最小值作为发送的上限。 ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2979373.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

华为sr-mpls policy配置案例

SR&#xff0d;MPLS POLICY在ensp上面做不了&#xff0c;这是官方上的配置

解压RPM包---rpm2cpiocpio的使用

RPM包括是使用cpio格式打包的&#xff0c;因此可以先转成cpio然后解压&#xff0c;如下所示&#xff1a; rpm2cpio xxx.rpm | cpio -div

【C++】项目级的组织结构与Cmake编译

文章目录 C项目级的组织结构与Cmake编译分文件编写程序C项目级的组织结构Cmake编译 C项目级的组织结构与Cmake编译 分文件编写程序 (1) 创建后缀名为.h的头文件max.h&#xff0c;并在其中写函数的声明 #include<iostream> using namespace std; int max(int a, int b)…

【Linux】文件目录及路径表示

1. Linux目录结构 在 Linux 系统中&#xff0c;有几个目录是比较重要的&#xff0c;平时需要注意不要误删除或者随意更改内部文件。 /etc&#xff1a; 这个是系统中的配置文件&#xff0c;如果更改了该目录下的某个文件可能会导致系统不能启动。 /bin, /sbin, /usr/bin, /usr…

前端JS必用工具【js-tool-big-box】,获取浏览器参数、cookie、localStorage的存取

这一小节&#xff0c;我们针对js-tool-big-box工具做一些使用讲解&#xff0c;主要获取浏览器参数、cookie、localStorage的存取方面的。 这些方法差不多每次项目中要么用不到&#xff0c;要么就自己写一份&#xff0c;轮子造的很重复啊&#xff0c;而且localStorage有时候要求…

Docker Compose 的安装和使用详解

Docker Compose 是 Docker 官方开源的容器编排(Orchestration)项目之一,用于快速部署分布式应用。本文将介绍 Docker Compose 的基本概念、安装流程及使用方法。 简介 Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。从功能上看,Docker C…

利用观测云打造企业级的统一日志中心

前言 在数字化转型时代&#xff0c;现代的大规模应用程序每天可以生成数以亿计的日志数据。它是企业运营和管理中的宝贵资产&#xff0c;记录了系统、应用和设备的各种活动和事件。通过分析日志数据&#xff0c;企业可以深入了解业务运行情况、识别潜在问题和优化机会&#xf…

indexDB 大图缓存

背景 最近在项目中遇到了一个问题&#xff1a;由于大屏背景图加载速度过慢&#xff0c;导致页面黑屏时间过长&#xff0c;影响了用户的体验。从下图可以看出加载耗时将近一分钟 IndexDB 主要的想法就是利用indexDB去做缓存&#xff0c;优化加载速度&#xff1b;在这之前&am…

云架构(五)BBF模式

BFF模式&#xff08;Backends for Frontends pattern&#xff09;- https://learn.microsoft.com/en-us/azure/architecture/patterns/backends-for-frontends。 创建单独的后台服务用以提供给特定的前端或者接口。当你希望避免为多个接口定制单独的后台时&#xff0c;此模…

​「Python绘图」绘制皮卡丘

python 绘制皮卡丘 一、预期结果 二、核心代码 import turtle print("开始绘制皮卡丘") def getPosition(x, y):turtle.setx(x)turtle.sety(y)print(x, y)class Pikachu:def __init__(self):self.t turtle.Turtle()t self.tt.pensize(3)t.speed(190)t.ondrag(getP…

Matlab分段微分方程组拟合【案例源码+视频教程】

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《复杂函数拟合案例分享》本专栏旨在提供 1.以案例的形式讲解各类复杂函数拟合的程序实现方法&#xff0c;并提供所有案例完整源码&#xff1b;2.…

复习python函数

复习python函数 1.对函数的理解函数的传递方式返回值 return可通过help()函数查看函数说明作用域 2.不定长参数3.递归4.高阶函数将函数作为参数传递将函数作为返回值返回 5.匿名函数6.装饰器 1.对函数的理解 函数可以用来保存一些可执行的代码&#xff0c;并且可以在需要时&am…

电子邮件格式怎么写?企业邮件格式正确的写法

电子邮件的写法&#xff0c;跟我们写书信差不多&#xff0c;也有标准格式和写法。电子邮件格式怎么写&#xff1f;电子邮件的完整内容包含&#xff1a;收件人、抄送&#xff08;可选&#xff09;、密送&#xff08;可选&#xff09;、主题、正文、附件&#xff08;可选&#xf…

通过使用XShell工具、Nginx环境实现服务器项目构建与发布

前言&#xff1a; 在信息化和数字化的今天&#xff0c;网站和应用的构建与发布已成为企业发展的重要一环。为了确保项目的顺利上线和稳定运行&#xff0c;选择合适的工具和环境至关重要。本文将详细介绍如何通过XShell工具以及Nginx环境来实现服务器项目的构建与发布&#xff0…

likede 表记录

order微服务 tb_order 表负责记录当前的订单信息 tb_order_collect 表记录当前点位的营收情况 由XXL-JOB通过es进行统计 tb_order_month_collect 表记录一个月供应商的收支情况 通过tb_order_collect 进行统计 production微服务 tb_job 补货警戒值的设置 &#xff08;目前来…

使用CSS3 + Vue3 + js-tool-big-box工具,实现炫酷五一倒计时动效

时间过得真是飞速&#xff0c;很快又要到一年一度的五一劳动节啦&#xff0c;今年五天假&#xff0c;做好准备了吗&#xff1f;今天我们用CSS3 Vue3 一个前端工具库 js-tool-big-box来实现一个炫酷的五一倒计时动效吧。 目录 1 先制作一个CSS3样式 2 Vue3功能提前准备 3…

数值分析复习:Richardson外推和Romberg算法

文章目录 Richardson外推Romberg&#xff08;龙贝格&#xff09;算法 本篇文章适合个人复习翻阅&#xff0c;不建议新手入门使用 本专栏&#xff1a;数值分析复习 的前置知识主要有&#xff1a;数学分析、高等代数、泛函分析 本节继续考虑数值积分问题 Richardson外推 命题&a…

使用Gitee进行社交登录的流程

使用Gitee进行社交登录 创建Gitee第三方应用流程&#xff1a; 鼠标移动到个人头像上&#xff0c;点击账号设置 点击账号设置&#xff0c;选择左边目录下数据管理的第三方应用 然后选择创建应用 根据要求填写 填写好了上面的要求之后&#xff0c;点击创建应用&#xff0c;这样&…

多项式和Bezier曲线拟合

目录 1. 多项式拟合2. Bezier曲线拟合3. 源码地址 1. 多项式拟合 在曲线拟合中&#xff0c;多项式拟合方法的性能受到三个主要因素的影响&#xff1a;采样点个数、多项式阶数和正则项。 采样点个数 N N N&#xff1a;从Figure 1中可以看出较少的采样点个数可能导致过拟合&…

【Linux】解决ubuntu20.04版本插入无线网卡没有wifi显示【无线网卡Realtek 8811cu】

ubuntu为Realtek 8811cu安装驱动&#xff0c;解决wifi连接问题 1、确认无线网卡的型号-Realtek 8810cu2、下载并配置驱动 一句话总结&#xff1a;先确定网卡的型号&#xff0c;然后根据网卡的型号区寻找对应的驱动下载&#xff0c;下载完成之后在ubuntu系统中进行编译&#xff…