三次握手是指用户端在和服务端建立tcp连接的时候需要进行三次通信,而后才能完成连接。
这三次通信分别是:
这个时候,连接就已经建立了。双方可以进行数据传输了。
主要还是由于存在数据可能丢失的问题,也就是说不论是用户端或者者服务端,都不能确定自己发出的信息对方有没有正常接收到,所以需要对方发送一个回复信息。用于确定自己发出的信息已经被对方正常接收。
比方服务端可能会同时接收多个用户端的连接请求,它是如何区分不同用户端的呢?答案就是随机值。
用户端在第一次握手的时候,会生成一个随机数(j),和数据包一起发送给服务端;
第二次握手的时候,服务端会将这个随机值+1(j+1),同时服务端也生成一个随机值(k)一起再返回给用户端;
第三次握手的时候,用户端会检验j+1的值,假如检验通过,会将k+1,而后发送给服务端,服务端检验k+1的值,检验通过以后,连接就建立了。
当然,实际的tcp连接中,数据包不只是包含随机值,同时还有各种标志位用于确认请求。
在三次握手过程中,当服务端发送SYN-ACK之后收到用户端的ACK之前的状态称为半连接状态,假如服务端一直没有收到用户端的ACK包,服务端需要不断重发直到超时。SYN攻击就是用户端在短时间内大量伪造不存在的ip地址,向服务端发起连接请求,因为源地址不存在,服务端一直不能收到用户端返回的ACK包,导致网络堵塞甚至系统瘫痪。SYN攻击是一种典型的DDOS攻击,假如服务端有大量半连接状态且源ip地址是随机的,则可以判断遭到SYN攻击。可以使用:
#netstat -nap | grep SYN_RECV
四次挥手是指断开TCP连接时,需要用户端和服务端总共发送4次数据包以确认连接的断开
因为TCP连接是全双工的,因而,每个方向都需要单独进行关闭。这一准则是指当一方完成数据传输任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只意味着这一方向上没有数据传输,但在这个TCP连接上依然能够发送数据,直到这一方向也发送FIN来。
首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭。
完成四次挥手。
这是由于当收到对方的FIN报文时,仅仅表示对方不再发送数据了,但是还能接收数据。己方也未必一律将数据都发送给对方了,所以己方可以立即CLOSE,也可以发送一个数据给对方后,再发送FIN报文给对方表示同意现在关闭连接,因而,己方ACK和FIN一般都会分开发送。
起因有二:
先说第一点,假如client直接CLOSED了,那么因为IP协议的不可靠性或者者是其它网络起因,导致server没有收到client最后回复的ACK。那么server就会在超时之后继续发送FIN,此时因为client已经CLOSED了,就找不到与重发的FIN对应的连接,最后server就会收到RST而不是ACK,server就会以为是连接错误把问题报告给高层。这样的情况尽管不会造成数据丢失,但是却导致TCP协议不符合可靠连接的要求。所以,Client不是直接进入CLOSED,而是要保持TIME_WAIT,当再次收到FIN的时候,能够保证对方收到ACK,最后正确的关闭连接。
再说第二点,假如client直接CLOSED,而后又再向server发起一个新连接,我们不能保证这个新连接与刚关闭的连接的端口号是不同的。也就是说有可能新连接和老连接的端口号是相同的。一般来说不会发生什么问题,但是还是有特殊情况出现:假设新连接和已经关闭的老连接端口号是一样的,假如前一次连接的某些数据依然滞留在网络中,这些推迟数据在建立新连接之后才到达Server,因为新连接和老连接的端口号是一样的,又由于TCP协议判断不同连接的依据是socket pair,于是,TCP协议就认为那个推迟的数据是属于新连接的,这样就和真正的新连接的数据包发生混淆了。所以TCP连接还要在TIME_WAIT状态等待2倍MSL,这样可以保证本次连接的所有数据都从网络中消失。