TCP连接管理(三次握手与四次挥手过程理解)

TCP连接管理(三次握手与四次挥手过程理解)

首先来讲一下(宏观层面)简单的理解:

三次握手:客户端与服务器端要建立连接,首先客户端需要确认服务器端是否可以正常 接/发 (receive/send 数据,而服务器端也要确认客户端是否可以正常 接/发(receive/send) 数据,故而三次握手主要流程如下:

(1) 第一次:由客户端发送一个连接报文段(数据包)给服务器端,服务器端接收到了,在服务器端就能确认客户端能正常发送数据了,但是还不能确认客户端是否能接收数据,这就引发了接下来的握手。

(2) 第二次:由服务器端发送一个确认报文段给客户端,如果客服端收到后,在客户端层面,就能确认服务器端既能接收数据又能发送数据了,但此时服务器端还是不能知道客户端是否能正常接收数据,这也就引发了最后一次握手。

(3) 第三次:再由客户端发送一个确认报文给服务器端,如果服务器端接收到了,这就表明服务器端也确认了客户端也能正常的接收到数据,至此,三次握手完毕。

至与许多面试中提出的为什么不能两次或者三次

可以这样理解:如果少于三次的话,如上述过程,客户端与服务器端就不能正常的确认对方是否能正常的接收与发送数据,就达不到TCP安全连接的目的;如果多于三次的话,也是如上述过程理解,那不是浪费时间和让费资源吗,所以没有必要!

在这里插入图片描述此图来源于课本《计算机网络》

简单的宏观理解之后,再细化一下三次握手:

(a). 在第一次握手后,服务器端接收到 TCP SYN=1报文段,服务器会为该TCP连接分配TCP缓存和变量,而在第二次握手后,客户端也会为此次TCP连接分配TCP缓存和变量,而挥手过程中,释放资源也就是释放这些为建立连接而配置的缓存和变量。

(b). 至于,发送报文序列号seq,和响应ack则是为了确保在此连接传输过程中是可靠的。在客户端与服务器端传输的TCP报文中,双方的确认号Ack和序号Seq的值,都是在彼此Ack和Seq值的基础上进行计算的,这样做保证了TCP报文传输的连贯性,一旦出现某一方发出的TCP报文丢失,便无法继续"握手",以此确保了"三次握手"的顺利完成(TCP所采用的的可靠数据传输将在另一篇文章中呈现)

(c ). 在书中提到,在完成三次握手的第三步之前分配缓存和变量,使得TCP易于受到称为SYN洪泛的拒绝服务攻击,(当每次客户端需要建立TCP连接的时候,客户端故意不执行第三次握手,而此时服务器端已经为每次的TCP连接分配了缓存,随着这种的TCP连接越来越多,导致服务器的连接资源被消耗殆尽。现有一种有效的防御系统,称为SYN cookie,具体不在此处阐述)

四次挥手:也就是客户端与服务器端互相告知我要断开这个连接了与确认对方知道我要断开的过程。

结合这张图特别好理解:

img

此图来源于https://www.cnblogs.com/AhuntSun-blog/p/12037852.html

(1) 第一次挥手:客户端主动关闭,并通知服务器端,我要断开连接了(这个位置说释放连接更好);

(2) 第二次挥手:服务器端回一个ACK,就代表服务器端知道了客户端要断开了;

(3) 第三次挥手:还是服务器端发送一个报文段,通知客户端,我也要断开了;(这个阶段就会有疑问了:为什么不可以把第二次和第三次挥手结合在一起发送过去?答案在下文

(4) 第四次挥手:客户端回复一个ACK,代表客户端知道了服务器也断开了,当服务器收到这条报文,就关闭连接

还一个阶段:就是客户端需要设置一个定时器等待,设置为2MSL(maximum segment lifetime:指的是一段TCP报文在传输过程中的最大生命周期),意思是等待服务器端关闭连接后客户端再关闭连接,那客户端怎么确定服务器端成功接收到第四次挥手报文并成功关闭连接了呢?那就是为什么等待定时器要设置成2MSL的疑问了,答案在下文

客户端等2MSL后自动关闭连接,至此四次挥手过程完毕。
在这里插入图片描述

注意:标志位比如SYN、FIN仅仅是代表此次连接是连接(三次握手)阶段或者是关闭(四次挥手)阶段,而初始序号seq,确认序号ack,注意两者数据都是有关系的,eg: seq = x; 下一个ack = x +1, 就是保证这个阶段是可靠连接的。

为什么不可以把第二次和第三次挥手结合在一起发送过去?

释放连接时,被动方服务器,突然收到主动方客户端释放连接的请求时并不能立即释放连接,因为还有必要的数据需要处理,所以服务器先返回ACK确认收到报文,准备好释放连接之后,才能返回FIN释放连接报文。

为什么等待定时器要设置成2MSL

为的是确认服务器端是否收到客户端发出的ACK确认报文,这样理解:如果服务器没有在一个时长为MSL(一段TCP报文在传输过程中的最大生命周期)内没有收到客户端发出的ACK确认报文,就会再次向客户端发出FIN报文,也就是说

  1. 如果客户端在2MSL内,再次收到了来自服务器端的FIN报文,说明服务器端由于各种原因没有接收到客户端发出的ACK确认报文。客户端再次向服务器端发出ACK确认报文,计时器重置,重新开始2MSL的计时;
  2. 如果客户端在2MSL内没有再次收到来自服务器端的FIN报文,说明服务器端正常接收了ACK确认报文,客户端可以进入CLOSED阶段,完成“四次挥手”。

参考:

计算机网络(自顶向下方法)James F. Kurose著

https://www.cnblogs.com/AhuntSun-blog/p/12037852.html

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值