浅谈TCP的三次握手

上一篇文章《浅谈TCP/IP协议栈模型》https://mp.csdn.net/postedit/95853735简单介绍了标准TCP/IP协议栈的四层网络结构,主要对每一层协议做了简单的描述和网络协议抓包,基于上篇文章的传输层,本篇文章主要对TCP协议的三次握手及四次挥手做一个简单学习总结。

TCP的三次握手(Three-way Handshake)

三次握手顾名思义就是在TCP建立连接时,需要客户端和服务器总共发送三个包,三次握手的目的就是连接服务器指定的端口,并同步连接双方的序列号和确认号,并交换TCP窗口大小等信息

                    

第一次握手:

客户端发送一个TCP的SYN标志位置1的包指明客户打算连接的服务器的端口,以及初始序号X,保存在包头的序列号(Sequence Number)字段里,此时客户端进入SYN_SEND状态,等待服务器B确认。

                    

第二次握手:

服务器发回确认包(ACK)应答。即SYN标志位和ACK标志位均为1同时,将确认序号(Acknowledgement Number)设置为客户的I S N加1以.即X+1。并设置发送序号为Y,此时服务端进入SYN_RECV状态

                     

第三次握手.

客户端再次发送确认包ACK为1,此时的SYN标志位为0. 并且把服务器发来的序号字段+1,即Y+1,放在确定字段中发送给对方.并且将发送序号的ISN的+1,客户端和服务端进入ESTABLISHED状态,完成三次握手

                     

为什么需要三次握手?

答:三次握手完成了两个重要的功能,既要双方做好发送数据的准备工作(双方都知道彼此已准备好),也要允许双方就初始序列号进行协商,这个序列号在握手过程中被发送和确认。

    现在假设把三次握手改成仅需要两次握手,计算机Client和Server之间的通信,Client给Server发送一个连接请求分组,Server收到了这个分组,并发 送了确认应答分组。按照两次握手的协定,Server认为连接已经成功地建立了,可以开始发送数据分组。可是,Client在Server的应答分组在传输中被丢失的情况下,将不知道Server是否已准备好,不知道Server建立什么样的序列号,Client甚至怀疑Server是否收到自己的连接请求分组。在这种情况下,Client认为连接还未建立成功,将忽略Server发来的任何数据分 组,只等待连接确认应答分组。而Server在发出的分组超时后,重复发送同样的分组。这样就形成了死循环。

三次握手有什么缺点?

答:在三次握手过程中,服务器发送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攻击。

三次握手抓包入下:


发布了33 篇原创文章 · 获赞 7 · 访问量 8354

猜你喜欢

转载自blog.csdn.net/muchong123/article/details/95923506
今日推荐