1.研究tcp各状态之间的转换 及tcp相关内核参数的理解 sysctl.conf
TCP状态:
常用命令及参数
netstat #显示各种网络相关信息
-a 显示所有状态的socket
-n 不做名字解析,不加此参数,80端口会显示成http,127.0.0.1显示成localhost,uid为0显示成root等等
-e 显示更多信息如用户,inode
-p 显示pid和程序名字
-t 显示tcp链接
-u 显示udp链接
-x 显示unix套接字
ss #显示处于活动状态的套接字信息,能够显示更多更详细的有关TCP和连接状态的信息
-n 不解析服务名称,已数字方式显示
-a 显示所有套接字
-l 显示处于监听状态的套接字
-o 显示计时器信息
-e 显示详细的套接字信息
-m 显示套接字的内存使用情况
-p 显示使用套接字的进程
-i 显示内部的TCP信息
-s 显示套接字使用概况
-4 仅显示ipv4的套接字
-6 仅显示ipv6的套接字
-0 显示PACKET套接字
-t 只显示TCP套接字
-u 只显示UDP套接字
-d 只显示DCCP套接字
-w 只显示RAW套接字
-x 只显示 Unix套接字
-D 将原始TCP套接字信息转储到文件
11种状态与转换演示
- CLOSED:初始状态
- LISTEN:监听状态
- SYN_RCVD:收到第一次握手SYN,发出第二次握手ACK,等待第三次握手ACK的状态
- SYN_SENT:进行第一次握手,发出SYN,等待第二次握手ACK的状态
- ESTABLISHED:建立连接状态
- FIN_WAIT_1:发出FIN,第一次挥手,等待第二次挥手ACK状态
- FIN_WAIT_2:收到第二次挥手ACK,等待第三次挥手FIN状态
- TIME_WAIT:发出第四次挥手ACK后,等待2个MSL(最长报文段寿命)的状态,支行进入CLOSED
- CLOSING:双方同时关闭会话,导致发出FIN后先收到了FIN而不是ACK的状态,再接收到ACK后进入TIME_WAIT状态
- CLOSE_WAIT:收到FIN,回复ACK,等待数据传输完成关闭连接状态
- LAST_ACK:发出第三次挥手FIN,等待第四次挥手ACK状态
内核参数sysctl.conf
/etc/sysctl.conf
用于控制内核相关的配置参数,而且它的内容全部是对应于 /proc/sys/
这个目录的子目录及文件
使用sysctl -a
可以查看所有可用的内核参数变量和值
握手阶段
net.ipv4.tcp_syn_retries
:SYN包的重试次数,默认5次net.ipv4.tcp_max_syn_backing
:SYN_RECEIVED
状态的等待队列数,默认1024net.ipv4.tcp_syncookies
:当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击
数据传输阶段
net.ipv4.tcp_keepalive_probes
:在认定连接失效之前,发送TCP keepalive探测包的数量net.ipv4.tcp_keepalive_intvl
:探测消息未获得响应时,重发该消息的间隔时间(秒)net.ipv4.tcp_keepalive_time
:当keepalive起用的时候,TCP发送keepalive消息的频度
挥手阶段
ipv4.tcp_fin_timeout
:被动关闭方返回FIN后的超时时间,有效回收链接,避免syn-floodnet.ipv4.tcp_tw_recycle
= 1 打开快速回收TIME_WAIT。Enabling this option is not recommended since this causes problems when working with NAT (Network Address Translation)net.ipv4.tcp_tw_reuse
= 1 快速回收并重用TIME_WAIT的链接