TCP协议的三次握手和四次挥手

说起TCP(Transmission control protocol,传输控制协议),那么最重要就是建立连接的三次握手和关闭连接的四次挥手了。
如果对TCP首部字段不是很了解,可以参考:https://www.jianshu.com/p/cb94b0ee1584

三次握手

三次握手图解
  • 第一步:客户端发送一个带有SYN标记为1的数据包,以及初始化一个seq=x
  • 第二步:服务端接收到客户端的数据包后,向客户端发送带有SYN=1,ACK=1,seq=y,ack=x+1的数据包
  • 第三步:客户端向服务端发送带有SYN=0,seq=x+1,ACK=1,ack=y+1标记的数据包

为什么要有三次握手?
三次握手的目的是为了建立可靠的通信通道,保证双方确认自己和对方的发送和接收是正常的。
第一次握手:客户端什么都不能确认,服务端可以确认客户端发送正常,自己接收正常;
第二次握手:客户端确认自己发送、接收正常,对方发送、接收正常;
第三次握手:服务端确认了对方接收正常,自己发送正常;
所以三次握手就能够确认双方收发正常,缺一不可。

四次挥手

i四次挥手图解

在数据传送完成后,任何一方都可以发出连接释放的请求,下面以客户端作为主动请求关闭方来描述。

  • 第一步:客户端发送一个FIN=1,用来关闭客户端到服务端的数据传送
  • 第二步:服务端收到FIN,回传一个ACK=1,ack=收到的序号+1
  • 第三步:服务端发送一个FIN=1,用来关闭服务端到客户端的数据传送
  • 第四步:客户端收到服务端的关闭通知,发回ACK=1报文确认,并将ack设置为收到序号+1
    注意:在第四步完成之后,客户端没有直接关闭连接,而是进入了一个等待时间,作用是如果最后一步ACK报文丢失,在等待时间中还可以重发ACK报文进行重传
    为什么关闭连接要四次挥手?
    任何一方在数据传送结束后都可以发出连接释放的通知,对方确认后进入半关闭状态,当另一方也没有数据发送时,则发出连接释放的通知,对方确认后就可以关掉TCP连接了。

拓展

SYN洪泛攻击

在TCP第二次握手时,分配并初始化了连接变量和缓存,然后等待客户端第三次确认,如果客户端不进行确认,那么服务端通常会在一分钟后终止半开连接并回收资源,这时候就有一个问题,如果客户端发送大量的TCP SYN报文,而不完成ACK,服务端就需要不断的为这些半开连接分配资源,导致服务器资源被耗尽,这种攻击被称作经典的Dos攻击即洪泛攻击,针对这种情况,操作系统有一种有效防御方式,称为SYN cookie。

  • 服务端收到一个SYN报文时,先不生成一个半开连接,会根据SYN报文的源IP,端口,目的IP,端口和散列函数生成一个值作为初始化序列号。
  • 如何客户端合法,收到ACK报文后,服务端通过SYN ACK报文中的源IP,端口,目的IP,端口和散列函数生成的值加1和ACK报文中ack的值作比较,如果相等,表示合法,则生成一个具有套接字的全开连接。

你可能感兴趣的:(TCP协议的三次握手和四次挥手)