Chinaunix首页 | 论坛 | 博客
  • 博客访问: 140533
  • 博文数量: 21
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 233
  • 用 户 组: 普通用户
  • 注册时间: 2013-03-17 15:31
个人简介

学习中。。

文章分类

全部博文(21)

文章存档

2015年(1)

2014年(17)

2013年(3)

我的朋友

分类: 嵌入式

2014-10-29 20:31:59

TCP协议三次握手过程分析

1、基本概念

TCP(Transmission Control Protocol) 传输控制协议

TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接:

位码即tcp标志位,有6种标示:SYN(synchronous建立联机) ACK(acknowledgement 确认) PSH(push传送) FIN(finish结束) RST(reset重置) URG(urgent紧急)

Sequence number(顺序号码) Acknowledge number(确认号码)

在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。 
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认; 
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态; 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。 完成三次握手,客户端与服务器开始传送数据.

对上述三点的解释:

第一次握手:主机A发送位码为syn=1,随机产生seq number=1234567的数据包到服务器,主机B由SYN=1知道,A要求建立联机;

第二次握手:主机B收到请求后要确认联机信息,向A发送ack number=(主机A的seq+1),syn=1,ack=1,随机产生seq=7654321的包

第三次握手:主机A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,主机A会再发送ack number=(主机B的seq+1),ack=1,随机产生seq=87654主机B收到后确认seq值与ack=1则连接建立成功。

完成三次握手,主机A与主机B开始传送数据。


2、实例


图片有点小双击放大看

对上图的解释:
第一次握手:10.48.55.249发送位码syn=1,随机产生seq number=X=0的数据包到125.210.138.29,125.210.138.29由SYN=1知道10.48.55.249要求建立联机;

第二次握手:125.210.138.29收到请求后要确认联机信息,向10.48.55.249发送ack number=X+1=1,syn=1,ack=1,随机产生seq=Y=0的包;

第三次握手:10.48.55.249收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1。若正确,10.48.55.249会再发送ack number=Y+1=1,ack=1,seq=Z=1,125.210.138.29收到后确认ack=Z+1,ack=1则连接建立成功。

------------------------------------------------------------------------------------------------

3、图解TCP三次握手
 
    所谓三次握手(Three-way Handshake),是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。
 
三次握手的目的是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号并交换 TCP 窗口大小信息.在socket编程中,客户端执行connect()时。将触发三次握手。
 
 
 
 
  • 第一次握手:
    客户端发送一个TCP的SYN标志位置1的包指明客户打算连接的服务器的端口,以及初始序号X,保存在包头的序列号(Sequence Number)字段里。

        图A1:第一次握手的IP头部信息:

        从A1可以看出IP报文头部信息:(1)版本号是4,即IPV4;
                                    (2)头长度20字节;
                                    (3)总长度是60字节;
                                    (4)标识0xd773;
                                    (5)标志0x02;
                                    (6)段偏移量0;
                                    (7)生存期64;
                                    (8)协议TCP(6);
                                    (9)头部校验和0x1930
                                    (10)源地址:10.48.55.249
                                    (11)目标地址:125.210.138.29
        主要看原地址和目标地址,指明了报文的发送方向。
        图A2:第一次握手的TCP头部信息:

        从A2可以看出TCP报文头部信息:(1)源端口:55051;
                                    (2)目标端口:80;
                                    (3)顺序号:0;
                                    (4)应答号:0;
                                    (5)TCP头部信息长度40字节;
                                    (6)标志:0x002,即SYN=1;
                                    (7)窗口大小:5840字节;
                                    (8)校验和:0x1d77;
                                    (9)紧急指针:0;
                                    (10)可选项:20字节。
                       

        图A3:TCP头部格式,标注握手时应该变化的内容:

        A3对比A2的结果,这里的顺序号X=0,SYN=1.第一次握手成功

  • 第二次握手:
    服务器发回确认包(ACK)应答。即SYN标志位和ACK标志位均为1同时,将确认序号(Acknowledgement Number)设置为客户的Sequence number加1以.即X+1。


        图B1:第二次握手的IP头部信息:

        从B1可以看出IP报文头部信息:(1)版本号是4,即IPV4;
                                    (2)头长度20字节;
                                    (3)总长度是60字节;
                                    (4)标识0xd773;
                                    (5)标志0x02;
                                    (6)段偏移量0;
                                    (7)生存期252;
                                    (8)协议TCP(6);
                                    (9)头部校验和0x8741;
                                    (10)源地址:125.210.138.29
                                    (11)目标地址:10.48.55.249
        主要看原地址和目标地址,指明了报文的发送方向。
        图B2:第二次握手的TCP头部信息:

        从B2可以看出TCP报文头部信息:(1)源端口:80;
                                    (2)目标端口:55051;
                                    (3)顺序号:0;
                                    (4)应答号:1;
                                    (5)TCP头部信息长度44字节;
                                    (6)标志:0x012,即SYN=1,ACK=1;
                                    (7)窗口大小:4380字节;
                                    (8)校验和:0xb2ab;
                                    (9)紧急指针:0;
                                    (10)可选项:24字节。




        B3对比B2的结果,这里的顺序号Y=0,应答号=X+1=1,SYN=1,ACK=1第二次握手成功

  • 第三次握手.
    客户端再次发送确认包(ACK) SYN标志位为0,ACK标志位为1.并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方.并且在数据段放写Sequence number的+1
        图C1:第三次握手的IP头部信息:

        从C1可以看出IP报文头部信息:(1)版本号是4,即IPV4;
                                    (2)头长度20字节;
                                    (3)总长度是60字节;
                                    (4)标识0xd773;
                                    (5)标志0x02;
                                    (6)段偏移量0;
                                    (7)生存期64;
                                    (8)协议TCP(6);
                                    (9)头部校验和0x1937;
                                    (10)源地址:10.48.55.249
                                    (11)目标地址:125.210.138.29
            图C2:第三次握手的TCP头部信息:

        从C2可以看出TCP报文头部信息:(1)源端口:55051
                                    (2)目标端口:80;
                                    (3)顺序号:1;
                                    (4)应答号:1;
                                    (5)TCP头部信息长度32字节;
                                    (6)标志:0x010,即ACK=1;
                                    (7)窗口大小:365字节;
                                    (8)校验和:0x0225;
                                    (9)紧急指针:0;
                                    (10)可选项:12字节。


    C3对比C2的结果,这里的顺序号Y=Z,应答号=Y+1=1,ACK=1第三次握手成功

一个完整的三次握手也就是 请求---应答---再次确认

SYN攻击

   在三次握手过程中,服务器发送SYN-ACK之后,收到客户端的ACK之前的TCP连接称为半连接(half-open connect).此时服务器处于Syn_RECV状态.当收到ACK后,服务器转入ESTABLISHED状态.

  Syn攻击就是 攻击客户端 在短时间内伪造大量不存在的IP地址,向服务器不断地发送syn包,服务器回复确认包,并等待客户的确认,由于源地址是不存在的,服务器需要不断的重发直 至超时,这些伪造的SYN包将长时间占用未连接队列,正常的SYN请求被丢弃,目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪。

 Syn攻击是一个典型的DDOS攻击。检测SYN攻击非常的方便,当你在服务器上看到大量的半连接状态时,特别是源IP地址是随机的,基本上可以断定这是一次SYN攻击.在Linux下可以如下命令检测是否被Syn攻击

netstat -n -p TCP | grep SYN_RECV

一般较新的TCP/IP协议栈都对这一过程进行修正来防范Syn攻击,修改tcp协议实现。主要方法有SynAttackProtect保护机制、SYN cookies技术、增加最大半连接和缩短超时时间等.

但是不能完全防范syn攻击。

4、TCP 四次挥手

    TCP的连接的拆除需要发送四个包,因此称为四次挥手(four-way handshake)。客户端或服务器均可主动发起挥手动作,在socket编程中,任何一方执行close()操作即可产生挥手操作。

 

 

 

参见wireshark抓包,实测的抓包结果并没有严格按挥手时序。我估计是时间间隔太短造成。


原文链接:http://www.cnblogs.com/CBDoctor/archive/2012/10/17/2727073.html
阅读(2026) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~