0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

TCP连接建立中的异常

麦辣鸡腿堡 来源:盼盼编程 作者:盼盼编程 2023-10-08 17:01 次阅读

建连接时SYN超时问题

如果 server 端因为某种情况没有收到 client 回来的 ACK,那么,这个连接处还处于一个未建立的状态。于是,server端如果在一定时间内没有收到,则 server 端的 TCP 会重发 SYN_ACK。

Linux下,默认重试次数为5次,重试的间隔时间从1s开始每次都翻倍,5次的重试时间间隔为1s, 2s, 4s, 8s, 16s,总共31s,第5次发出后还要等32s都知道第5次也超时了。如果第五次重传之后,还未收到客户端的 ACK,server 端的 TCP 才会把断开这个连接。

关于SYN Flood攻击

攻击者短时间伪造不同 IP 地址的 SYN 报文,服务端每接收到一个 SYN 报文,就进入SYN_RCVD 状态,但服务端发送出去的 ACK + SYN 报文,无法得到未知 IP 主机的 ACK 应答,久而久之就会占满服务端的 SYN 接收队列(未连接队列),使得服务器不能为正常用户服务。

避免方式

设置 tcp_syncookies = 1。当 SYN 队列满了后,TCP 会通过源地址端口、目标地址端口和时间戳打造出一个特别的 Sequence Number 发回去(又叫cookie)。

如果是攻击者则不会有响应,如果是正常连接,则会把这个 SYN Cookie 发回来,然后服务端可以通过 cookie 建连接。

设置 netdev_max_backlog 的值,确定链接队列的大小。当网卡接收数据包的速度大于内核处理的速度时,会有一个队列保存这些数据包。

通过设置 netdev_max_backlog 的值,确定 SYN_RCVD 状态连接的最大个数。

通过设置 tcp_abort_on_overflow 的值。当超出处理能时,对新的 SYN 直接回报 RST,丢弃连接。

断开连接中的异常

TIME_WAIT数量太多

从上面的描述可以知道,TIME_WAIT 是个很重要的状态,但是如果在大并发的短链接下,TIME_WAIT 就会太多。TIME_WAIT过多会占用大量的内存资源和端口资源。

优化法一:tcp_tw_reuse

设置tcp_tw_reuse = 1,则可以复用处于 TIME_WAIT 的 socket 为新的连接所用。

有一点需要注意的是,tcp_tw_reuse 功能只能用客户端(连接发起方),因为开启了该功能,在调用 connect() 函数时,内核会随机找一个 time_wait 状态超过 1 秒的连接给新的连接复用。

使用 tcp_timestamps = 1 选项,还有一个前提,需要打开对 TCP 时间戳的支持,即这个时间戳的字段是在 TCP 头部的「选项」里,用于记录 TCP 发送方的当前时间戳和从对端接收到的最新时间戳。

由于引入了时间戳,我们在前面提到的 2MSL 问题就不复存在了,因为重复的数据包会因为时间戳过期被自然丢弃。

优化法二:tcp_max_tw_buckets

这个值默认为 18000,当系统中处于 TIME_WAIT 的连接一旦超过这个值时,系统就会将后面的 TIME_WAIT 连接状态重置。

这个方法过于暴力,而且治标不治本,带来的问题远比解决的问题多,不推荐使用。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 网络
    +关注

    关注

    14

    文章

    7304

    浏览量

    87847
  • TCP
    TCP
    +关注

    关注

    8

    文章

    1287

    浏览量

    78508
  • 连接
    +关注

    关注

    2

    文章

    91

    浏览量

    20851
  • 服务端
    +关注

    关注

    0

    文章

    66

    浏览量

    6910
收藏 人收藏

    评论

    相关推荐

    TCP和UDP建立连接的差异和可靠性的差异

    TCP 建立连接需要经过三次握手,同时 TCP 断开连接需要经过四次挥手,这也表示 TCP 是一
    发表于 09-02 16:10 633次阅读

    如何标识一个TCP连接

    tcp应用中,server事先在某个固定端口监听,client主动发起连接,经过三路握手后建立tcp连接。那么对单机,其最大并发
    的头像 发表于 10-10 10:33 2567次阅读

    STM32H7+FREERTOS+LWIP建立TCP连接连接不稳定怎么解决?

    利用ST的Demo建立TCP连接,但是当建立TCP连接超过4个时,
    发表于 04-25 06:05

    14-TCP 协议(连接异常与RST)

    1. RST 段当 TCP连接出现严重的错误时,必须释放连接。通过将 TCP 首部的 RST 标志位置 1,就可以通知对端发生错误,以终止
    发表于 07-24 10:01

    为什么建立TCP连接有时成功有时失败?

    时开发板自带的里程改的,TCP这部分基本没有改,只是增加了自己的应用进去。首次使用以太网接口,还不太清楚建立连接的机理,有了解这块的朋友吗,请问建立
    发表于 09-19 04:36

    tcp连接异常怎么回事

    使用ucosiiilwip ,enc28j60。 在做tcp client测试时,每2s发送一次数据,10分钟左右就出现异常。通过抓包工具,发现是tcp连接时 发送了 RTS ACK
    发表于 05-20 09:57

    CH9121配置成TCP Client/Server,无法和电脑建立TCP连接怎么解决?

    9121配置成TCP Client/Server,无法和电脑建立TCP连接
    发表于 10-12 08:18

    建立TCP/IP连接之后可以发送json的数据吗?

    建立TCP/IP连接之后,可以发送json的数据吗?​
    发表于 10-20 06:02

    TCP连接建立与终止

    学习TCP-IP的很好的书。TCP-IP详解卷1。
    发表于 05-10 15:44 0次下载

    大神告诉你TCP建立连接为什么是三次握手

    所谓三次握手(Three-Way Handshake)即建立TCP连接,是指建立一个TCP连接
    的头像 发表于 04-16 11:43 1w次阅读
    大神告诉你<b class='flag-5'>TCP</b><b class='flag-5'>建立</b><b class='flag-5'>连接</b>为什么是三次握手

    TCP通信通过网络调试助手与S7-1200建立TCP连接

    S7-1200 V4.5 版本开始支持网络视图组态开放式用户通信连接,不需要在程序中调用 TCON 等建立连接指令,只需要调用发送接收指令即可实现数据的收发。下面以 TCP 通信为例,
    的头像 发表于 07-06 15:39 9909次阅读

    TCP建立连接概述及三次握手、四次挥手的流程

    具备上述四个条件后A获取B的信息是有要求的,根本上的要求是数据信道可靠,就是平时所说的可靠连接,那么如何保证连接的可靠性呢,TCP协议就是靠确认应答机制、超时重传机制等保证连接可靠性的
    的头像 发表于 03-23 15:57 885次阅读
    <b class='flag-5'>TCP</b><b class='flag-5'>建立</b><b class='flag-5'>连接</b>概述及三次握手、四次挥手的流程

    什么是Socket连接?Socket与TCP连接的关系

    主机 A 的应用程序必须通过 Socket 建立连接才能与主机B的应用程序通信,而建立 Socket 连接需要底层 TCP/IP 协议来
    发表于 03-31 15:10 852次阅读

    TCP连接建立与中止

    常重要的 。 TCP 连接建立可以简单地称为三次握手,而连接的中止则可以称为四次挥手。 建立连接
    的头像 发表于 10-08 16:52 548次阅读

    TCP的长连接和短连接

    TCP在真正开始进行数据传输之前,Server 和 Client 之间必须建立一个连接。当数据传输完成后,双方不再需要这个连接时,就可以释放这个连接
    的头像 发表于 11-13 10:46 694次阅读