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_backingSYN_RECEIVED状态的等待队列数,默认1024
  • net.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-flood
  • net.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的链接

作者 Assaultcore

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注