计算机网路学习-time_wait过多

这篇具有很好参考价值的文章主要介绍了计算机网路学习-time_wait过多。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

四次挥手

计算机网路学习-time_wait过多,高性能服务器,学习,网络

调试命令

netstat -an|awk ‘/tcp/ {print $6}’|sort|uniq -c

  • netstat -an
    列出系统中所有处于活动状态的网络连接信息,包括 IP 地址、端口号、协议等。
    其中,第六列是tcp的状态。

    Proto Recv-Q Send-Q  Local Address          Foreign Address        (state)
    tcp4       0      0  192.168.1.9.64861      x.x.x.x.443     SYN_SENT
    tcp4       0      0  192.168.1.9.64847      x.x.x.x.443     ESTABLISHED
    tcp4       0      0  192.168.1.9.64838      x.x.x.x.443       ESTABLISHED
    tcp4       0      0  192.168.1.9.64789      x.x.x.x.443     ESTABLISHED
    
  • awk ‘/tcp/ {print $6}’
    按行进行匹配,筛选出包含 tcp 的行,只输出符合条件的结果
    过滤 TCP 类型的连接,然后输出连接状态字段。$6 表示第 6 列的字段,即连接状态

  • sort
    按连接状态($6)进行排序

  • uniq -c
    统计相同状态的连接数量,并输出一个计数值

为什么会有 time_wait?

  • 防止上一次连接中的包,迷路后重新出现,影响新连接(经过2MSL,上一次连接中所有的重复包都会消失)
  • 可靠的关闭TCP连接

在主动关闭方发送的最后一个 ack(fin) ,可能丢失,这时被动方会重新发fin
如果这时主动方处于 CLOSED 状态 ,就会响应 rst 而不是 ack。
所以主动方要处于 TIME_WAIT 状态,而不能是 CLOSED 。

TIME_WAIT 并不会占用很大资源的,除非受到攻击。
如果一方 send 或 recv 超时,就会直接进入 CLOSED 状态

内核参数调整

系统存在大量TIME_WAIT状态连接,调整内核参数

// vim /etc/sysctl.conf
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1 // Linux 从4.12内核版本开始移除了 tcp_tw_recycle
net.ipv4.tcp_fin_timeout = 30

tcp_syncookies

背景

当系统遇到 TCP SYN 攻击时,可以自动启用 SYN Cookies 机制,来保护系统免受 SYN 攻击
TCP SYN 攻击是一种常见的网络攻击方式,它利用 TCP/IP 协议中的漏洞来发起攻击,从而使得目标系统无法正常工作。
该攻击方式是通过向目标系统发送大量伪造的 SYN 请求,来占用系统资源(S端的Listen的backlog队列,半连接队列)
迫使其陷入卡死的状态。
SYN Cookie 是一种用于解决 TCP SYN 攻击的算法,它可以理解为一种在服务器端动态生成、维护与处理的 Cookie。其基本原理是通过对 TCP 连接握手的过程进行修改,避免向服务器端存储半开连接的信息,从而避免半开连接队列遭受 SYN Flood 攻击。

解决

当启用 net.ipv4.tcp_syncookies 参数时,内核会自动启用 SYN Cookies 技术,来处理频繁的 SYN 请求
改变 TCP 握手步骤中的一些规则,来区分正常的请求和攻击请求,并丢弃恶意的请求,以保证系统的安全性和可用性。

要启用 net.ipv4.tcp_syncookies 参数,可以使用如下命令(需要管理员权限)

sysctl -w net.ipv4.tcp_syncookies=1

如果要禁用该参数,可以将 1 改为 0

算法原理

TCP建立连接时,双方起始报文序号是任意的。SYN cookies利用这一点,按照以下规则构造初始序列号

(1)设:

  • t为一个缓慢增长的时间戳(典型实现是每64s递增一次)
  • m为客户端发送的SYN报文中的MSS选项值
  • s是连接的元组信息(源IP,目的IP,源端口,目的端口)和t经过密码学运算后的Hash值,即s = hash(sip,dip,sport,dport,t),s的结果取低 24 位

(2)初始序列号n为:

  • 高 5 位为t mod 32
  • 接下来3位为m的编码值
  • 低 24 位为s

(3)客户端收到此SYN+ACK报文后,回复ACK报文,且报文中ack = n + 1
(4)服务端收到它时,将ack - 1就可以拿回当初发送的SYN+ACK报文中的序号

  • 服务器巧妙地通过这种方式间接保存了一部分SYN报文的信息

(5)服务器需要对ack - 1这个序号进行检查:

  • 将高 5 位表示的t与当前之间比较,看其到达地时间是否能接受。
  • 根据t和连接元组重新计算s,看是否和低 24 一致,若不一致,说明这个报文是被伪造的。
  • 解码序号中隐藏的mss信息

(6)连接建立

收益

如果攻击者没有正确响应服务端的 TCP ACK 报文,则无法得到正确的 Cookie。
只有当攻击者在正确时间内对服务端的 ACK 报文进行响应时,才能成功建立连接,否则连接不会被建立
从而保证了服务器不会因为未建立的连接消耗大量资源。

为什么没有被纳入TCP标准?

  • MSS的编码只有3位,因此最多只能使用 8 种MSS值
  • 服务器必须拒绝客户端SYN报文中的其他只在SYN和SYN+ACK中协商的选项,原因是服务器没有地方可以保存这些选项,比如Wscale和SACK (影响了扩展功能的使用
  • 增加了密码学运算

SYN协商中,需要协商啥?

服务器在半连接队列中,保存此次请求的关键信息,包括请求的来源和目(五元组),以及TCP选项,如最大报文段长度MSS、时间戳timestamp、选择应答使能Sack、窗口缩放因子Wscale等等。
当后续的ACK报文到达,三次握手完成,新的连接创建,这些信息可以会被复制到连接结构中,用来指导后续的报文收发。

思考

  • 原来伟大的东西就是一个东西,没有善意和恶意,善意和恶意来源于它的使用方,比如TCP、比如炸药、比如一把刀
  • 一个东西足够伟大,以至于光明和黑暗都能通过它吸收能量

tcp_fin_timeout

控制 TCP 连接在正常关闭后保持在 FIN_WAIT2 状态的时间长度,即系统在发送 FIN 包并等待 ACK 包的超时时间

在正常关闭 TCP 连接时,当Linux 内核需要确保所有的数据包和确认信息都被接收方成功接收,以便双方之间的连接彻底关闭,否则可能会导致连接状态的混乱或重传数据等问题。

为了确保连接状态正常且不占用过多系统资源,内核需要在一定的时间间隔内等待连接的停止,并在一定时间内保持连接关闭状态,以便在该时间段内收到由远程的另一端发来的针对旧连接的数据包时能根据 RST 段重置连接,从而释放占用的系统资源

tcp_fin_timeout 内核参数的默认值是 60 秒。可以通过以下命令来查看或修改该值:

# 查询当前值
sysctl net.ipv4.tcp_fin_timeout

# 修改为 30 秒
sudo sysctl -w net.ipv4.tcp_fin_timeout=30

设置太短可能会导致连接意外断开/连接超时
设置过长则会占用过多系统资源,需要权衡

注意:它不是2MSL

tcp_tw_reuse

启用或禁用TIME-WAIT状态下的 TCP 连接复用,即开启该参数后,可以重用处于 TIME-WAIT 状态的本地地址和端口号来建立新的 TCP 连接,从而节省连接资源。

在正常的 TCP 协议交互中,当连接关闭时,内核通常会保持该连接在 TIME-WAIT 状态一段时间,这个时间通常是 2MSL(最大报文段生命周期)的长度,时长为 60 秒。在这段时间内,连接的所有报文都会被清除,连接的两端均无法再次使用该地址和端口号建立新的连接。

通过开启 tcp_tw_reuse 参数,可以在 TIME-WAIT 状态下,通过操作内核参数允许一个新的连接使用已经被释放的本地地址和端口号,从而复用连接资源,避免因为大量 TIME-WAIT 状态连接的资源浪费导致系统性能下降,减少了系统网络资源的占用,增加了连接数的吞吐量。

tcp_tw_recycle - kernel 4.12已移除

开启或关闭 TCP 连接的 time-wait 快速回收机制。

在正常交互过程中,当 TCP 连接关闭时,内核通常会保持该连接在 TIME-WAIT 状态一段时间,以确保连接的所有报文都被完全传输。这个时间通常是 2MSL(最大报文段生命周期)的长度,时长为 60 秒。在这段时间内,连接的所有报文都会被清除,连接的两端均无法再次使用该地址和端口号建立新的连接(服务端的IP和端口是公开的,这里特指客户端的IP和端口,尤其是客户端的端口)。

通过开启 TCP 连接的 time-wait 快速回收机制,可以在连接关闭后尽快清除连接的状态信息,从而释放内存资源。

tcp_tw_recycle 参数用于开启 TCP 连接 time-wait 快速回收机制,在部分情况下可以有效缩短 time-wait 时间,避免因大量 time-wait 状态的连接堆积而导致的系统性能下降问题。

可以通过以下命令来查看或修改该参数的值:

# 查询当前值
sysctl net.ipv4.tcp_tw_recycle

# 修改为 1(开启)
sudo sysctl -w net.ipv4.tcp_tw_recycle=1

该参数在某些情况下可能会导致连接问题或数据丢失。例如,在网络中存在较为复杂的路由和负载均衡器等设备,或者网络延迟较高时,开启该参数可能会导致连接无法正常建立或数据包丢失。

参考文档

https://blog.51cto.com/lookingdream/1902257
https://segmentfault.com/a/1190000019292140
https://www.xiaolincoding.com/network/3_tcp/tcp_interview.html#%E4%BB%80%E4%B9%88%E6%98%AF-syn-%E6%94%BB%E5%87%BB-%E5%A6%82%E4%BD%95%E9%81%BF%E5%85%8D-syn-%E6%94%BB%E5%87%BB

附录

uniq

uniq -c
一种常用的 Linux/Unix 命令组合,用来对于某一个字符串列表进行计数并输出。
uniq 命令作为计数器,统计相邻的相同字符串出现的次数
-c 则表示输出每个字符串出现的次数

cat /etc/passwd | awk -F’:’ ‘{print $1}’ | sort | uniq -c
awk -F’:’ ‘{print $1}’ 命令用于取出 /etc/passwd 文件中的第一列,即用户名
然后使用 sort 进行排序,并使用 uniq -c 统计各个用户在文件中的出现次数文章来源地址https://www.toymoban.com/news/detail-704630.html

到了这里,关于计算机网路学习-time_wait过多的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 计算机网路常见面试题(上)

    # 网络分层模型 # OSI 七层模型是什么?每一层的作用是什么? OSI 七层模型 是国际标准化组织提出一个网络分层模型,其大体结构以及每一层提供的功能如下图所示: 每一层都专注做一件事情,并且每一层都需要使用下一层提供的功能比如传输层需要使用网络层提供的路由和

    2023年04月27日
    浏览(86)
  • 计算机网路络课设_学生宿舍网络规划与设计

    当今世界,各种先进的科学技术飞速发展,给人们的生活带来了深远的影响,它极大的改善我们的生活方式。目前教育改革已将计算机网络引入到学校教学的各个环节,引起了教学方法,教学手段,教学工具的重大变革,这些变革为实现教育现代化起到了巨大的推动作用,因

    2023年04月08日
    浏览(30)
  • 【深度学习: 计算机视觉】如何改进计算机视觉数据集

    机器学习算法需要大量数据集来训练、提高性能并生成组织所需的结果。 数据集是计算机视觉应用程序和模型运行的燃料。数据越多越好。这些数据应该是高质量的,以确保人工智能项目获得最佳的结果和产出。 获取训练机器学习模型所需数据的最佳方法之一是使用开源数

    2024年02月20日
    浏览(35)
  • 如何学习计算机视觉

    学习计算机视觉可以通过以下步骤进行: 了解基本概念和原理:首先,你可以学习计算机视觉的基本概念和原理,包括图像处理、特征提取、目标检测、物体识别等。这些基础知识将帮助你理解计算机视觉的工作原理。 学习算法和技术:学习计算机视觉的算法和技术是非常

    2024年01月21日
    浏览(31)
  • 深度学习与计算机视觉

    目录 1 深度学习 1.1 人工智能 1.2 机器学习 1.3 深度学习 1.3.1 深度学习发展历程 1.3.2 深度学习中的核心因素 1.3.3 深度学习模型分类 1.3.4 深度学习框架 2 计算机视觉 人工智能、机器学习、深度学习这三者的关系: 在实现人工智能的众多算法中,机器学习是发展较为快速的

    2024年02月06日
    浏览(32)
  • 《计算机系统2》学习笔记

    目录 计算机系统漫游 Amdahl定理 信息的表示和处理 信息存储 进制转化 小端法 大端法 布尔代数 位级运算 逻辑运算 移位运算 整数表示 无符号数编码 补码编码 有符号数和无符号数之间的转换 扩展数的位表示 截断数字 整数运算 无符号加法 无符号数求反 有符号整数加法 补码

    2024年02月11日
    浏览(31)
  • 【探索AI】三十一-计算机视觉(六)深度学习在计算机视觉中的应用

    深度学习在计算机视觉中的应用已经取得了显著的成果,并且正在逐步改变我们对图像和视频信息的处理和理解方式。下面将详细讲解深度学习在计算机视觉中的几个关键应用。 首先,我们来看图像分类。图像分类是计算机视觉的基本任务之一,它涉及到将输入的图像自动归

    2024年04月09日
    浏览(47)
  • 计算机视觉基础学习-图像拼接

    首先本文介绍的图像拼接并非对尺寸相同的图片进行简单拼接,而是基于全景图的拼接 普通相机拍摄图像时,无法兼顾相机视场与视场中单个物体的分辨率问题,而全景相机普遍价格昂贵, 不适用于低成本的一般性场景。为了使用普通相机获取宽视角,甚至是 360°全景图像

    2023年04月10日
    浏览(32)
  • 转移学习的计算机视觉教程

    引用这些注释, 实际上,很少有人从头开始训练整个卷积网络(使用随机初始化),因为拥有足够大小的数据集相对很少。 相反,通常在非常大的数据集上对 ConvNet 进行预训练(例如 ImageNet,其中包含 120 万个具有 1000 个类别的图像),然后将 ConvNet 用作初始化或固定特征提取

    2024年02月16日
    浏览(33)
  • 计算机视觉(五)深度学习基础

    深度学习与神经网络的区别 选择合适的目标函数 Softmax层 梯度消失的直观解释 激活函数 学习步长 SGD的问题 存在马鞍面,使我们的训练卡住,于是提出下面方法: Momentum动量 Nesterov Momentum 先利用“惯性”,“走”一步。避免一开始,就被当前梯度带偏。 Adagrad 为不同的参数

    2024年02月14日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包