TCP的连接与断开

news2024/9/22 11:33:39

三次握手

主动发起连接建立的应用进程叫做客户端(client)。被动等待连接建立的应用进程叫做服务器(server)。

  • 第一次握手:Client将同步比特SYN置为1(表示这是一个连接请求或连接接受报文),并发送初始报文段序号seq = x(sequence,含义:表明发送数据时的第一个数据字节的序号,每次发送都会自增,自增数值就是发送的字节数,建立连接时连接报文段长度为1)。发送完报文段1之后,客户端进入 SYN-SENT 状态,等待服务器的确认。
  • 第二次握手:Server收到报文段后,如同意,则发回确认。令SYN=1,ACK=1(表示确认号字段ack有效),ack=x+1(含义:表示x之前的我都收到了,希望对方下一次发送x+1),并选择服务器端初始报文段序号 seq=y(含义:表明服务器传送数据时的第一个数据字节的序号,因为TCP是双向传输)。发送完报文段2后,服务器进入 SYN-RECEIVED 状态。
  • 第三次握手:Client收到确认后,则令确认比特ACK=1,发送报文段序号seq=x+1,希望下一次接收的报文段序号ack=y+1,并将该数据报发送给Server。服务器收到后,则成功建立连接。双方都进入 ESTABLISHED 状态,表示连接已建立。

四次挥手

(主动方为A,被动方为B)

  1. 客户端发送关闭连接的报文段,FIN 标志位1,请求关闭连接,并停止发送数据。序号字段 seq = x (等于之前发送的所有数据的最后一个字节的序号加一),然后客户端会进入 FIN-WAIT-1 状态,等待来自服务器的确认报文;
  2. 服务器收到 FIN 报文后,发回确认报文,ACK = 1, ack = x + 1,并带上自己的序号 seq = y,然后服务器就进入 CLOSE-WAIT 状态。服务器还会通知上层的应用程序对方已经释放连接,此时 TCP 处于半关闭状态,也就是说客户端已经没有数据要发送了,但是服务器还可以发送数据,客户端也还能够接收。客户端收到服务器的 ACK 报文段后随即进入 FIN-WAIT-2 状态,此时还能收到来自服务器的数据,直到收到 FIN 报文段。
  3. 服务器发送完所有数据后,会向客户端发送 FIN 报文段,各字段值如图所示,随后服务器进入 LAST-ACK 状态,等待来自客户端的确认报文段。
  4. 户端收到来自服务器的 FIN 报文段后,向服务器发送 ACK 报文,随后进入 TIME-WAIT 状态,等待 2MSL(2 * Maximum Segment Lifetime,两倍的报文段最大存活时间) ,这是任何报文段在被丢弃前能在网络中存在的最长时间,常用值有30秒、1分钟和2分钟。如无特殊情况,客户端会进入 CLOSED 状态。服务器在接收到客户端的 ACK 报文后会随即进入 CLOSED 状态,由于没有等待时间,一般而言,服务器比客户端更早进入 CLOSED 状态。

为什么建立连接是三次握手,而关闭连接却是四次挥手呢?

  由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。A发送了FIN=1仅仅表示A不再发送新的数据报了,但是B未必将全部数据都发送给了A,所以B要将所有数据发送过去,并且收到了确认,才能断开连接。

为什么A发送完ACK=1还要保持2*MSL时间?

  1. MSL即报文最大生存时间。保证若B收不到ACK=1重发FIN=1时,A还未关闭。不过这个不是主要原因,毕竟数据已经交互完成了。
  2. 如果不等待2MSL的话, 那么如果正好一个新连接又建立在相同的端口上, 那么上次的FIN包可能被新的连接收到, 导致新的连接出现问题。MSL一般设置30秒,1分钟或者2分钟。

TCP 建立连接为什么要三次握手而不是两次?

  1. 防止已过期的连接请求报文突然又传送到服务器,因而产生错误 在双方两次握手即可建立连接的情况下,假设客户端发送 A 报文段请求建立连接,由于网络原因造成 A 暂时无法到达服务器,服务器接收不到请求报文段就不会返回确认报文段,客户端在长时间得不到应答的情况下重新发送请求报文段 B,这次 B 顺利到达服务器,服务器随即返回确认报文并进入 ESTABLISHED 状态,客户端在收到 确认报文后也进入 ESTABLISHED 状态,双方建立连接并传输数据,之后正常断开连接。此时姗姗来迟的 A 报文段才到达服务器,服务器随即返回确认报文并进入 ESTABLISHED 状态,但是已经进入 CLOSED 状态的客户端无法再接受确认报文段,更无法进入 ESTABLISHED 状态,这将导致服务器长时间单方面等待,造成资源浪费。
  2. 三次握手才能让双方均确认自己和对方的发送和接收能力都正常 第一次握手:客户端只是发送处请求报文段,什么都无法确认,而服务器可以确认自己的接收能力和对方的发送能力正常; 第二次握手:客户端可以确认自己发送能力和接收能力正常,对方发送能力和接收能力正常; 第三次握手:服务器可以确认自己发送能力和接收能力正常,对方发送能力和接收能力正常; 可见三次握手才能让双方都确认自己和对方的发送和接收能力全部正常,这样就可以愉快地进行通信了。
  3. 告知对方自己的初始序号值,并确认收到对方的初始序号值 TCP 实现了可靠的数据传输,原因之一就是 TCP 报文段中维护了序号字段和确认序号字段,也就是图中的 seq 和 ack,通过这两个字段双方都可以知道在自己发出的数据中,哪些是已经被对方确认接收的。这两个字段的值会在初始序号值得基础递增,如果是两次握手,只有发起方的初始序号可以得到确认,而另一方的初始序号则得不到确认。

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

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

相关文章

kali——nikto的使用

目录 前言 使用方法 查看帮助(--help) 常规扫描(-h) 指定端口扫描(-h -p) 目录猜解(-h -C) 扫描敏感目录(-h) 保存扫描信息 前言 linux自带的nikto工…

【Motion Forecasting】SIMPL:简单且高效的自动驾驶运动预测Baseline

SIMPL: A Simple and Efficient Multi-agent Motion Prediction Baseline for Autonomous Driving 这项工作发布于2024年,前一段时间我已经对这篇文章的摘要和结论进行了学习和总结,这一部分详见https://blog.csdn.net/Coffeemaker88/article/details/1…

快速构建一个ui界面程序--pyqt入门

快速构建一个ui界面程序--pyqt入门 0 背景1 环境准备1.1 安装python1.2 安装pyqt 2 UI设计2.1 启动UI设计可视化工具2.2 生成*.ui文件2.3 编译ui生成对应的py 3 使用UI 0 背景 本文档用于记录开发者如何快速构建一个简单UI程序。开发者使用文档中提及的工具并用于商业活动时&a…

【法如faro】三维激光软件Scene2023数据处理(自动配准并转换坐标)流程

Scene2023数据处理(自动配准并转换坐标)的主要流程为:新建项目、导入数据、处理、自动注册、坐标系转换、模型导出立和面模型导出等。 文章目录 一、新建项目二、导入数据三、处理四、自动注册五、坐标系转换六、模型导出七、立面模型导出八、创建项目点云九、导出一、新建项…

将二叉搜索树转化为排序的双向链表

题目描述 将一个 二叉搜索树 就地转化为一个 已排序的双向循环链表 。 对于双向循环列表,你可以将左右孩子指针作为双向循环链表的前驱和后继指针,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。 特别地,我…

shell了解和问答机制

GUI(图形用户界面) 定义与特点: GUI全称为Graphical User Interface,即图形用户界面。 它是一种采用图形方式显示的计算机操作用户界面,允许用户使用鼠标等输入设备操纵屏幕上的图标或菜单选项,以选择命令…

海康二次开发学习笔记12-从Group外部输入图像

从Group外部输入图像 用OpenCV从本地读图 当Group内部无图像源模块时,可以通过代码的方式将图片传入Group内部.实现方式有多种,可以使用OpenCV从本地读图,可在程序集搜索引用OpenCvSharp,同时将其复制本地的属性改为False. 1. 界面设计 增加加载图像按钮 2. 处理…

【学习笔记】卫星通信NTN 3GPP标准化进展分析(二)- 3GPP Release16 内容

一、引言: 本文来自3GPP Joern Krause, 3GPP MCC (May 14,2024) Non-Terrestrial Networks (NTN) (3gpp.org) 本文总结了NTN标准化进程以及后续的研究计划,是学习NTN协议的入门。 【学习笔记】卫星通信NTN 3GPP标准化进展分析(一&#xff…

学习Kerberos

学习Kerberos Kerberos的 是一种分布式、基于票证的身份验证服务,因为基于分布式,可能这种类型的协议我们平时接触比较少,Web端一般都是通过Cookie、Token、Oauth、Password等各种协议认证,客户端通过Ssh、Password等认证方式&am…

WAF的功能、检测、指纹及绕过

吉祥知识星球http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247485367&idx1&sn837891059c360ad60db7e9ac980a3321&chksmc0e47eebf793f7fdb8fcd7eed8ce29160cf79ba303b59858ba3a6660c6dac536774afb2a6330&scene21#wechat_redirect 《网安面试指南》…

尝试用java spring boot+VUE3实现前后端分离部署

前言 这几天开学了,公司这边几个和学校对接的项目都挺忙的,然后我又开始有点闲的情况了。问大佬能不能继续看看若依的项目,大佬让我自己去学了。在看若依的项目的时候在想,python的FLASK后端实现和JAVA spring boot的实现差别大不…

Redis与SpringMVC的整合与最佳实践

整合Redis与Spring MVC(现在通常是Spring Boot的一部分)可以提高应用性能,特别是在处理大量数据缓存和会话状态管理方面。 下面是一些关于如何整合Redis与Spring MVC的最佳实践: 1. 引入依赖 首先,你需要在你的项目中…

Linux之grafana+onealert报警

grafana介绍 Grafana是一个开源的度量分析和可视化工具,可以通过将采集的数据分析,查询,然后进行可视化的展示,并能实现报警。 grafana安装与登录 在grafana服务器上安装grafana 下载地址:https://grafana.com/grafana/downloa…

包装类及常量池

1、基本数据类型byte、short、int、long、char、boolean的包装类用到了常量池,大小在127以内的从常量池获取; 2、基本数据类型中float、double没有实现常量池技术; 3、java中字符串实现常量池技术; public class Test {public …

电机设计及电机仿真“新工具”—仿真APP

电机仿真APP可以广泛应用于电机设计、制造、测试和维护领域,具有强大的计算能力,能够模拟电机的各种工作状态和参数变化。用户可通过调整仿真参数,快速得到电机的响应和性能参数,从而进行针对性的优化和改进。借助仿真APP&#xf…

动态规划法例题

第一个空,用手工计算,可以用贪心法 先选择价值最大的物品,有两个价值是6的物品,重量合计246 剩余4个空间,只能放重量为2的物品,一共是66315 第二个空,需要将所有物品都放进背包舱室&#xff…

黄力医生:血压高降不下来找准这三个方向真的降下来了

在心脑血管疾病的诊疗中,高血压作为一种常见的慢性病,其管理和控制对于预防心脑血管疾病的发生和发展至关重要。然而,许多患者面临血压居高不下、难以控制的困境。今天,我们有幸邀请到心脑血管科专家黄力医生,为大家深…

React中实现antd自定义图标,鼠标悬浮变色

借助 antd 的 tooltip 组件来实现 hover 时变色的效果 1.新建组件 自定义图标一般在iconfont上面获取,复制下来的svg代码,切记要删除 fill 属性后添加到组件中 import { Tooltip } from "antd"; import React from "react";const …

【JavaWeb】Cookie、Session

文章目录 Cookie、Session一、Cookie(客户端)1、Cookie 的 特点2、Cookie 的 工作原理3、Cookie 的 基本操作5、Cookie 的 域名与路径6、Cookie 的 存活时间7、Cookie 的 删除 二、Session(服务端)1、Session 的 特点2、Session 的…

Mysql性能优化之自适应索引

自适应索引 是什么 自适应哈希索引是 InnoDB 存储引擎为了提高特定类型查询性能而自动构建的一种内存中的哈希索引结构。它可以根据查询模式和数据访问频率自动调整,以优化数据库的性能。 与BTree的区别 与传统的 B-tree 索引不同,哈希索引使用哈希函…