TCP协议

本文介绍了TCP三次握手的过程,包括其目的和半连接队列的作用。重点讨论了SYNTimeout现象及SYNFlood攻击,提出了防御措施,如缩短SYNTimeout、增大半连接队列、使用SYNCookie等。同时涵盖了FIN报文、RST报文以及防火墙在断开连接中的角色。
摘要由CSDN通过智能技术生成

建立连接

客户端在与服务端进行通信之前,需要先建立连接。连接由客户端发起,经历以下步骤(三次握手):

  • 客户端发送SYN报文,将自己修改称SYN_SENT状态
  • 服务端收到SYN报文后建立连接,将自己修改称SYN_RCVD状态,并发送SYN&ACK报文
  • 客户端收到seq报文后,将自己改成ESTABLISHED状态,并答复ACK报文。
    三次握手

以上过程简称三次握手,主要目的如下:

  • 确保连接可靠 - 如果只有一次握手,客户端发送连接后就建议连接,客户端无法保证与服务端的连接是联通的。

  • 避免重复创建连接 - 如果只有两次握手,即服务端收到SYN报文后就创建连接,由于TCP的重连机制,在复杂的网络环境下,客户端可能会多次发送SYN报文来尝试建立连接。

半连接队列

客户端发送SYN到服务端,服务端收到了SYN并返回一个SYN+ACK,在服务端收到客户端的ACK报文之前,连接处于SYN-RCVD状态,被称为半连接,存放在服务端操作系统内核的半连接队列中。

SYN Timeout

客户端发送SYN请求后死机或者断线,服务端收到请求后返回的SYN+ACK (第二次握手)给客户端,但是客户已经死机,不能应答,即第三次握手没法完成。
服务端不知道客户端已经死机了,它只会认为它的SYN+ACK没有到达客户端,这种情况下,服务端会进行请求重发,默认情况下Linux系统中,服务端会发送重发五次SYN+ACK包,第一次等待时间为1秒,之后每次时间为前面时间的两倍,因此五次分别是 1s、2s、4s、8s、16s,第五次发出后等待32秒,没有响应,那么第五次也超时了,一共需要 1+2+4+8+16+32 = 63s后,TCP就会把这个连接断开,这个 63s我们称之为 SYN Timeout.

SYN Flood攻击

半连接队列的大小有限,队列满了后,新的TCP连接将被内核丢弃。SYN Flood攻击指的是攻击者伪造大量客户端发送SYN请求到服务端,服务端响应ACK + SYN报文,并将当前TCP连接放在半连接队列,但是客户端的IP是伪造的,服务端的报文将无法到达,导致不断重试,最终SYN Timeout。SYN Flood是一种典型的DOS攻击(Denial of Service - 拒绝服务)

有以下几种手段来防御SYN Flood攻击:

  • 缩短SYN Timeout
  • 增加半连接队列大小
  • 安全防护产品进行过滤
  • SYN Cookie - 对三次握手进行修改,TCP处于SYN_RCVD状态时,不放入内核的半连接队列,而是为这次请求计算一个Cookie值,这个值作为SYN + ACK响应报文的seq值,客户端返回ACK的时候计算序列号,如果匹配则正常连接。

断开连接

客户端主动断开

与建立连接时发送的SYN报文不同的是,断开连接发送的是FIN报文。由于服务端收到关闭报文的时候可能还在写响应请求,因此不能直接关闭,所以会先把自己改成CLOSE_WAIT状态,等待自己处理完成后,再给客户端发送FIN报文,客户端答复ACK后,两边关闭。

如果服务端收到FIN报文后,等待自己把所有的响应数据包写入完成后再给客户端发送FIN报文,有可能等待时间过长,会让客户端一直重试发送FIN报文。
客户端断开连接

服务端主动断开

服务端主动关闭跟客户端主动关闭过程类似。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传服务端断开连接

RST报文

除了常规的四次挥手断开已建立的连接外,TCP协议还提供Reset报文来实现快速关闭连接。
reset报文断开连接

防火墙断开连接

一般防火墙产品都有断开空闲连接的功能,对于四层协议防火墙,断开连接后如果收到了请求通常会发送一个RST报文通知调用者关闭连接,但是三层协议的防火墙,收到请求会直接丢弃掉,导致调用端一直重试,linux下默认值是15次(大约900s),可以改成5次(大约6s)

# vim /etc/sysctl.conf
net.ipv4.tcp_retries2=5
#使配置生效
sysctl -p
#验证是否修改成功
cat /proc/sys/net/ipv4/tcp_retries2

防火墙断开连接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值