TCP的连接和关闭的那些事

news2024/11/16 19:55:18

一、基础概念

1、啥是TCP?

它是面向连接的一种协议,任何数据发送之前都需要建立连接。

2、TCP/IP协议的四层中那一层?

TCP位于运输层,详见下图

3、TCP协议的状态机有哪些? 

在链接建立和断开不同阶段都有不同的状态,这些状态想必大家也都耳熟能详了,具体可以参考下图。

二、三次握手和四次挥手

1、TCP状态如何变的? 

连接时的三次握手:

第一次握手:

客户端给服务器发送一个SYN段(在 TCP 标头中 SYN 位字段为 1 的 TCP/IP 数据包), 该段中也包含客户端的初始序列号(Sequence number = J),客户端TCP状态为SYN_SENT。

第二次握手:

服务器返回客户端 SYN +ACK 段(在 TCP 标头中SYN和ACK位字段都为 1 的 TCP/IP 数据包), 该段中包含服务器的初始序列号(Sequence number = K);同时使 Acknowledgment number = J + 1来表示确认已收到客户端的 SYN段(Sequence number = J),服务端TCP状态为SYN_RCVD。

第三次握手: 

客户端给服务器响应一个ACK段(在 TCP 标头中 ACK 位字段为 1 的 TCP/IP 数据包), 该段中使 Acknowledgment number = K + 1来表示确认已收到服务器的 SYN段(Sequence number = K)。双方TCP进入ESTABLISHED状态。

关闭时的四次挥手:

第一次挥手:

客户端发出释放FIN=1,自己序列号seq=u,进入FIN-WAIT-1状态。

第二次挥手:

服务器收到客户端的后,发出ACK=1确认标志和客户端的确认号ack=u+1,自己的序列号seq=v,进入CLOSE-WAIT状态。

第三次挥手:

客户端收到服务器确认结果后,进入FIN-WAIT-2状态。此时服务器发送释放FIN=1信号,确认标志ACK=1,确认序号ack=u+1,自己序号seq=w,服务器进入LAST-ACK(最后确认态)。

第四次挥手:

客户端收到回复后,发送确认ACK=1,ack=w+1,自己的seq=u+1,客户端进入TIME-WAIT(时间等待)。客户端经过2个最长报文段寿命后,客户端CLOSE;服务器收到确认后,立刻进入CLOSE状态。

2、子概念

SYN:

是同步的缩写,SYN 段是发送到另一台计算机的 TCP 数据包,请求在它们之间建立连接。

ACK:

是“确认”的缩写。 ACK 数据包是任何确认收到一条消息或一系列数据包的 TCP 数据包。

FIN:

结束标志,用于释放连接,为1表示关闭本方数据流。

三、常见TCP的一些问题

1、为什么建立连接是三次握手,关闭连接确是四次挥手?

1)三次握手时,服务器同时把ACK和SYN放在一起发送给了客户端。

2)四次挥手时,当收到客户端的 FIN 报文时,仅仅表示对方不再发送数据了但是还能接收数据,所以服务器只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。所以关闭连接时多了一步服务侧的挥手。

2、握手时两次为何不行?

为了服务侧确认客户端的接收能力正常。

3、什么是连接队列?

全连接队列

当客户端返回ACK, 服务端接收后,三次握手完成。这个时候连接等待被具体的应用取走,在被取走之前,它会被推入另外一个 TCP 维护的队列,也就是全连接队列(Accept Queue) 。

半连接队列

当客户端发送SYN到服务端,服务端收到以后回复ACK和SYN,状态由LISTEN变为SYN_RCVD,此时这个连接就被推入了SYN队列 ,也就是半连接队列 。

4、关于SYN Flood攻击

是指,恶意估计者给服务器发送一个SYN后,直接下线,服务器侧则需要默认等63s才会断开连接,这样,攻击者就可以把服务器的syn连接(半连接)的队列耗尽,让正常的连接请求不能处理。

Linux下tcp_syncookies的参数可以应对这个事——当SYN队列满了后,TCP会通过源地址端口、目标地址端口和时间戳打造出一个特别的Sequence Number发回去(又叫cookie),如果是攻击者则不会有响应,如果是正常连接,则会把这个 SYN Cookie发回来,然后服务端可以通过cookie建连接(即使你不在SYN队列中)。请注意,请先千万别用tcp_syncookies来处理正常的大负载的连接的情况。因为,synccookies是妥协版的TCP协议,并不严谨。对于正常的请求,你应该调整三个TCP参数可供你选择,第一个是:tcp_synack_retries 可以用他来减少重试次数;第二个是:tcp_max_syn_backlog,可以增大SYN连接数;第三个是:tcp_abort_on_overflow 处理不过来干脆就直接拒绝连接了。

5、关于TIME_WAIT数量太多

在大并发的短链接下,TIME_WAIT 就会太多,也会消耗很多系统资源,如果客户端的并发量持续很高,此时部分客户端就会显示连接不上。

如何尽量处理TIMEWAIT过多?

1)长连接 对于反向代理和应用服务器,最好是要配置成支持keepalive长连接,否则在系统并发增加时会导致一系列的连接问题。对于nginx+tomcat长连接的配置前面有一些介绍可以参考,其它服务器一般也是提供支持长连接配置的,设置后建议抓包测试验证。 一般来说长连接设置正确了TIME_WAIT数量不会暴涨,但是长连接最大请求数也是有效的,但如果应用的处理速度很快导致TIME_WAIT的产生的速度远快于TIME_WAIT的消耗速度时系统就会累计TIME_WAIT状态连接。这时候可能就要修改一些系统配置了。

2)ip_conntrack 用于跟踪TCP连接。一旦激活了此模块,就能在系统参数里发现很多用来控制网络连接状态超时的设置,其中自然也包括TIME_WAIT,默认ip_conntrack_max最大为65536,可以将其设置得更大一些。一般不建议此模块,如果系统安装使用iptable会启动该模块。

3)tcp_tw_recycle 在网上搜索TIME_WAIT问题的解决方法,大多都会提到这个参数,不过官方网站上不建议开启这个参数,原因是会导致一些安全问题。例如,当多个客户端通过NAT方式联网并与服务端交互时,服务端看到的是同一个IP,由于这些客户端的时间戳可能存在差异,所以从服务端的视角看,便可能出现时间戳错乱的现象,进而直接导致时间戳小的数据包被丢弃。

4)tcp_tw_reuse 当创建新连接的时候,如果可能的话会考虑复用相应的TIME_WAIT连接。官方文档里提到的是如果从协议视角看它是安全的,那么就可以使用。这个很难判定这个参数是否应该开启,不到万不得已的时候,即使我们要开启这个参数复用连接,也应该在连接的发起方使用,而不能在被连接方使用。

PS:tcp_tw_recycle和tcp_tw_reuse,非极端情况不建议使用这两参数,打开这两个参数会有比较大的坑——后期可能会让TCP连接出一些诡异的问题

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

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

相关文章

ES 分布式搜索的运行机制

ES 分布式搜索的运行机制-腾讯云开发者社区-腾讯云 ES 分布式搜索的运行机制 ES 有两种 search_type 即搜索类型: •query_then_fetch (默认)•dfs_query_then_fetch query_then_fetch query_then_fetch 1.用户发起搜索,请求…

RabbitMQ 笔记二

1.Spring 整合RabbitMQ 生产者消费者 创建生产者工程添加依赖配置整合编写代码发送消息 创建消费者工程添加依赖配置整合编写消息监听器 2.创建工程RabbitMQ Producers spring-rabbitmq-producers <?xml version"1.0" encoding"UTF-8"?> <pr…

SQL注入:报错注入

SQL注入系列文章&#xff1a;初识SQL注入-CSDN博客 SQL注入&#xff1a;联合查询的三个绕过技巧-CSDN博客 目录 什么是报错注入&#xff1f; 报错注入常用的3个函数 UpdateXML ExtractValue Floor rand&#xff08;随机数&#xff09; floor&#xff08;向上取整&…

海外多语言盲盒APP开发:跨越语言障碍的创新解决方案

随着全球化的加速和信息技术的迅猛发展&#xff0c;跨语言沟通的重要性日益凸显。为了满足这一市场需求&#xff0c;海外多语言盲盒APP应运而生。这一创新性的应用软件&#xff0c;旨在帮助用户跨越语言障碍&#xff0c;实现无障碍的交流与互动。 一、海外多语言盲盒APP的核心…

Python中lambda表达式的用法

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 lambda表达式本身是一个非常基础的python函数语法&#xff0c; 其基本功能跟使用def所定义的python函数是一样的&#xff0c; 只是lambda表达式基本在一行以内就完整的表达了整个函数的运算逻辑。 这里我们简单展示一些lam…

C#,恩廷格尔组合数(Entringer Number)的算法与源程序

恩廷格尔组合数&#xff08;Entringer Number&#xff09;组合数学的序列数字之一。 E&#xff08;n&#xff0c;k&#xff09;是{1&#xff0c;2&#xff0c;…&#xff0c;n1}的排列数&#xff0c;从k1开始&#xff0c;先下降后上升。 计算结果&#xff1a; 源代码&#xf…

五、Flask学习之MySQL

五、Flask学习之MySQL 1. 下载MySQL 下载教程&#xff1a;MySQL安装及可视化工具SQLyog下载 2.常用指令 2.1. 查看已有数据库 show databases;2.2. 创建数据库 create database 名字 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;2.3. 删除数据库 drop database 名字;…

计算机毕业设计 | SSM 凌云招聘平台(附源码)

1&#xff0c;绪论 人力资源是企业产生效益、创造利润的必不可少的、最重要的资源。人作为人力资源的个体可看作是一个承载着有效知识、能力的信息单元。这样的信息单元可看作是一个为企业产生价值和利润的个体。从而使得这样的信息单元所具有的信息就是一个有价值的信息。 校…

stripped文件描述以及gdb反汇编工具使用

往期地址&#xff1a; 操作系统系列一 —— 操作系统概述操作系统系列二 —— 进程操作系统系列三 —— 编译与链接关系操作系统系列四 —— 栈与函数调用关系操作系统系列五 —— 目标文件详解操作系统系列六 —— 详细解释【静态链接】操作系统系列七 —— 装载操作系统系列…

缓存问题 | 缓存穿透,缓存击穿,缓存雪崩

缓存穿透 关键字&#xff1a;强调缓存和数据库都没有数据并发访问 缓存穿透是指数据库和缓存都没有的数据&#xff0c;每次都要经过缓存去访问数据库&#xff0c;大量的请求有可能导致DB宕机。 应对策略&#xff1a; 使用布隆过滤器&#xff08;Bloom Filter&#xff09;&am…

PythonPDF编辑库之pypdf使用详解

概要 PDF&#xff08;Portable Document Format&#xff09;是一种常见的文档格式&#xff0c;广泛用于存储和共享文本和图像数据。在 Python 中&#xff0c;有许多库可以用于处理 PDF 文件&#xff0c;其中之一就是 PyPDF。PyPDF 是一个功能强大的库&#xff0c;它允许你读取…

RK3568平台 麦克风PDM接口录音

一.PDM接口简介 PDM Pulse Density Modulation是一种用数字信号表示模拟信号的调制方法。 PDM则使用远高于PCM采样率的时钟采样调制模拟分量&#xff0c;只有1位输出&#xff0c;要么为0&#xff0c;要么为1。因此通过PDM方式表示的数字音频也被称为Oversampled 1-bit Audio…

Leetcode—145. 二叉树的后序遍历【简单】

2023每日刷题&#xff08;九十七&#xff09; Leetcode—145. 二叉树的后序遍历 实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr…

Go、容器以及Linux调度器

在容器中运行Go应用程序时&#xff0c;需要设置合理的GOMAXPROCS&#xff0c;从而避免调度中因为资源不足而造成STW。原文: Go, Containers, and the Linux Scheduler Go开发的应用程序通常部署在容器中。在容器中运行时&#xff0c;重要的一点是要设置CPU限制以确保容器不会耗…

十款数据可视化工具横评:优缺点大揭秘

作为一位热衷于数据可视化的爱好者&#xff0c;我深知选择一款得心应手的数据可视化工具对于呈现数据的魅力至关重要。在市面上众多的数据可视化工具中&#xff0c;我精选了十款备受瞩目的产品&#xff0c;下面就为大家简单介绍一下它们的优缺点&#xff0c;以帮助大家进行选择…

Windows下载安装并启动 Elasticsearch(ES)

我们先访问官网链接 https://www.elastic.co/cn/downloads/elasticsearch 进入官网后 Choose platform 选择我们自己的电脑系统 我这里是 Windows 然后 点击如下图 箭头指向的这个下载按钮 它就开始下了 这个文件还是偏大的 然后 这里 我创建一个目录 专门用来装它 然后 我…

SD342X-16Q双偏心软密封蝶阀的选型技巧分享

SD342X-16Q双偏心软密封蝶阀的选型技巧分享 选择SD342X-16Q双偏心软密封蝶阀软密封蝶阀时&#xff0c;需要考虑以下几个事项&#xff1a; 1.流体性质&#xff1a; 了解流体的压力、温度、粘度等特性&#xff0c;选择适合的软密封材料。不同材料对于不同流体具有不同的耐腐蚀性…

mac滚动截图

参考博客 https://www.zhihu.com/question/313673726/answer/2938671835 首先去AppStore搜索 iShot 这个也是要钱的&#xff0c;不过我输入appleID后&#xff0c;并没有扣我钱&#xff0c;不知道设么回事 然后打开iShot 点击观看视频&#xff0c;然后mac会自动打开一个新的…

OpenAI 降低价格并修复拒绝工作的“懒惰”GPT-4,另外ChatGPT 新增了两个小功能

OpenAI降低了GPT-3.5 Turbo模型的API访问价格&#xff0c;输入和输出价格分别降低了50%和25%。这对于使用API进行文本密集型应用程序的用户来说是一个好消息。 OpenAI官网&#xff1a;OpenAI AIGC专区&#xff1a;aigc 教程专区&#xff1a;AI绘画&#xff0c;AI视频&#x…

【HarmonyOS应用开发】TypeScript快速入门(二)

内容比较长&#xff0c;干货满满&#xff0c;全是实战操作内容&#xff0c;希望耐心观看&#xff0c;如果对你有所帮助&#xff0c;请点个赞&#xff01; ArkTS是HarmonyOS优选的主力应用开发语言。它在TypeScript&#xff08;简称TS&#xff09;的基础上&#xff0c;匹配ArkUI…