TCP三次握手和四次挥手过程

TCP三次握手和四次挥手过程

  • 1、TCP报文段首部
  • 2、TCP三次握手过程及常见问题
    • 2.1 TCP三次握手过程
    • 2.2 常见问题
  • 3、TCP四次挥手过程及问题
    • 3.1 TCP四次挥手过程
    • 3.2 常见问题

1、TCP报文段首部

TCP三次握手和四次挥手过程_第1张图片
         要理解TCP三次握手和四次挥手的过程,首先需要了解TCP报文段的某些首部的含义:

  • 序号 seq:本报文段所发送的数据的第一个字节序号
  • 确认号 ack:期望收到对方下一个报文段的第一个数据字节的序号
  • 确认位 ACK:仅当ACK=1时确认号字段才有效
  • 同步位 SYN:在连接建立时用来同步序号,SYN=1表示这是一个连接请求或是连接接受请求。
  • 终止位 FIN:用来释放一个连接。当FIN=1时,表示此报文段的发送方数据已经发送完毕,并要求释放运输连接

2、TCP三次握手过程及常见问题

2.1 TCP三次握手过程

TCP三次握手和四次挥手过程_第2张图片
(1)客户端A向服务端B发出连接请求,同步位SYN=1,初始序列seq=x,连接请求报文段不能携带数据,但是要消耗一个序号,这时客户端A进入SYN-SENT(同步已发送状态)。
(2)服务端B收到请求报文段之后,向A发送后确认。将同部位SYN和确认位都置为1,确认序号ack=x+1,同时自己选择一个初始序号seq=y。连接接收报文也不能携带数据,但是也要消耗一个序号,这时服务端进入SYN-RCVD(同步收到状态)。
(3)A收到B的确认时候要给B一个确认。确认报文段的确认位ACK=1,确认号ack=y+1,自己的序号seq=x+1。这时,TCP连接已经建立,客户端进入ESTABLISHED(已建立连接状态)。B收到A发出的确认报文之后也进入已建立连接状态。

2.2 常见问题

(1)为什么客户端还需要再发送一次确认
         主要是为了防止已经失效的连接请求报文段突然又传到了B,因而产生错误。“已失效的连接请求报文段”的产生在这样一种情况下:A发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了(因为网络并发量很大在某结点被阻塞了),以致延误到连接释放以后的某个时间才到达B。但是B收到此失效的报文段后,就认为是A又发出一次新的连接请求。于是就向A发出确认报文段,同意建立连接。如果不采用三次握手,那么只要B发出确认,新的连接就建立了,B的许多资源就白白浪费。
(2)SYN Flood攻击
         SYN Flood攻击指利用tcp协议缺陷发送大量伪造的TCP连接请求,从而使被攻击方资源耗尽(CPU满负载或者内存不足)的攻击法方式。解决方法:

  • 缩短 SYN Timeout 时间缩短从接收到 SYN 报文到确定这个报文无效并丢弃该连接的时间,但是过低的SYN Timeout可能会影响用户正常访问。
  • 设置 SYN Cookie给每一个请求连接的 IP 地址分配一个 Cookie,如果短时间内连续受到某个IP的重复 SYN 报文,就认定是受到了攻击,以后从这个 IP 地址来的包会被丢弃
  • 使用硬件防火墙

可以参考百度百科对SYN Flood攻击 的理解

3、TCP四次挥手过程及问题

3.1 TCP四次挥手过程

TCP三次握手和四次挥手过程_第3张图片
(1)客户端进程发出连接释放报文,并且停止发送数据。A将连接释放报文的终止位FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1)。此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
(2)服务器收到连接释放报文后发出确认,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向的连接就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
(3)客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)
(4)服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认
(5)客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗MSL(最长报文段寿命)的时间后,客户端才进入CLOSED状态
(6)服务器只要收到了客户端发出的确认,立即进入CLOSED状态。

3.2 常见问题

(1)为什么A在WAIT-TIME状态必须等待2MSL的时间??

  • 为了保证A发送的最后一个确认报文段能够达到B。这个ACK报文段可能丢失,因而使处在LAST-ACK状态的B收不到A发送的FIN+ACK报文段的确认。B会超时重传这个ACK+FIN报文段,而A就能在这个时间内收到这个重传的报文。接着A在再重传一次确认报文,并且重启2MSL计时器。使A和B都能正常的进入释放连接状态。
  • 防止已经关闭的连接报文段出现在新的连接中。客户端发送完最后一个确认报文后,在这个2MSL时间中,就可以使本连接持续的时间内所产生的所有旧报文段都从网络中消失。这样新的连接中不会出现旧连接的数据报文。

(2)为什么建立连接是三次握手,而关闭连接却是四次挥手呢??
         这是由于服务端的LISTEN状态下收到SYN报文的建立连接请求后。它能够把ACK和SYN(ACK起应答作用。而SYN起同步作用)放在一个报文里来发送给客户端。
         但关闭连接的时候,当服务端收到客户端的FIN报文段的时候,表示客户端没有数据发送给服务端了,但是服务端可能还有数据要发送给客户端,这时TCP连接处于半连接状态。当服务端没有数据再发送给客户端的时候就会向客户端发送一个FIN报文表示服务端要关闭连接,ACK和FIN一般不会分开发送。这个过程也是由于TCP的通信方式是全双工的,发送和接收方都需要发送FIN和ACK。

你可能感兴趣的:(计算机网络)