TCP之三次握手和四次挥手

901 阅读5分钟

在没有系统学习过计算机网络之前,对于tcp的连接中的三次握手和四次挥手较为头大,总是认为困难且高深。 今天我就将讲述本人对于三次握手和四次挥手的理解


三次握手

上图

三次握手.png 上述图片简略的描述了三次握手的过程

  • 起始阶段
    • 客户端和服务端都处于 CLOSED 状态。客户端主动打开连接,服务端被动打卡连接,结束CLOSED z状态,开始监听,进入 LISTEN 状态
  • 第一次握手
    • 客户端会随机初始化序号(client_isn),将此序号置于 TCP 首部的「序号」字段中,同时把 SYN 标志位置为 1 ,表示 SYN 报文。接着把第一个 SYN 报文发送给服务端,表示向服务端发起连接,该报文不包含应用层数据,之后客户端处于 SYN-SENT 状态
  • 第二次握手
    • 服务端收到客户端的 SYN 报文后,首先服务端也随机初始化自己的序号(server_isn),将此序号填入 TCP 首部的「序号」字段中,其次把 TCP 首部的「确认应答号」字段填入 client_isn + 1, 接着把 SYN 和 ACK 标志位置为 1。最后把该报文发给客户端,该报文也不包含应用层数据,之后服务端处于 SYN-RCVD 状态
  • 第三次握手
    • 客户端收到服务端报文后,还要向服务端回应最后一个应答报文,首先该应答报文 TCP 首部 ACK 标志位置为 1 ,其次「确认应答号」字段填入 server_isn + 1 ,最后把报文发送给服务端,这次报文可以携带客户到服务器的数据,之后客户端处于 ESTABLISHED 状态

简而言之 三次握手是为了双方都能接收到数据,打电话只有一个人可以听到还能交流吗?显然是不能的
第一次握手,客户端向服务器询问——喂,你听你的到我说话吗?
第二次握手,服务端回应客户端并询问——喂,我听的到你说话,你能听的到我说话吗?若第二次握手成功 表明客户端能与服务器进行交互。所以此时客户端处于ESTABLISHED状态
第三次握手,客户端回应服务器——能听到,你知道我要结婚了吗,那份子钱可不能少哈...若第三次握手成功 表明服务器可以与客户端进行交互。所以此时服务器也处于ESTABLISHED状态

  • 为什么一定是三次握手呢,两次握手不可以吗?
    • 这里我们不妨使用假设法看看会发生什么吧!
    • 当服务器的响应报文丢失时(即第二次握手不成功),服务器不知道客户端有没有正确接收到,但是二次握手了故服务器会一直开放端口 会造成大量的资源浪费,影响服务器性能

四次挥手

上图

四次挥手.png
客户端和服务端都可以主动释放连接,上图以客户端释放连接为例

  • 起始阶段
    • 双方都处于ESTABLISHED状态
  • 第一次挥手
    • 客户端打算关闭连接,此时会发送一个 TCP 首部 FIN 标志位被置为 1 的报文,也即 FIN 报文,之后客户端进入 FIN_WAIT_1 状态
  • 第二次挥手
    • 服务端收到该报文后,就向客户端发送 ACK 应答报文,接着服务端进入 CLOSED_WAIT 状态
  • 第三次挥手
    • 客户端收到服务端的 ACK 应答报文后,之后进入 FIN_WAIT_2 状态。等待服务端处理完数据后,也向客户端发送 FIN 报文,之后服务端进入 LAST_ACK 状态
  • 第四次挥手
    • 客户端收到服务端的 FIN 报文后,回一个 ACK 应答报文,之后进入 TIME_WAIT 状态
    • 服务器收到了 ACK 应答报文后,就进入了 CLOSED 状态,至此服务端已经完成连接的关闭。
    • 客户端在经过 2MSL 一段时间后,自动进入 CLOSED 状态,至此客户端也完成连接的关闭

总而言之 四次挥手是为了确定双方的交互已经完成。若有事情没有说完电话能挂吗?
第一次挥手,客户端和服务器说——我没有逼话要讲了,要挂电话了你还有没有什么要说的
第二次挥手,服务器和客户端说——好的,稍等我看看还有没有忘了啥东西
第三次挥手,服务器和客户端说——我也没啥逼话可说的了,我要挂了
第四次挥手,客户端和服务器说——好的,那我挂了,过了两秒钟挂断。第四次挥手成功之后服务端也挂了电话

time_wait与closed_wait的区别

  • 由上文可知,timewait是请求关闭方在发送ACK之后处于的状态在2msl之后会自动关闭
  • 而closedwait是在接收到被动关闭方发送ACK之后处于的状态,在此状态下,传输层会等待应用层的close操作。若应用层程序由于各种原因没有执行close操作,那么一般来说closedwait状态会持续两个小时。

timewait为什么要等待2msl

回答这个问题不妨用假设法
倘若等待时间非常的短又或者说干脆没有会发生什么?
此时两个人正在愉快的通电话
甲:我想挂电话了 FIN
乙:ok!ACK
乙:你家里有人生孩子了!是你大娘给你生弟弟了(这句话被分为2个包在网络中传送给乙)
乙:我说完了也挂了 FIN
甲:(甲听到自己家里有人生孩子了立马想到了美丽的老婆,此时乙又刚好说“我要挂电话了”)便不等2msl,便回了一个ACK后直接挂断了电话
至此通话结束
过了不久(没有超过2msl)
丙用甲的手机打电话给乙
刚经过三次握手拨通电话,就收到了乙对甲说的“是你大娘给你生弟弟了”
是不是很可怕,万一告诉你的是银行卡密码呢