TCP三次握手和四次挥手


TCP为什么是三次握手而不是二次或者是四次握手

  • 为了实现可靠数据传输,TCP协议的通讯双方都必须维护一个序列号,以标识发送出去的数据包中,哪些是被对方收到的
  • 三次握手的过程既是双方相互告知序列号起始值,并确认对方已经收到序列号起始值的必经步骤。如果只有两次握手,至多只有连接发起房的起始序列号能被确认,选择方的序列号得不到确认

TCP有6种标示

  • SYN:synchronous 建立联机
  • ACK:acknowledgement 确认
  • PSH:push 传送
  • FIN:finish 结束
  • RET:reset重置
  • URG:urgent紧急
  • seq number:顺序编码
  • ack number:确认编码

三次握手

  • 第一次握手:主机A发送位码SYN=1,并随机产生顺序编码的数据包(seq number)到服务器,此时主机B由位码SYN得知客户端要求建立联机。
  • 第二次握手:主机B收到请求后要确认联机信息,向主机A发送一个由确认编码ack number(seq numbser+1),SYN=1,ACK=1,随机产生顺序编码,组成的数据包。
  • 第三次握手:主机A接收到后检查顺序编码(ack number)是否正确,即第一次发送的顺序编码(seq number+1),以及位码ACK=1是否正确,若正确,主机A会在发送ack number=(服务端的seq number+),ACK=1,主机B收到后确认seq的值与ACK=1,则链接建立成功。

四次挥手

  • 第一次挥手:当客户端的应用程序结束数据传输是,会向服务端发送一个带有FIN附加标记的报文段,此时客户端进入FIN_WAIT1状态,客户端不能在发送数据到服务端。
  • 第二次挥手:服务端收到FIN报文会响应一个ACK报文,服务端进入CLOSE_WAIT状态。进入此状态后服务端把剩余未发送的数据发送到客户端,客户端收到服务端的ACK之后,进入FIN_WAIT2状态。
  • 第三次挥手:服务端处理完自己待发送的数据之后,也会发送FIN断开链接的请求,服务端进入LAST_ACK状态。
  • 第四次挥手:客户端收到服务端的断开链接请求后会启动一个定时器,该定时器时长是2MSL(最大段报文生存时间),同时发送最后一次ACK报文。

衍生问题

1. 三次握手的第一次握手过程中,此时报文丢失,会出现什么情况

  • 客户端发送报文之后会启动一个定时器,在超时之后未收到服务端的确认,会再次发送SYN请求,每次尝试的时间会是第一次的二倍,如果总的总尝试时间为75秒,此次建立链接失败。

2. 三次握手的第二次握手过程中,此时报文丢失,会出现什么情况

  • 在发送完ACK+SYN报文后会启动一个定时器,超时没有收到ACK确认,会再次发送,会进行多次重试。超时时间依旧每次翻倍,重试次数可设置。

4. 三次握手的第三次握手过程中,此时报文丢失,会出现什么情况

  • 客户端在发出ACK+SYN报文后会启动一个定时器,在超时触发还没收到ACK就确认是丢失了,会重试一次发送。

4. 如果客户端和服务端同时双方向建立连接,会出现什么情况

    1. 此时只会建立一条全双工的TCP链接,不是两条。
    1. 双方没有CS之分,两端都是同时承担两个角色,客户端和服务器。

5. 在四次挥手过程中客户端或者服务端突然挂掉,会怎么办

  • 正常链接时,客户端突然挂掉,如果没有措施处理,那么就会出现客户端和服务端出现长时间空闲。此时服务端会发送一个探测报文,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

6. 为什么是4次挥手

  • TCP是全双工的通信机制,每个方向必须单独进行关闭。TCP传输连接关闭的原则如下:
    1. 当一端完成它的数据发送任务后就可以发送一个FIN字段置1的数据段来终止这个方向的数据发送;
    1. 当另一端收到这个FIN数据段后,必须通知它的应用层,对端已经终止了那个方向的数据传送。