TCP三次握手建立连接

因为我个人向左C++相关方向的开发,所以面试时TCP三次握手也是一个被经常问到的知识点。今天在这里就对TCP三次握手的过程进行总结,分析。如果有哪些知识点没有总结到位,还望各位大神提点。我们假设一个client向server发送TCP连接请求

1、TCP三次握手的图示过程


2、TCP三次握手描述

这里客户端要使用服务器上的某个基于TCP的服务,这里就说下三次握手建立连接的过程。

第一次握手:客户端向服务器端发送一个连接请求报文。这个报文的主要信息为SYN=1,ACK=0,seq=X,mss=1024

                client--------------SYN=1,ACK=0,seq=X,mss=1024-------------------->server


第二次握手:服务器端收到连接请求报文后给客户端返回一个请求+确认报文,这个报文中SYN=1,ACK=1,seq=Y,ack=X+1,mss=1024

               client<-------------SYN=1,ACK=1,seq=Y,ack=X+1,mss=1024---------------------server


第三次握手:客户端收到服务器端的报文后给客户端返回一个确认报文,完成TCP三次握手。通信双方连接建立完成。

                client---------------------SYN=0,ACK=1,ack=Y+1---------------------------->server


注意:TCP连接通信双发是全双工的。在每个SYN=1的报文的选项字段中有一个mss(最大报文段长度)值,用于告诉对方自己的能够发送的最大报文段长度。最终以两者最小值作为mss,两次SYN报文以“协商”的方式来获取本次通信过程中TCP报文的mss。

3、TCP三次握手过程中出现的问题

Q1:为什么要使用三次握手,而不是两次握手?

答:简单的说是为了防止已经失效的连接请求到达服务器端。

SYN连接请求报文从客户端到达服务器端所经过的网络路径是非常复杂的,每一次传输路径都是不确定的(由具体的路由器,网络拥堵情况决定)。当客户端发出一个连接请求报文后会启动一个定时器,如果网络发送拥塞,当在规定时间内客户端没有收到SYN+ACK报文的话就认为之前发送的SYN报文段在传输过程中丢失了,客户端会使用“超时重传”机制重新发送一个新SYN连接请求报文段。但是实际上之前那个连接请求报文没有失效,只不过是在网络中滞留的时间比较长,一段时间后这个报文还是会到达服务器端。然后服务器端收到这个报文后会返回一个SYN+ACK应答报文,但是客户端认为这个我并没有发送这个请求报文(因为这个报文已经失效了,通过报文段的序列号可以知道并没有发送这个报文的连接请求),因此不会理会这个应答报文。

如果采用两次握手的话,客户端收到一个应答报文就相当于建立了TCP连接。那么就不能处理网络中很多失效的报文。

Q2:什么是SYN攻击?

答:在三次握手过程中,当服务器端发送SYN+ACK报文(第二次握手)后,而客户端发送ACK报文(第三次握手)之前,这被称为“半连接”状态。

在每个服务器端都有一个“连接请求队列”,如果服务器端正在处理某个请求,那么新来的请求就要先暂存在连接请求队列中。这个队列的长度也是有限的。

所谓“SYN攻击”就是攻击程序虚拟出多个不同IP的客户端,不断的向服务器端发送SYN报文。服务器端收到SYN报文后,就会给目的IP标示的客户端返回SYN+ACK报文,并且等待收到客户端的ACK报文。但是这些客户端的IP都是恶意程序虚拟出来的,实际并不存在,这会造成服务器端因为不能收到客户端的确认报文而不断地超时重发SYN+ACK报文。这使得正常请求报文的因为连接请求队列满而被丢弃,从而引发网络阻塞甚至瘫痪。

检测SYN攻击也是比较简单的,即当server端有大量的半连接状态,并且源IP地址都是随机的,可以确定服务器端遭受了SYN攻击。

linux下检测SYN攻击的命令为:netstat -n -p TCP | grep SYN_RECV

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值