tcp三次握手四次挥手

tcp三次握手四次挥手

TCP状态图

tcp三次握手四次挥手_第1张图片
Paste_Image.png

TCP状态时序图

tcp三次握手四次挥手_第2张图片
Paste_Image.png

tcp三次握手

流程图:

client | | server
SYN_SEND | --> SYN(seq=x) --> | LISTEN

| <-- SYN(seq=y),ACK(seq=x+1) <-- | SYN_RECV

ESTABLESHED | --> ACK(seq=y+1) --> | ESTABLESHED

TCP握手状态说明:

TCP_SEND 发起TCP连接请求,发送SYN,等待服务器确认
TCP_RECV 介绍TCP连接请求,并回复ACK及SYN,等待客户端确认
ESTABLESHED 建立TCP连接

SYN攻击

服务端在收到SYN,回复SYN+ACK后,TCP为TCP_RECV连接状态,有一个等待对方ACK的重连超时机制
攻击者利用这种机制,通过伪造大量不存在的IP给服务器发送SYN,导致服务器有大量TCP连接停留在TCP_RECV状态,得不到客户端ACK的确认。服务器需要不断的重发至超时,这些伪造TCP连接长期占用TCP未连接队列,导致正常的SYN请求被丢弃,服务器运行缓慢,严重者引发堵塞甚至系统瘫痪。

SYN攻击是典型的Ddos攻击。检查SYN攻击非常方便,但服务器出现大量TCP_RECV状态时,特别是源IP地址随机,基本上可以判定这是一次SYN攻击
linux下可以同如下命令检测
ss -at |awk '{++s[$1]} END {for(i in s)print i,\t,s[i]}'

TCP握手内核相关参数

表示SYN队列的长度,默认为1024
net.ipv4.tcp_max_syn_backlog

syn-ack握手状态重试次数,默认5
net.ipv4.tcp_synack_retries

对于一个新建连接,内核要发送多少个 SYN 连接请求才决定放弃。不应该大于255,默认值是5,对应于180秒左右。
net.ipv4.tcp_syn_retries

使用 Selective ACK,管理TCP的选择性应答,允许接收端向发送端传递关于字节流中丢失的序列号,减少了段丢失时需要重传的段数目,当段丢失频繁时,sack是很有益的。(这可以通过有选择地应答乱序接收到的报文来提高性能(这样可以让发送者只发送丢失的报文段)。(对于广域网通信来说这个选项应该启用,但是这会增加对 CPU 的占用。)
net.ipv4.tcp_sack

表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为1,表示开启的;
net.ipv4.tcp_syncookies

设置tcp/ip会话的滑动窗口大小是否可变。参数值为布尔值,为1时表示可变,为0时表示不可变。tcp/ip通常使用的窗口最大可达到 65535 字节,对于高速网络,该值可能太小,这时候如果启用了该功能,可以使tcp/ip滑动窗口大小增大数个数量级,从而提高数据传输的能力
net.ipv4.tcp_window_scaling

TCP四次挥手

主动关闭端 | | 被动关闭端
FIN_WAIT1 | --> FIN(seq=j) --> | ESTABLESHED

FIN_WAIT2 | <-- ACK(seq=j+1) <-- | CLOST_WAIT

TIME_WAIT | <-- FIN(sqe=k) <-- | LAST_ACK

CLOSED/timeout| --> ACK(seq=k+1) --> | CLOSED

状态说明

FIN_WAIT1 主动关闭端发起关闭TCP连接,发送FIN,等待对端确认,表示主动端没有数据发送,但可以接受数据
CLOST_WAIT 被动关闭端接受对端的FIN,并做ACK回复,等待本机数据发送完成,如果自己还要数据没发送完成,还可以继续发送数据,但不会接收数据
FIN_WAIT2 主动关闭端接受到对端的FIN确认包ACK,等待对端发送FIN
LAST_ACK 被动关闭端发送FIN,等待对端FIN确认
TIME_WAIT 主动关闭端接受对端的FIN,且回复ACK后,等待2个MSL,没有接受到对端的数据,就变成CLOSED状态
CLOSED TCP连接关闭

TCP挥手内核相关参数

表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;客户端是nat环境或者服务器在nat环境,最好不要开启
net.ipv4.tcp_tw_reuse

表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。客户端是nat环境或者服务器在nat环境,最好不要开启
net.ipv4.tcp_tw_recycle

表示系统同时保持TIME_WAIT的最大数量,如果超过这个数字,TIME_WAIT将立刻被清除并打印警告信息。
net.ipv4.tcp_max_tw_buckets

表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间
net.ipv4.tcp_fin_timeout

常用的三种TCP状态

SYN_RECV

服务器收到SYN包后,返回ACK+SYN包,但没有收到ACK包时的状态为SYN_RECV
内核中相关参数
net.ipv4.tcp_syn_retries
net.ipv4.tcp_syncookies

CLOSE_WAIT

被动关闭端收到FIN后,没有回复ACK包的时候为CLOSE_WAIT。一般是程序代码问题导致

TIME_WAIT

主动关闭端收到对方的FIN,并且回复ACK后,状态为TIME_WAIT,状态持续2个MSL时间后socket会被回收。
TIME_WAIT状态的socket是不能被回收的。服务器一般处理大量的短连接,服务端主动关闭连接,会出现大量的TIME_WAIT。严重会影响服务器的处理能力
内核相关参数调优
net.ipv4.tcp_tw_recycle
net.ipv4.tcp_tw_reuse
net.ipv4.tcp_fin_timeout
net.ipv4.tcp_max_tw_buckets

你可能感兴趣的:(tcp三次握手四次挥手)