浅谈TCP的三次握手和四次挥手

一、什么是TCP

TCP是一种面向连接的单播协议,在发送数据前,通信双方必须在彼此间建立一条连接。所谓的“连接”,其实是客户端和服务器的内存里保存的一份关于对方的信息,如ip地址、端口号等。

TCP可以看成是一种字节流,它会处理IP层或以下的层的丢包、重复以及错误问题。在连接的建立过程中,双方需要交换一些连接的参数。这些参数可以放在TCP头部。

TCP提供了一种可靠、面向连接、字节流、传输层的服务,采用三次握手建立一个连接。采用4次挥手来关闭一个连接。

二、三次握手

2.1、为什么要三次握手?

换个简单的方式来看为什么要3次握手

客户端和服务端通信前要进行连接,“3次握手”的作用就是双方都能明确自己和对方的收、发能力是正常的。

第一次握手:客户端发送网络包,服务端收到了。

服务端得出结论:客户端的发送能力和服务端的接收能力是ok的

第二次握手:服务端发包,客户端收到了。

客户端得出结论:服务端的接收、发送能力,客户端的接收、发送能力都是正常的。但是此时服务端并不知道刚才自己发出的数据包客户端是否有收到,所以并不知道服务端自身的发送能力和客户端的接受能力是否正常,所以才需要第三次握手,让服务端知道下

第三次握手:客户端第二次发包,服务端收到了。

服务端得出结论:此时客户端的接收能力和自身(服务端)的发送能力也是ok的,第一、二次握手后,服务端并不知道客户端的接收能力以及自己的发送能力是否正常。而在第三次握手时,服务端收到了客户端对第二次握手作的回应。从服务端的角度,我在第二次握手时的响应数据发送出去了,客户端接收到了。所以,我的发送能力是正常的。而客户端的接收能力也是正常的。

经历了上面的三次握手过程,客户端和服务端都确认了自己的接收、发送能力是正常的。之后就可以正常通信了。

2.2、三次握手流程图:

在这里插入图片描述

三、四次挥手

3.1、四次挥手流程图:

在这里插入图片描述

【注意】中断连接端可以是Client端,也可以是Server端,假设Client端发起中断连接请求为例

客户端:发送FIN报文给Server端(意思是说"我Client端没有数据要发给你了",但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据)
Server端:Server端接到FIN报文后,随后发送ACK(“告诉Client端,你的请求我收到了,但是我还没准备好,请继续你等我的消息”)。这个时候客户端就进入FIN_WAIT状态,继续等待Server端的FIN报文。
Server端:当Server端确定数据已发送完成,则向Client端发送FIN报文(“告诉Client端,好了,我这边数据发完了,准备好关闭连接了”)。
客户端:客户端收到FIN报文后,"就知道可以关闭连接了,但是他怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传
Server端:Server端收到ACK后,“就知道可以断开连接了,于是就直接断开连接了”。
客户端:客户端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,我也可以关闭连接了。Ok,TCP连接就这样关闭了!

所以一般关闭连接都是服务端先关闭,随后客户端再关闭连接

3.2、为什么连接的时候是三次握手,关闭的时候却是四次握手?

答:因为请求连接的时候(握手的时候)当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时(挥手的时候),当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

3.3、为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

答:虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Ronychen’s blog

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值