zoukankan      html  css  js  c++  java
  • Linux TCP/IP协议之三次握手

    TCP/IP协议是整个网络通信中最重要的协议,它提供可靠安全的通信服务,这里只讲数据传输层的TCP协议的三次握手及相关内容。

    一,TCP报文头部报文数据结构

                 

           

              

    1,字段详细说明:
    源端口和目的端口:各占2个字节,分别写入源端口号和目的端口号。
    序号(seq):占4个字节。序号使用mod运算。TCP是面向字节流的,在一个TCP连接中传送的字节流中的每一个字节都按顺序编号。
    确认序号(用小写的ack表示):占4个字节,是期望收到对方下一个报文段的第一个数据字节的序号。若确认序号=N,则表明:到序号N-1为止的所有数据都已正确收到。
    数据偏移:占4位,表示TCP报文段的首部长度。注意,“数据偏移”的单位是32位字(即以4字节长的字为计算单位)。
    保留:占6位,保留为今后使用,目前置为0。
    6位标志位:URG、ACK、PSH、RST、SYN、FIN:

    URG: 标识紧急指针是否有效 ;
    ACK: 标识确认序号是否有效:1表示有效,0表示无效;
    PSH: 用来提示接收端应用程序立刻将数据从tcp缓冲区读走 ;
    RST: 要求重新建立连接. 我们把含有RST标识的报文称为复位报文段 ;
    SYN: 请求建立连接. 我们把含有SYN标识的报文称为同步报文段 ;
    FIN: 通知对端, 本端即将关闭. 我们把含有FIN标识的报文称为结束报文段;

    窗口:占2个字节。窗口值作为接收方让发送方设置其发送窗口的依据。
    检验和:占2字节。检验和字段检验的范围包括首部和数据这两部分。和UDP数据报一样,在计算检验和时,也要在TCP报文段的前面加上12字节的伪首部。伪首部的格式与UDP用户数据报的伪首部一样,但要将伪首部第四个字段中的17 改为6(协议号),把第5字段中的UDP长度改为TCP长度。
    紧急指针:占2字节。紧急指针仅在URG=1时才有意义,它指出本报文段中的紧急数据的字节数。

    二,三次握手过程

           

    1,过程文字说明:

    第一次握手:起初两端都处于CLOSED关闭状态,Client将标志位SYN置为1,随机产生一个值seq=x,并将该数据包发送给Server,Client进入SYN-SENT状态,等待Server确认;
    第二次握手:Server收到数据包后由标志位SYN=1得知Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=x+1,随机产生一个值seq=y,并将该数据包发送给Client以确 认连接请求,Server进入SYN-RCVD状态,此时操作系统为该TCP连接分配TCP缓存和变量;
    第三次握手:Client收到确认后,检查ack是否为x+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=y+1,并且此时操作系统为该TCP连接分配TCP缓存和变量,并将该数据包发送给Server,Server检查ack是否为y+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,至此双方完成三次握手,随后Client和Server就可以开始传输数据。

    2,状态说明:

    2.1, 三次握手的状态:
    LISTEN:侦听来自远方的TCP端口的连接请求;
    SYN-SENT:再发送连接请求后等待匹配的连接请求(如果有大量这样的状态包,检查是否中招了);
    SYN-RECEIVED:再收到和发送一个连接请求后等待对方对连接请求的确认(如有大量此状态,估计被flood攻击了);
    ESTABLISHED:代表一个打开的连接;

    2.2, 四次挥手的状态(顺道提一下,为TCP断开时的状态)
    FIN-WAIT-1:等待远程TCP连接中断请求,或先前的连接中断请求的确认;
    FIN-WAIT-2:从远程TCP等待连接中断请求;
    CLOSE-WAIT:等待从本地用户发来的连接中断请求;
    LAST-ACK:等待原来的发向远程TCP的连接中断请求的确认(不是什么好东西,此项出现,检查是否被攻击);
    TIME-WAIT:等待足够的时间以确保远程TCP接收到连接中断请求的确认;
    CLOSED:没有任何连接状态。

    三,SYN攻击
    在三次握手过程中,服务器发送SYN-ACK之后,收到客户端的ACK之前的TCP连接称为半连接(half-open connect),此时服务器处于Syn_RECV状态,当收到ACK后,服务器转入ESTABLISHED状态。
    Syn攻击就是 攻击客户端 在短时间内伪造大量不存在的IP地址,向服务器不断地发送syn包,服务器回复确认包,并等待客户的确认,由于源地址是不存在的,服务器需要不断的重发直至超时,这些伪造的SYN包将长时间占用未连接队列,正常的SYN请求被丢弃,目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪。
    Syn攻击是一个典型的DDOS攻击,DDOS攻击就是在多台客户端发起的分布式DOS攻击。当你在服务器上看到大量的半连接状态时,特别是源IP地址是随机的,基本上可以断定这是一次SYN攻击。

    在Linux下可以如下命令检测是否被Syn攻击:

    命令1:
       netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
    命令2:
       netstat -n|grep ^tcp|awk '{print $NF}'|sort -nr|uniq -c
    命令3:
       netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"t",state[key]}'
    返回结果一般如下:
       LAST_ACK 5 (正在等待处理的请求数)
       SYN_RECV 30
       ESTABLISHED 1597 (正常数据传输状态)
       FIN_WAIT1 51
       FIN_WAIT2 504
       TIME_WAIT 1057 (处理完毕,等待超时结束的请求数)

    四,TCP三次握手包的抓取
    linux提供了非常强大的tcpdump命令用于抓取:
    4.1,tcpdump参数:
    -A 以ASCII格式打印出所有分组,并将链路层的头最小化。
    -c 在收到指定的数量的分组后,tcpdump就会停止。
    -C 在将一个原始分组写入文件之前,检查文件当前的大小是否超过了参数file_size 中指定的大小。如果超过了指定大小,则关闭当前文件,然后在打开一个新的文件。参数 file_size 的单位是兆字节(是1,000,000字节,而不是1,048,576字节)。
    -d 将匹配信息包的代码以人们能够理解的汇编格式给出。
    -dd 将匹配信息包的代码以C语言程序段的格式给出。
    -ddd 将匹配信息包的代码以十进制的形式给出。
    -D 打印出系统中所有可以用tcpdump截包的网络接口。
    -e 在输出行打印出数据链路层的头部信息。
    -E 用spi@ipaddr algo:secret解密那些以addr作为地址,并且包含了安全参数索引值spi的IPsec ESP分组。
    -f 将外部的Internet地址以数字的形式打印出来。
    -F 从指定的文件中读取表达式,忽略命令行中给出的表达式。
    -i 指定监听的网络接口。
    -l 使标准输出变为缓冲行形式,可以把数据导出到文件。
    -L 列出网络接口的已知数据链路。
    -m 从文件module中导入SMI MIB模块定义。该参数可以被使用多次,以导入多个MIB模块。
    -M 如果tcp报文中存在TCP-MD5选项,则需要用secret作为共享的验证码用于验证TCP-MD5选选项摘要(详情可参考RFC 2385)。
    -b 在数据-链路层上选择协议,包括ip、arp、rarp、ipx都是这一层的。
    -n 不把网络地址转换成名字。
    -nn 不进行端口名称的转换。
    -N 不输出主机名中的域名部分。
    -t 在输出的每一行不打印时间戳。
    -O 不运行分组分组匹配(packet-matching)代码优化程序。
    -P 不将网络接口设置成混杂模式。
    -q 快速输出。只输出较少的协议信息。
    -r 从指定的文件中读取包(这些包一般通过-w选项产生)。
    -S 将tcp的序列号以绝对值形式输出,而不是相对值。
    -s 从每个分组中读取最开始的snaplen个字节,而不是默认的68个字节。
    -T 将监听到的包直接解释为指定的类型的报文,常见的类型有rpc远程过程调用)和snmp(简单网络管理协议;)。
    -t 不在每一行中输出时间戳。
    -tt 在每一行中输出非格式化的时间戳。
    -ttt 输出本行和前面一行之间的时间差。
    -tttt 在每一行中输出由date处理的默认格式的时间戳。
    -u 输出未解码的NFS句柄。
    -v 输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息。
    -vv 输出详细的报文信息。
    -w 直接将分组写入文件中,而不是不分析并打印出来。
    4.2,示例:
    tcpdump -i eth1 tcp and host 147.34.34.35 and port 22 -c 20000 -s 0 -nn
    tcpdump具体使用规则可百度。

    站在巨人的肩膀上,你会看的更远!

  • 相关阅读:
    VUE DEVTOOLS 安装方法(npm cnpm 安装失败找不到安装工具问题解决方法)
    idea 注释模版
    阿里巴巴编码规范
    JRebel 实现热部署
    SPRING 扩展组件
    oracle 闪回
    ORACLE 日常
    springboot log4j
    支付宝异步回调验证签名的那些走过的坑
    ASP.NET MVC5(一)—— URL路由
  • 原文地址:https://www.cnblogs.com/entrepreneur/p/11490674.html
Copyright © 2011-2022 走看看