zoukankan      html  css  js  c++  java
  • TCP三次握手及TCP连接状态 TCP报文首部格式

    建立TCP连接时的TCP三次握手和断开TCP连接时的4次挥手整体过程如下图:

    开个玩笑

    ACK: TCP协议规定,只有ACK=1时有效,连接建立后所有发送的报文ACK必须为1

    SYN(SYNchronization同步):在连接建立用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文。对方若同意建立连接,则应在响应报文中使用SYN=1

    ACK=1因此,SYN置1表示这是一个连接请求或连接接受报文

    FIN(FINIS)即完,终结的意思,用来释放一个连接。当FIN=1时,表明此报文段发送方的数据已经发送完毕,并要求释放连接

    TCP三次握手过程:

    1. 首先由Client发出请求连接即SYN=1,声明自己的序号seq=X

    2. 然后Server进行回复确认,即SYN=1 声明自己的序号seq=y,并设置ack=x+1

    3 .最后Client再进行一次确认,设置seq=x+1 ack+y+1

    注:seq 序列号范围:2^32-1 如果超过最大值,再从0开始

    seq 序列号作用:依据这个序列号来组数据,如果发N个数据包,服务端会按序列号来重新组装数据

    使用tcpdump抓取TCP三次握手

    tcpdump 常用参数:

    -c 指定包个数

    -n ip,端口用数字方式显示

    port 指定端口

    Client:192.168.94.11

    server:192.168.94.22

    使用Client ssh Server

    查看Server端

    Flag[S]中的S表示为SYN包为1 。client主机返回ack=1 这个值为相对序号,如果想查看完整序号可以命令后面加-S

    TCP连接状态 : 

    服务器端:LISTEN:侦听来自远方的TCP端口的连接请求

    客户端:SYN-SENT:再发送连接请求后等待匹配的连接请求

    服务器端:SYN-RECEIVED:再收到和发送一个连接请求后等待对方对连接请求的确认

    客户端/服务器端:ESTABLISHED:代表一个打开的连接

    客户端:FIN-WAIT-1:等待远程TCP连接中断请求,或先前的连接中断请求的确认

    服务器端:CLOSE-WAIT:等待从本地用户发来的连接中断请求

    客户端:FIN-WAIT-2:从远程TCP等待连接中断请求

    服务器端:LAST-ACK:等待原来的发向远程TCP的连接中断请求的确认

    客户端:TIME-WAIT:等待足够的时间以确保远程TCP接收到连接中断请求的确认

    服务器端:CLOSED:没有任何连接状态

    在服务端返回一个确认的SYN-ACK包的时候有个潜在的弊端,如果发起的客户是一个不存在的客户端,那么服务端就不会接到客户端回应的ACK包

    这时服务端需要耗费一定的数量的系统内存来等待这个未决的连接,直到等待超关闭时间,才能施放内存

    如果恶意者通过通过ip欺骗,发送大量SYN包给受害者系统,导致服务端存在大量未决的连接并占用大量内存和tcp连接,从而导致正常客户端无法访问服务端,这就是SYN洪水攻击的过程

  • 相关阅读:
    普通线程类获取service,controller等spring容器类
    java拦截器获取请求完整参数
    分享几个免费IP地址查询API接口
    echarts热力地图
    echarts ajax请求demo
    mysql统计前24小时数据没有补0
    java获取来访者mac信息
    java获取本机mac物理地址
    mysql5.7以上基本配置
    springboot拦截异常信息发送邮件提醒
  • 原文地址:https://www.cnblogs.com/bigdevilking/p/9551744.html
Copyright © 2011-2022 走看看