在将TCP之前我们得了解什么是TCP,下面就简单的介绍一下TCP。
TCP是一种计算机网络协议,是一种面向连接的、可靠性、基于字节流的传输层通信协议。
在互联网中我们经常会使用到TCP协议,就像我们访问一个网站,网址域名就得带上http://或者https://开头的网址域名(而https也是属于http协议的,只不过https是以安全为目标的http通道,即是http下加了SSL,因此加密的详细内容就是SSL。)http协议是对应于应用层,而TCP协议是对应于传输层,所以http协议是建立在tcp的基础上的。为什么说是http协议是简历在tcp的基础上呢?因为互联网是由一整套协议构成的,而TCP和http只是其中的两个层,有着自己的分工。
下面就直接进入主题,TCP的三次握手过程:
第一步:客户端发送一个包含SYN标识的TCP报文,SYN即同步(Synchronize)的意思,SYN报文会指明客户端的端口号及TCP连接的初始序列号。
第二步:服务器在收到客户端的SYN报文后,会返回一个SYN+ACK的报文,表示客户端请求被接收,同时,TCP序列号被加一,ACK即确认的意思(Acknowledgment)
第三步:客户端在接收服务端的SYN+ACK报文后,也会返回一个ACK报文给服务端,同样,TCP序列号被加一,TCP连接便建立好了,接下来便可以进行数据通信。
以上就是TCP的三次握手的过程,那么我们来思考一下;
1、TCP的三次握手有什么缺点?
TCP协议为实现可靠传输,在三次握手的过程中设置了一些异常处理机制。第三步中如果服务器没有收到客户端的ACK报文,服务端一般会进行重试,也就是再次发送SYN+ACK报文给客户端,并且一直处于SYN_RECV状态,将客户端加入等待列表。重发一般会进行3~5次,大约每隔30秒左右会轮询一遍等待队列,重试所有客户端;另一方面,服务器在发出SYN+ACK报文后,会预分配一部分资源给即将建立的TCP连接,这个资源在等待重试期间一直保留,更为重要的是,服务器资源有限,可以维护的等待列表超过极限后就不再接收新的SYN报文,也就是建立新的TCP连接。
SYN Flood攻击正是利用了TCP协议三次握手的过程来达成打击的目的。攻击者伪造大量的IP地址给服务器发送SYN报文,但是由于伪造的IP地址不存在,也就不可能在客户端得到任何回应,服务端将维护一个非常大的半连接等待列表,并且不断对这个列表中的IP地址进行遍历和重试,大量的占用了服务器资源。严重的是,由于服务器资源有限,大量的恶意客户端占满了服务器的等待队列,导致服务器不再接受新的SYN请求,正常用户无法完成三次握手与服务端通信。
防止SYNFlood攻击有很多种办法,例如从防火墙进行防御和更多的网络安全技术,这里就不再做详细介绍。
2、为什么TCP要三次握手/为什么是三次握手?
答:三次握手的目的是:为了防止已经失效的连接请求报文段突然又传到服务端,因产生错误。我们也要知道TCP是全双工的,也就是说客户端给服务端发送信息的同时,服务器端也能给客户端发送信息。就像是两个人通电话,我们就来模拟一次小张和小明通电话的过程:
小张:喂,小明你能听得到我的声音吗?(第一次握手)
(如果信号正常,小明能听到小张的声音,那么小明肯定会告诉小张)
小明:我可以听到你说话,你能听到我说话吗?(第二次握手)
小张:嘻嘻,我能听到你说话了,那接下来我们就来通电话吧。(第三次握手)
在三次握手后,就能确定两边都没什么问题,就可以互相通信了,如果是四次握手的话就会造成了资源浪费,如果是两次握手的话就会有一边不能确定另一边是否有问题,这就是为什么会是TCP三次握手。
TCP的三次握手就讲到这,下篇文会给大家继续讲解TCP的四次握手,如果您觉得好看就往右下方点“好看”,多支持支持我呀!
长按下方二维码自动识别关注
领取专属 10元无门槛券
私享最新 技术干货