面试常问:TCP 三次握手与四次挥手详解

TCP 三次握手

图解

在这里插入图片描述
三次握手过程详解

第一次握手

【客户端】向【服务端】发送连接请求报文,标记 ACK=1 , SYN=1 , 客户端序列号 seq=x ,客户端进入等待状态。

第二次握手

  • 【服务端】收到请求报文,将收到的报文缓存起来,缓存客户端 seq=x

  • 【服务端】向【客户端】发送确认报文,生成一个【服务端】seq=y ,标记 ACK=1 ,SYN=1 ,【服务端】自己的序列号 seq=y ,确认序列号 ACK_Number=x+1 ,发送给【客户端】

第三次握手

  • 【客户端】收到服务端发送的确认报文,将收到的报文存起来,缓存【服务端】seq=y

  • 【客户端】发送确认报文给【服务端】,标记 ACK=1,SYN=0 ,【客户端】自己的序列号 seq=x+1,确认序列号 ACK_Number=y+1

  • 【客户端】、【服务端】都会进入 ESTABLISHED (连接已建立状态)

TCP 四次挥手

图解

在这里插入图片描述
四次挥手过程详解

第一次挥手:

1、【客户端】向【服务端】发送释放连接报文,并停止发送数据,主动关闭 TCP 连接

2、标记 FIN=1 ,【客户端序列号】 seq=x ,该序号等于前面已经传送过去的数据的最后一个字节的序号加 1

3、这时,客户端 FIN—WAIT-1 (终止等待 1)状态,等待服务端确认

第二次挥手:

1、【服务端】收到释放连接报文,将收到的报文缓存起来,缓存【客户端】 seq=x

2、【服务端】向【客户端】发出确认释放报文,标记 ACK=1 ,【服务端序列号】 seq=y ,确认序列号 ACK_Number=a+1

(a 为【服务端】前面已经传送过的数据的最后一个字节的序号)

3、此时【服务端】进入 CLOSE—WAIT (关闭等待)状态

4、此时 TCP 服务器进程应该通知上层的应用进程,因为【客户端】到【服务端】这个方向的连接就释放了,这时 TCP 处于半关闭状态,即【客户端】已经没有数据要发了。

但【服务端】若发送数据,【客户端】仍要接受,也就是说从【服务端】到【客户端】这个方向的连接并没有关闭,这个状态可能会持续一些时间。

第三次挥手:

1、【客户端】收到【服务端】确认报文,并缓存起来

2、此时【客户端】进入 FIN—WAIT (终止等待 2)状态,等待【服务端】发起释放连接报文

3、如果【服务端】没有数据要发送给【客户端】了,【服务端】的应用进程就会通知 TCP 释放连接

4、此时【服务端】向【客户端】发送释放连接报文,标记 FIN=1 ,确认序列号 ACK_Number=a+1 (与第二次挥手的确认号一致),【服务端序号】 seq=z+1 (z 为半关闭状态发送的数据的最后一个字节的序号)

5、此时【服务端】进入最后确认状态,等待【客户端】确认

第四次挥手:

1、【客户端】收到【服务端】释放连接请求,必须发出确认

2、【客户端】向【服务端】发送确认报文,标记 ACK=1 ,确认号序列号 ACK_Numbe=z+1+1 ,【客户端序号】 seq=x+1 (x 为第一次挥手的 seq)

3、此时【客户端】进入等待状态,必须经过时间等待计时器设置的时间 2 倍 MSL(报文最大生存时间)后,【客户端】才进入 CLOSED 状态。

MSL 叫做最长报文寿命,RFC 建议设为 2 分钟,实际应用中是 30 秒。

在这 2 倍 MSL 期间【客户端】进入 TIME—WAIT 状态后,要经过 4 分钟才能进入到 CLOSED 状态。

4、【服务端】只要收到了【客户端】的确认后,就进入了 CLOSED 状态

5、当【客户端】和【服务端】都进入 CLOSED 状态后,连接就完全释放了

最后,下面是我整理出来的一份软件测试工程师发展方向知识架构体系图。

希望大家能在这个成长过程中收益良多。可以说,这个过程会让你痛不欲生,但只要你熬过去了。以后的生活就轻松很多。正所谓万事开头难,只要迈出了第一步,你就已经成功了一半,古人说的好“不积跬步,无以至千里。”等到完成之后再回顾这一段路程的时候,你肯定会感慨良多。

由于CSDN上传图片大小有限,有需要的朋友可以关注我的公众号:程序员二黑,回复1,即可获取原图。

下面是一份配套的软件测试资源包:

上面是一些配套资源,对于软件测试的的朋友来说应该是最全面最完整的备战仓库,为了更好地整理每个模块,我也参考了很多网上的优质博文和项目,力求不漏掉每一个知识点,很多朋友靠着这些内容进行复习,拿到了BATJ等大厂的offer,这个仓库也已经帮助了很多的软件测试的学习者,希望也能帮助到你。

关注我的微信公众号:程序员二黑,即可免费获取!

最困难的时候,也就是我们离成功不远的时候!如果你不想再体验一次自学时找不到资料,没人解答问题,坚持几天便放弃的感受的话,可以加入我们的群:785128166 大家一起讨论交流学习。

推荐阅读

高薪程序员也躲不过35岁这一关…当能力与年龄脱节,我们该如何自救?

清华学姐熬了一个月肝出这份32W字Linux知识手册,在 Github标星31K+

字节跳动软件测试岗,前两面过了,第三面HR天坑!竟然跟我说……

  • 16
    点赞
  • 177
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员二黑

V:testerhei

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值