TCP核心机制之连接管理详解(三次握手,四次挥手)

目录

前言:

建立连接

建立连接主要两个TCP状态:

断开连接

断开连接的两个重要状态

小结:


前言:

    TCP是如何建立对端连接,如何断开连接,这篇文章会详细介绍。

建立连接

    首先明确连接的概念:Socket明确对方Socket对象(互相明确,建立认同关系),建立连接。断开连接就是删除内核中对于对端数据存储的空间。

    TCP建立连接的过程称为 “三次握手”,断开连接的过程称为 “四次挥手”。每一次通信称为一次握手或者挥手。

    注意:建立连接发起的报文称为同步报文段,TCP报头中标志位用SYN表示。

注意:

    所谓三次握手本质上是四次,通信双方互相发送建立连接的请求SYN,互相都回应一个ACK。

    这里将中间两次通信的过程合并为了一次。是因为当接收方接收到SYN,需要返回应答报文ACK和连接请求SYN。由于这两步都是在内核中完成的,发送的时机一致,因此就将它们合并为一个报文发送了。也就是三次握手。

三次握手另外一个重要作用:

    验证通信双方各自的发送能力和接收能力是否正常。因为三次握手已经实现了通信双方的请求和响应。

注意:

    三次握手也一定程度上保证了TCP的可靠性,但只是辅助作用(核心是:确认应答,超时重传)。

三次握手的意义:

1)让通信双方各自建立对对方的“认同”。

2)验证通信双方各自的发送能力和接收能力是否正常。

3)在握手的过程中,双方协商一些重要参数。

建立连接主要两个TCP状态:

1)LISTEN(服务器状态)

    表示服务器已经准备就绪,随时可以进行连接。

2)ESTABLISHED(客户端,服务器都有)

    连接建立完成,接下来可以通信了。

断开连接

    通过四次挥手断开连接。

    注意:FIN为结束标志,意味着这个报文为断开报文。TCP报头标志位也有体现。

注意:

    很清楚看到四次挥手的中间两次通信没有合并。由于发送断开连接其实就是Socket的close方法或者进程结束,就会触发Socket发送FIN报文段。当客户端发送断开连接的请求,服务端返回ACK,这个过程是操作系统内核实现的。两者的执行时机不同,就不能合并。

断开连接的两个重要状态

1)CLOSE_WAIT(出现在被动断开的一方)

    等待关闭(等待Socket执行close方法)

2)TIME_WAIT(主动发送断开连接的一方)

    如果一切顺利,客户端进入TIME_WAIT状态。四次挥手已经挥完了。

存在一个问题:

    最后一次挥手ack如果丢包了,超时重传就会重新发送。如果已经断开了,就会无法接收FIN返回ACK。因此设置一个断开等待时间(2MSL)就算丢包了,也会顺利的进行超时重传。

    MSL为互联网上,最长两个节点,数据传输消耗的最大时间。通常为60s。这里设置2MSL的等待时间,就是由于发送一个ACK且接收一个FIN最大时间也就2MSL。因此重传的时间一定小于2MSL。

小结:

    三次握手和四次挥手形象的体现了TCP连接和断开的过程,让我们仔细的去思考和理解。

猜你喜欢

转载自blog.csdn.net/weixin_62353436/article/details/129025550
今日推荐