TCP三次握手和四次挥手

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

  • 三次握手才可以阻止重复历史连接的初始化(主要原因)
    在两次握手的情况下,服务端没有中间状态码给客户端来阻止历史连接,导致服务端可能建立一个历史连接,造成资源浪费。在建立连接之前,要阻止掉历史连接,所以需要三次握手。
  • 三次握手才可以同步双方的初始序列号
    两次握手只保证了一方的初始序列号能被对方接收,没办法保证双方的初始序列号都能被确认接收
  • 三次握手才可以避免资源浪费
    如果只有两次握手,当客户端发送的SYN报文在网络阻塞,客户端没有接受的ACK报文,就会重新发送SYN。如果没有第三次握手,服务端不清楚客户端是否接收到回复ACK报文,则服务端只能组队建立一个连接,导致资源浪费

通俗的讲:

【二次握手】:无法防止历史连接的建立,会造成资源的浪费,也无法可靠的同步双方序列号
【四次握手】:因为三次握手已经理论上最少可靠连接建立,所以不需要使用更多的通信次数

TCP有6种标示

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

三次握手

  • 第一次握手:用户端首先向服务器发送一个带有SYN(同步)标志的TCP数据包,表示客户端请求建立连接,并选择一个初始序列号(ISN)。
  • 第二次握手:服务器收到客户端的SYN后,会发送一个带有SYN和ACK(确认)标志的数据包,表示服务器接受了客户端的请求,并选择自己的初始序列号。
  • 第三次握手:客户端收到服务器的响应后,发送一个带有ACK标志的数据包,表示客户端也接受了连接。此时,TCP连接已经建立,可以开始进行数据传输。

image

四次挥手

  • 第一次挥手:当客户端希望断开连接时,它会发送一个带有FIN(结束)标志的数据包,表示客户端不再有数据要发送。
  • 第二次挥手:服务器收到客户端的FIN后,会发送一个带有ACK标志的数据包,确认收到客户端的关闭请求。
  • 第三次挥手:服务器准备好断开连接时,会发送一个带有FIN标志的数据包给客户端,表示服务器不再有数据要发送。
  • 第四次挥手: 客户端收到服务器的FIN后,发送一个带有ACK标志的数据包,确认收到服务器的关闭请求。此时,连接被彻底关闭。
    image

衍生问题

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数据段后,必须通知它的应用层,对端已经终止了那个方向的数据传送。

7. 如果已经建立连接,但是客户端突然出现故障了怎么办?

为了避免这个情况,TCP实现了保活机制,原理如下
定义一个时间段,在这个时间段内,如果没有任何连接相关的活动,TCP保活机制每隔一个时间间隔就回发送一个探测报文,如果连续几个探测报文都没有得到响应,则认为当前TCP连接已经死亡,系统内核将错误信息上报给上层应用程序,这个时候服务端就会主动端口连接。

8. 如果建立了连接,但是服务端进程奔溃会发生什么?

TCP的连接信息是内核维护的,所以当服务端的进程奔溃后,内核需要回收该进程的所有TCP连接资源,于是内核会发送第一次挥手的FIN报文,后续挥手过程都在内核完成,并不需要进程的参与,所有即使服务端进程退出,还是可以和客户端进行TCP四次挥手的过程。

posted @ 2022-03-10 15:34  KB、渣科  阅读(53)  评论(0编辑  收藏  举报