当前位置: 首页 > news >正文

【网络协议】聊聊TCP的三挥四握

上一篇我们说了网络其实是不稳定的,TCP和UDP其实是两个不同的对立者,所以TCP为了保证数据在网络中传输的可靠性,从丢包、乱序、重传、拥塞等场景有自己的一套打法。

TCP格式

源端口和目标端口是不可缺少的,用以区分到达发送给拿个应用。
序号为了解决数据乱序的问题,解决数据先来后到的顺序问题。,确认序列号是为了保证对方又没有收到,用来重传的。对于TCP来说会努力保证TCP层面数据的可靠性。

接下来就是SYN发起一个连接、ACK是回复、RST是重新连接。FIN是结束连接等。TCP 是面向连接的,因而双方要维护连接的状态,这些带状态位的包的发送,会引起双方的状态变更。

最重要的一个就是流量控制,是通过窗口大小进行设置的,比如发送方和接收方的可以处理的能力。但是处理流量控制之外还有拥塞控制,用以标记当前应该发送的数据速度。所以整体其实就是顺序问题、丢包问题、连接维护、流量控制、拥塞控制
在这里插入图片描述

TCP 的三次握手

三次握手的过程是这样的,
客户端发送:我要建立连接了
服务端:我收到连接了,开始建立
客户端:好的 建立完成。

为什么说一定要三次握手呢,其实网络是不稳定的,二次握手,其实没有办法保证,建立连接。比如A发送了,但是不知道B又没有收到可能会一直发送,假设B收到了,但是发送给A的响应消息可能丢失了A不一定能收到。

为什么三次 四次不行吗 或者 两次不行吗 ?

如果是二次握手。我们可以假设这样一种情况。当第一次请求因为网络延迟而没有及时到达。客户端(超时重发)再次发送建立连接的请求,服务端接收到客户端的请求,响应给客户端。此时 连接建立成功,发送数据结束后关闭连接,但是因为第一次请求因为网络延迟 现在才到达,也就是存在一个时间差,服务端会误以为 客户端会再次建立一个链接。所以会创建一个新的连接。

客户端发送 syn标志的数据包 一次握手-服务端
服务端 发送syn ack标志的数据包 二次握手 客户端
客户端-发送带有带有ack标志的数据包 三次握手 服务端

客户端向服务端报告我要和你建立连接,顺便把我自己的一个发送的能力发给服务器,让服务器知道。服务器判断我是否可以给你创建连接,把我的一个接收的能力返回给客户端,只有三次握手 才能保证 双方的发送能力和接收能力都能达到一个协商的过程,但是因为协议没有100%可靠的,三次就够了,四次也不能保证100%可靠。
在这里插入图片描述
并且TCP也通过包序号来保证数据 如果丢失了,可以重传。
一开始都是CLOSE状态,服务端启动监听某个端口,处于LISTEN状态,客户端发起第一次连接SYN,服务端收到之后返回SYN,ACK处于SY-RCVD状态,客户端收到之后处于ESTABLISHED状态,因为它一发一收成功了,所以服务端也处于ESTABLISHED。

TCP 四次挥手

在这里插入图片描述
首先我们应该梳理一下,四次挥手流程,客户端发送一个FIN终止信号,表示客户端想要断开连接。当客户端FIN信号发送到服务端后,服务端接收到客户端的终止请求,服务端先发送一个ACK信号对客户端的FIN信号的确认。当服务端也想断开连接的时候,服务端也需要发送一个FIN信号给客户端,客户端响应客户端的FIN的确认。所以断开需要分别客户端发送一个FIN和ACK,服务端也需要发送一个FIN和ACK。

四次挥手主动方为什么需要等待2MSL?
首先我们先说一下,主动断开方接收到被动关闭方的FIN的终止信号,会立马发送一个ACK对于被动关闭方的确认,进入TIME_WAIT时间,等到2MSL关闭连接。
你可以解释一下什么MSL嘛?
MSL表示最大报文生存周期,任何报文在网络上存在的最长时间,超过这个时间报文将被废弃。主动关闭方需要等待2MSL是为了 防止最后一次ACK没有被正确的传输到被动关闭方,而被动关闭方,需要发送第三次的FIN信号。

TCP 状态机

状态机说白了就是从一个状态迁移到另一个状态。
在这里插入图片描述

小结

本篇主要介绍创建连接,关闭连接,以及TCP的状态机。

相关文章:

【网络协议】聊聊TCP的三挥四握

上一篇我们说了网络其实是不稳定的,TCP和UDP其实是两个不同的对立者,所以TCP为了保证数据在网络中传输的可靠性,从丢包、乱序、重传、拥塞等场景有自己的一套打法。 TCP格式 源端口和目标端口是不可缺少的,用以区分到达发送给拿…...

Docker镜像仓库

Docker镜像仓库 一、Docker镜像的创建1.1、基于已有镜像创建1.2、基于本地模板创建1.3、基于Dockerfile创建(使用最广泛)1.3.1、联合文件系统(UnionFS)1.3.2、镜像加载原理1.3.3、Dockerfile1.3.4、Docker 镜像结构的分层 二、如何…...

跨界技术:SOCKS5代理在电商、爬虫与游戏领域的应用

随着技术的日益发展,各种工具和技术手段被广泛应用于不同的领域。其中,SOCKS5代理、跨界电商、爬虫技术、出海策略以及游戏产业都成为了当下最热门的话题。本文将探讨这些关键技术如何相互融合,为企业和个人带来更多的机会和挑战。 1. SOCKS…...

LeetCode--快速排序

文章目录 1 排序原理2 代码实现 1 排序原理 quickSort(int[] arr, int left, int right) 参数描述 arr: 待排序的数组left: 排序的左边位置right: 排序的右边位置 排序步骤: 先选取左边节点的数据作为 pivot从右边开始, 向左遍历节点数据, 在满足right > left 条件前提下…...

2023年CSP-S赛后总结(2023CSP-S题解)

目录 T1 题目描述 输入格式 输出格式 代码 T2 题目描述 输入格式 输出格式 题目描述 输入格式 输出格式 题意翻译 代码 T3 题目背景 题目描述 输入格式 输出格式 代码 T4 题目描述 输入格式 输出格式 总结 T1 题目描述 小 Y 有一把五个拨圈的密码锁。…...

Django viewsets 视图集与 router 路由实现评论接口开发

正常来说遵循restful风格编写接口,定义一个类包含了 get post delete put 四种请求方式,这四种请求方式是不能重复的 例如:获取单条记录和多条记录使用的方式都是get,如果两个都要实现的话那么得定义两个类,因为在同一个类中不能有…...

RCE 远程代码执行漏洞分析

RCE 漏洞 1.漏洞描述 Remote Command/Code Execute 远程命令执行/远程代码执行漏洞 这种漏洞通常出现在应用程序或操作系统中,攻击者可以通过利用漏洞注入恶意代码,并在受攻击的系统上执行任意命令。 2.漏洞场景 PHP 代码执行PHP 代码注入OS 命令执…...

JDK8新特性:Stream流

目录 1.获取Stream流 2.Stream流常见的中间方法 3.Stream流常见的终结方法 1、 Stream 是什么?有什么作用?结合了什么技术? ●也叫 Stream 流,是Jdk8开始新增的一套 API ( java . util . stream .*),可以用于操作集…...

【.net core】yisha框架单页面双列表联动效果示例

gridTable1列表数据为gridTable别表数据的子数据&#xff0c;点击gridTable时gridTable1列表数据更新&#xff0c; {Layout "~/Views/Shared/_Index.cshtml";} <div class"container-div"><div class"row"><div id"search…...

01. 板载硬件资源和开发环境

一、板载硬件资源 STM32F4VGT6-DISCOVERY硬件资源如下&#xff1a; (1). STM32F407VGT6微控制器有1M的FLASH存储器&#xff0c;192K的RAM&#xff0c;LQFP100封装 (2). 板上的ST-LINK_V2可以使用选择的方式把套件切换成一个独立的ST-LINK/V2来 使用&#xff08;可以使用SWD…...

BlobDetector的使用与参数说明(OpenCV/C++)

通过opencv的BlobDetector方法可以检测斑点、圆点、椭圆等形状 以下是使用方式及代码说明&#xff1a; 1、导入必要的OpenCV库和头文件。 #include <opencv2/opencv.hpp> #include <opencv2/blob/blobdetector.hpp>2、读取图像并将其转换为灰度图像。 cv::Mat…...

行为型模式-空对象模式

在空对象模式&#xff08;Null Object Pattern&#xff09;中&#xff0c;一个空对象取代 NULL 对象实例的检查。Null 对象不是检查空值&#xff0c;而是反应一个不做任何动作的关系。这样的 Null 对象也可以在数据不可用的时候提供默认的行为。 在空对象模式中&#xff0c;我…...

爬虫采集如何解决ip被限制的问题呢?

在进行爬虫采集的过程中&#xff0c;很多开发者会遇到IP被限制的问题&#xff0c;这给采集工作带来了很大的不便。那么&#xff0c;如何解决这个问题呢&#xff1f;下面我们将从以下几个方面进行探讨。 一、了解网站的反爬机制 首先&#xff0c;我们需要了解目标网站的反爬机制…...

【ARM AMBA Q_Channel 详细介绍】

文章目录 1.1 Q_Channel 概述1.2 Q-Channel1.2.1 Q-Channel 接口1.2.2 Q-Channel 接口的握手状态1.2.3 握手信号规则 1.3 P_Channel的握手协议1.3.1 device 接受 PMU 的 power 请求1.3.2 device 拒绝 PMU 的 power 请求 1.4 device 复位信号与 Q _Channel 的结合1.4.1 RESETn 复…...

PDF Reader Pro v2.9.8(pdf编辑阅读器)

PDF Reader Pro是一款PDF阅读和编辑软件&#xff0c;具有以下特点&#xff1a; 界面设计简洁&#xff0c;易于上手。软件界面直观清晰&#xff0c;用户可以轻松浏览文档&#xff0c;编辑注释和填写表单。功能强大&#xff0c;提供了多种PDF处理工具&#xff0c;包括阅读、注释…...

【机器学习可解释性】1.模型洞察的价值

机器学习可解释性 1.模型洞察的价值2.排列的重要性3.部分图表4.SHAP Value5.SHAP Value 高级使用 正文 前言 本文是 kaggle上机器学习可解释性课程&#xff0c;共五部分&#xff0c;除第一部分介绍外&#xff0c;每部分包括辅导和练习。 此为第一部分&#xff0c;原文链接 如…...

网络安全保险行业面临的挑战与变革

保险业内大多数资产类别的数据可以追溯到几个世纪以前&#xff1b;然而&#xff0c;网络安全保险业仍处于初级阶段。由于勒索软件攻击、高度复杂的黑客和昂贵的数据泄漏事件不断增加&#xff0c;许多网络安全保险提供商开始感到害怕继续承保更多业务。 保险行业 根据最近的路…...

如何提高系统的可用性/高可用

提高系统可用性常用的一些方法&#xff0c;有缓存、异步、重试、幂等、补偿、熔断、降级、限流。 缓存 缓存的速度&#xff0c;比数据库快很多&#xff0c;添加缓存是简单有效的做法。 注意缓存与数据库的一致性&#xff0c;数据表记录变更时记得处理缓存。 Redis缓存的示例&…...

PCA和LDA数据降维计算(含数学例子推导过程)

PCA算法和LDA算法可以用于对数据进行降维&#xff0c;例如可以把一个2维的数据降低维度到一维&#xff0c;本文通过举例子来对PCA算法和LDA算法的计算过程进行教学展示。 PCA算法计算过程(文字版&#xff0c;想看具体计算下面有例子) 1.将原始数据排列成n行m列的矩阵&#xf…...

题目 1053: 二级C语言-平均值计算(python详解)——练气三层初期

✨博主&#xff1a;命运之光 &#x1f984;专栏&#xff1a;算法修炼之练气篇&#xff08;C\C版&#xff09; &#x1f353;专栏&#xff1a;算法修炼之筑基篇&#xff08;C\C版&#xff09; &#x1f352;专栏&#xff1a;算法修炼之练气篇&#xff08;Python版&#xff09; ✨…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

docker 部署发现spring.profiles.active 问题

报错&#xff1a; org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...