HTTP链接3次握手与4次挥手笔记

180 阅读6分钟

三次握手

  1. 客户端发送SYN报文并指明当前客户端的初始化序列号@ISN,状态处于SYN_SEND。
  2. 服务端接收SYN报文段,并返回自己的SYN报文并指定自己的ISN初始化序列号,然后将客户端的序列号值+1作为ACK报文段的值然后统一返回,此时服务端状态处于SYN_REVD。
  3. 客户端收到SYN,发送ACK报文,也将服务端的初始化序列号+1作为ack确认号的值进行返回,状态处于ESTABLISHED,服务端在接收到ACK后,状态改为ESTABLISHED,此时双方链接建立。

为什么需要三次握手

  1. 客户端发送网络包,服务端得出结论:客户端发送能力与服务端接收能力正常。
  2. 服务端发包,客户端接收:客户端得出结论:客户端发送、接收和服务端发送、接收能力均正常。
  3. 但此时服务端并不确定客户端接收是否正常,所以客户端返回确认包给服务端,服务端接收,双方确认完毕。

半链接队列-全链接队列

  • 当服务端第一次接收到客户端的SYN时,状态会处于SYN_RCVD,此时双方还没有完全创立链接,那么服务端就会将此状态的请求链接放入一个队列,它就是半链接队列。
  • 同样当三次握手完成的链接,也会放入一个队列,那么就是全链接队列。

服务端SYN_ACK重传

  • 当服务端发送完SYN-ACK报文后,若没有收到客户端的ACK确认包,服务端进行首次重传,等待一段时间若还未收到确认包,将继续重传,当超过系统规定的最大重传次数,将此链接作废,从半链接队列中删除,每一次等待时间不一定相同,可能是递增的,1s,2s,4s,8s......

ISN不是固定的

  • 当一端建立链接并发送SYN时,它为链接初始化了序列号,即ISN,ISN会4ms递增1,每个链接都具有不同的ISN,可以防止攻击者通过ISN推断出确认号ACK值。

三次握手可以携带数据吗

  • 三次握手在第三次时是可以携带数据的,因为第三次双方已经处于ESTABLISHED状态,所以可以接收传输数据,第一次和第二次不能,为了防止客户端初始发送SYN时,攻击者不需要在乎服务端是否可以接收,只需要传输大量数据和SYN,就可以占用服务端处理时间导致程序停滞。

SYN攻击是什么

  • 服务端在第二次握手时分配资源,客户端在第三次握手时进行分配。那么这就意味着攻击者可以在客户端无限伪造SYN包发送给服务端造成泛洪攻击,服务端接收大量SYN并返回ACK确认包,因为伪造的源地址不存在,导致无法得到确认,便重复ACK重传操作直到超时,并导致长时间占用半链接队列使正常的半链接请求被丢弃,SYN攻击是常见的DOS/DDOS攻击。
  • 解决办法:
  1. 增加半链接最大数。2. 降低超时时间。3. 过滤网关防护。4. SYN cookies技术.

四次挥手

TCP可以将进行连接的一端在结束它的链接以后还能接收另一端的数据,因此而产生的四次握手。

  1. 此时双发处于ESTABLISHED状态,客户端发送FIN报文,报文中指定序列号,主动关闭TCP连接,此时客户端处于FIN_WAIT1
  2. 服务端接收到FIN报文,将客户端的序列号+1作为ACK序列号值进行返回,此时服务端状态处于CLOSE_WAIT,此时TCP处于半关闭,客户端到服务端的连接释放,且客户端在接受到确认报文段后将状态更改为FIN_WAIT2。
  3. 如果服务端已经完成所有报文或者数据的传输,就可以发送FIN报文并指定自己的序列号发送给客户端,状态更改为LAST_ACK.
  4. 客户端接收到服务端的FIN释放连接报文,将服务端的序列值+1作为自己的ACK确认报文的值再返回给服务端,状态更改为TIME_WAIT,此时TCP未释放,需要等待计时器的2MSL后状态才更改为CLOSE,而服务端在接收到ACK后状态便更改为CLOSE,服务端关闭连接。
  • 在收到FIN时代表在这一方向上没有数据的流动,一般由客户端主动发起FIN释放连接报文,进入TIME_WAIT1,服务端作为被动执行

为什么需要四次挥手

  • 因为关闭连接时,服务端接收到客户端的释放连接报文段后,无法马上关闭连接,因为可能存在未发送完毕的报文或数据,所以只能先返回ACK报文作为应答,告诉客户端已收到FIN,等待服务端发送完毕所以报文后,再主动发送FIN给客户端释放连接。

2MSL等待状态

  • TIME_WAIT也被称为2MSL状态,每个TCP都必须指定一个报文段最大生命期限的MSL,这个值是有期限的,因为报文段是以IP数据包再网络中传输的,每个IP数据包都有一个TTL生存时间限制。
  • 处理原则为,当一个TCP主动执行关闭,并返回最后一个ACK时,需要在TIME_WAIT状态等待2倍的MSL时间,方便TCP再次发送ACK报文,以防上一个ACK丢失。

2MSL的意义

  • 2MSL可以使处在LAST_ACK状态的服务端接收不到FIN的确认报文段ACK时,发起超时重传,客户端再次接收并返回ACK确认报文段,重新刷新2MSL时间,最后正确关闭。如果不等待2MSL,客户端返回ACK后关闭连接,而ACK在传输中丢失,服务端接收不到,而客户端也无法再接收到重传FIN,便导致了无法正常关闭TCP连接。
  1. 为了防止ACK的丢失,保证最后一个ACK能够正确送达服务端。
  2. 防止失效的连接报文段出现在新连接中。(经过2MSL时间的等待可以在本次连接持续时间内的所有报文段从网络中消失)