比如在网络状况比较复杂或者网络状况比较差的情况下,发送方可能会连续发送多次建立连接的请求 。如果 TCP 握手的次数只有两次,那么接收方只能选择接受请求或者拒绝接受请求,但它并不清楚这次的请求是正常的请求,还是由于网络环境问题而导致的过期请求,如果是过期请求的话就会造成错误的连接 。
所以如果 TCP 是三次握手的话,那么客户端在接收到服务器端 SEQ+1 的消息之后,就可以判断当前的连接是否为历史连接,如果判断为历史连接的话就会发送终止报文(RST)给服务器端终止连接;如果判断当前连接不是历史连接的话就会发送指令给服务器端来建立连接 。
原因二:同步初始化序列化
通过上面的概念我们知道 TCP 的一个重要特征就是可靠性,而 TCP 为了保证在不稳定的网络环境中构建一个稳定的数据连接,它就需要一个“序列号”字段来保证自己的稳定性,而这个序列号的作用就是防止数据包重复发送,以及有效的解决数据包接收时顺序颠倒的问题 。
那么在建立 TCP 连接时就需要同步初始化一个序列号来保证 TCP 的稳定性,因此它需要执行以下过程:
- 首先客户端发送一个携带了初始序列号的 SYN 报文给服务器端;
- 服务端接收到消息之后会回复一个 ACK 的应答报文,表示客户端的 SYN 报文已被服务端成功接收了;
- 而客户端收到消息之后也会发送一个 ACK 给服务端,服务器端拿到这个消息之后,我们就可以得到一个可靠的初始化序列号了 。
而如果是两次握手的话,就无法进行序列号的确认工作了,因此也就无法得到一个可靠的序列号了,所以 TCP 连接至少需要三次握手 。
以上两种原因就是 TCP 连接为什么需要三次握手的主要原因,当然 TCP 连接还可以四次握手,甚至是五次握手,也能实现 TCP 连接的稳定性,但三次握手是最节省资源的连接方式,因此 TCP 连接应该为三次握手 。
考点分析
TCP 知识是计算机编程基础,也是面试中常见的面试问题,因为我们现在所使用的大部分连接都是建立在 TCP 基础上的 。因此对 TCP 的掌握可以让我们更清楚地理解技术的实现过程,也能帮我们写出更加优秀的代码,以及排查一些和网络相关的问题 。
和此知识点相关的面试题还有以下这些:
- 什么是 UDP?
- TCP 和 UDP 有什么区别?
UDP(User Data Protocol,用户数据报协议)是无连接的、简单的、面向数据报的传输层协议 。也就是 UDP 在发送数据之前,无须建立客户端与服务端的连接,直接发送消息即可 。
UDP 的协议头有 8 个字节(64 位),如下图所示:

文章插图
其中源端口和目标端口是指记录发送方和接收方端口;UDP 包长度是指 UDP 头部加上 UDP 数据的总长度;UDP 校验和用于效验 UDP 的内容是否可靠 。
UDP 常见的使用场景有:语音、视频等多媒体通信、DNS(域名转化)、TFTP 等 。
TCP VS UDP
TCP 和 UDP 的区别主要体现在以下 7 个方面:
- 可靠性,TCP 有“状态性”和“可控制性”可以保证消息不重复、按顺序、不丢失的发送和接收,而 UDP 则不能保证消息的可靠性;
- 连接,TCP 是面向连接的传输层协议,传输数据前先要建立连接,而 UDP 发送数据之前无需建立连接;
- 服务对象,TCP 服务的对象为一对一的双端应用,而 UDP 可以应用于一对一、一对多和多对多的通信场景;
- 效率,TCP 的传输效率较低,而 UDP 的传输效率较 高;
- 流量控制,TCP 有滑动窗口可以用来控制流量,而 UDP 则不具备流量控制的能力;
- 报文,TCP 是面向字节流的传输层协议,而 UDP 是面向报文的传输层协议;
- 应用场景,TCP 的应用场景是对消息准确性和顺序要求较高的场景,而 UDP 则是应用于对通信效率较高、准确性要求相对较低的场景 。
TCP 和 UDP 的使用场景如下图所示:

文章插图
小结
本课时我们介绍了 TCP 三个特点:面向连接、可靠性和面向字节流,其中可靠性主要是依赖它的状态记录和根据实际情况调整自身的行为方式 。例如,当 TCP 意识到丢包时就会重发此包,这样就保证了通信的可靠性 。
推荐阅读
- 寒衣节”穿不上袖子 为什么三年内不能送寒衣
- 林更新因为什么火起来的,林更新为什么不火-
- 过劳死|职场上,工作真的比健康重要吗?为什么总有人那么“拼命”
- 激光脱毛很痛是为什么 激光脱毛为什么好
- 产后抑郁症怎么确诊 为什么会得产后抑郁症
- 雍正王朝康熙为什么传位给雍正,为什么康熙传位给雍正-
- 将夜大唐被灭了吗,将夜唐王为什么想吃夫子-
- 步步惊心若曦为什么不嫁给四爷,步步惊心若曦和四爷为什么后来有隔阂了-
- 肖战粉丝的错为什么要怪肖战,为什么肖战不告黑粉-
- 美国是否退出常任理事国,美国为什么退出联合国理事会-
