彻底理解TCP的三次握手,四次挥手


前言

一、TCP、UDP

TCP和UDP是计算机网络结构中运输层的两个协议。

  1. 传输控制协议 TCP(Transmission Control Protocol)–提供面向连接的,可靠的数据传输服务。
  2. 用户数据协议 UDP(User Datagram Protocol)–提供无连接的,尽最大努力的数据传输服务(不保证数据传输的可靠性)。

二、三次握手,四次挥手

1.三次握手

先上图!
在这里插入图片描述
假设一开始的时候,客户端处于closed状态。客户端主动打开链接,服务器被动打开链接。服务器出于listen监听状态

第一次握手首先客户端A向服务端发送请求报文,报文的SYN位=1,同时选择一个初始序列号seq=x。(这个序列号是随机的,如果问为什么,举例seq=1,第一个网络延迟失效了,重新发seq=1带来的问题)TCP规定,SYN报文请求不能写携带数据,但需要消耗一个序列号。此时客户端就进入SYN-SENT(同步已发送)状态。

第二次握手: 服务端收到请求报文后,如果同意链接,发出确认报文,这个报文中标记位,ACK=1,SYK=1,他还要有一个确认号ack=x+1,同时还有有一个自己的初始序列号seq=y 。这个时候这个TCP服务器进程进入SYN-RCVD(同步收到)状态,这个报文也不能携带数据,但是同样要消耗一个序号。

第三次握手:客户端收到确认之后,还要向服务端给确定。确认报文的ACK=1,ack=y+1,自己的序列号seq=x+1。这个时候tcp连接建立,客户端进入ESTABLISHED(已建立连接)状态。TCP规定,ACK报文段可以携带数据,但是如果不携带数据的话则不消耗序号。

最后当服务端收到客户端的确认也进入ESTABLAHED状态,双方就可以通信了。

2、为什么是三次握手,不是两次,四次

如果是两次握手的话,第一次握手时A向B发送了一个SYN请求报文,因为网络延迟没有送到B哪了。长时间收不到B的SYN/ACK回应的话,A会重新想B发送SYN请求报文,当B收到后回应后并建立了链接。当数据发送完关闭tcp链接之后,如果此时A第一次发送的SYN请求包到达了B,并且B做出回应后就直接建立了TCP链接,此时就造成了资源的浪费。

三次握手是在安全可靠的基础上,握手次数最少的方案。两次握手并不能保证可靠性。四次握手又浪费了效率,当然,有的需要更高安全性的地方,是可以有N次握手协议的,但那是特殊情况。

总结来说:两次握手可能会因为之前传输的迷路的报文被服务端接受,重新建立连接造成资源的浪费。而因为三次挥手已经可以满足可靠性了,就不需要在进行第四次了(每多一次握手都会浪费资源)

3、四次挥手

再上图!
在这里插入图片描述
在这之前客户端和服务端都是ESTABLISHED状态

第一次挥手:客户端发出链接释放报文FIN ,并且停止发送数据, 其序列号为 seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。TCP规定,FIN报文段即使不携带数据,也要消耗一个序列号。

第二次挥手:服务端收到链接释放报文后,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时服务端就进入了CLOSE-WAIT(关闭等待)状态,TCP服务器通知高层的进程应用,客户端向服务端的方向就释放了,这时候处于半关闭状态,就是客户端不再向服务端发数据了,但是服务员向客户端发数据,客户端仍要接受。这个状态要持续一段时间,也就是整个CLOSE-WITE状态持续的时间。

客户端收到服务端发送的ACK后进入了FIN-WAIT-2(终止等待2)状态

第三次挥手:服务端最后的数据发送完后,就向客户端发送链接释放报文,FIN=1,ack=u+1,还有他的序号seq=w(半关闭状态也发送的数据报文),此时服务端就进入了LAST-ACK(最后确认)状态,等待客户端的确认。

第四次挥手:客户端收到服务端的链接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时客户端就进入TIME-WAIT(时间等待)状态。此时tcp还没有释放,还需要等待2MSL的时间后,客户端撤销相应的TCB后,就结束了这次tcp链接。

4、为什么是四次挥手

因为在连接释放的过程可以理解为两步走,第一步主动释放的一方将自己向对方的连接释放,但此时对方还会向自己发送数据。第二步是被发送请求的一方向发送请求的一方数据也传输完成,将这个方向的连接也释放。所以比建立连接阶段多了一个过程(因为要分两次断开连接),挥手次数也就多了一次。

5、为什么要等待2MSL时间

MSL指的是:它是任何报文在网络上存在的最长的最长时间,超过这个时间报文将被丢弃。

第一:保证客户端发送的最后一个ACK能到达服务器,因为这个ACK报文可能会丢失。在服务端的角度考虑,我已经发送FIN+ACK报文请求断开了,如果客户端还是没有给我回应,我就在想应给是我发送的请求断开的报文客户端没有收到,于是我(服务端)又重新发送了一遍FIN+ACK 报文,而客户端就能够在2MSL的时间里收到这个重传的报文,紧接着给出回应报文,并且重启2MSL计时器。

第二:防止类似与三次握手中提到的,“”已经失效的连接请求报文段,出现在本次链接中。毕竟客户端等待2MSL的话,在这个时间里产生的所有报文都能在网络中消失。

6、TCP的保活计时器

TCP设有保活计时器,如果客户端故障的话,服务端不可能一直等下去白白浪费资源。服务端每次收到请求后,都会重新复位计时器,时间通常这指的是2小时,若2小时没有收到客户端的任何数据,服务端就会发送一个探测报文段,以后每隔75秒发送一次,如果发送了10个探测报文段还是没有反应,服务端就认为客户端出了问题,接着就关闭了连接。

三、大白话总结三握四挥

三次握手就是:
A和B打电话,A说“你能听到我的声音吗”(第一次),B回答“我能听到,那你能听到我的声音吗”(第二次),A回答说“我能听到”(第三次),这样双方就可以开始交流内容了。

四次挥手就是:
A 和 B 打电话,通话即将结束后,A 说“我没啥要说的了”(第一次),B回答“我知道了”(第二次),但是 B 可能还会有要说的话,A 不能要求 B 跟着自己的节奏结束通话,于是 B 可能又巴拉巴拉说了一通,最后 B 说“我说完了”(第三次),A 回答“知道了”(第四次),这样通话才算结束。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值