前言
TCP的3次握手、4次挥手以及TCP状态机,是TCP的核心概念,我们在分析LwIp中TCP相关代码流程,也需要熟悉这些流程,本文就详细介绍这些概念。
TCP 3次握手、应用数据交互、4次挥手完整流程
TCP 为什么是3次握手,而不是2次或4次
网上针对为什么是3次握手,会有很多的分析,尤其有些文章会特别强调client和server的seq序列号同步,众说纷纭吧,我个人倾向于:
- 防止旧的重复连接,引起连接混乱。
- client与server之间同步初始化序列号。
- 3次握手能够在通信信道不保证可靠情况下,从软件流程上,保证TCP通信可靠的最小代价。
防止旧的重复连接
在TCP协议的标准文档RFC793中指出了3次握手的设计原因,原文引用如下:
The principle reason for the three-way handshake is to prevent old duplicate connection initiations from causing confusion.
翻译后为:
3次握手的握手设计的主要原因是为了防止旧的重复连接,引发连接混乱。
我们假设只有2次握手,在正常的网络环境下,是没有问题的,但是在网络比较差的环境下,client可能会因为没有收到ack,而重新发送SYN,而server端可能会收到多次的SYN请求,对于Server端,要么拒绝,要么接收,这不仅会浪费server的资源(为client分配资源),而且可能会导致连接的混乱,因为某测的SYN请求可能是过时的,所以通过3次握手,通过seq就可以判断出哪些连接是旧的,哪些是对的。
client与server同步初始化序列号
这个在上图中就可以看到,client与server 3次握手后,对于client端,就能够确定一个随机序列号A,对于server端,就能确定一个随机序列号B,后续client与server之间的通信,可靠性通信,都是通过这两个序列号来实现的,具体如何实现,我们后面的文章再详细分析。
综上:
3次握手,是为了在通信信道不能保证稳定的情况下,从软件层面,保证TCP通信可靠的一种最小代价,这里提到的最小代价,主要是3次是最小的尝试,我们也可以4次握手、5次握手,甚至更多,只不过那样会浪费效率和资源。
TCP状态机转换图
TCP的维护有状态机,没错,是固定的状态机,不管是Linux和LwIp中,状态机是一致的,这就更能说明,TCP/IP就是一种标准的软件协议。TCP状态机转换如下:文章来源:https://www.toymoban.com/news/detail-545078.html
文章来源地址https://www.toymoban.com/news/detail-545078.html
到了这里,关于LwIP系列(5):TCP 3次握手+4次挥手+状态机转换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!