TCP为什么要三次握手?

TCP三次握手协议是为了在不可靠的互联网环境中可靠地建立起一个连接,三次握手可以确保两端的发送和接收能力都是正常的。

那么,为什么是三次而不是二次或四次握手呢?

为什么不是二次握手?

如果是二次握手,即客户端发送一个SYN到服务器,服务器回复一个SYN-ACK给客户端,此时就建立连接。

这种情况下,如果第一个SYN请求在网络中延迟了,并且客户端重新发送了SYN后建立了连接,那么当延迟的SYN请求到达服务器后,服务器会认为是新的连接请求,而此时客户端不会理会服务器的回应,导致服务器一直等待,浪费资源。

为什么不是四次握手?

四次握手会增加额外的延迟和复杂性,并且第四个握手并没有提供三次握手已经解决的问题的任何额外保证。

三次握手已经能够确认双方的发送和接收能力都是正常的,进一步的确认只会增加一次往返时间,降低建立连接的效率。

三次握手建立连接的过程:

  1. 客户端发送SYN:客户端选择一个随机的序列号x发送一个SYN报文,并进入SYN_SENT状态。

  2. 服务器发送SYN-ACK):服务器收到SYN报文,选择自己的序列号y,并发送一个SYN-ACK报文,服务器进入SYN_RCVD状态。

  3. 客户端发送ACK:客户端收到SYN-ACK报文后,会发送一个ACK报文,然后进入ESTABLISHED状态。

数据传输结束之后的四次挥手:

TCP的连接终止则需要四次挥手,这是因为TCP连接是全双工的,即通信双方都可以同时发送和接收信息。终止连接时,每个方向都需要单独关闭,所以就需要四次挥手。

  1. 客户端发送FIN:客户端决定数据发送完毕后,发送一个FIN报文。

  2. 服务器ACK:服务器收到这个FIN报文,发送一个ACK报文确认,并进入CLOSE_WAIT状态。

  3. 服务器发送FIN:服务器准备好关闭连接时,发送一个FIN报文。

  4. 客户端ACK:客户端收到FIN后,发送一个ACK报文,然后进入TIME_WAIT状态。经过一段时间后确保服务器收到ACK报文之后,客户端关闭连接。

生活中的例子:

可以将三次握手比作电话通话。当你拨打一个电话号码时,对方接听(第一次握手),你们开始互相问候确认对方能听到(第二次握手),然后你们开始对话(第三次握手)。

如果只问候一次,你可能不确定对方是否真的听到你;如果问候多次,就显得冗余和不效率。

通话结束后,你说"再见"挂断电话(第一次挥手),对方说"再见"后也挂断(第二次挥手),这样确保了双方都明白通话结束。

在电话通话快结束的时候:

你先说"你还什么别的吗,没有我就要挂了"(第一次挥手),等待对方回应,相当于发送了FIN包。

对方回应"等我想想还有什么"(第二次挥手),相当于对方发送了ACK包,但对方可能还有点儿事要处理,所以通话还未立刻结束。

过了一会儿,对方确认说"好了,我也没话了,那挂了"(第三次挥手),这时候对方发送了FIN包。

你回应"知道了,挂了"(第四次挥手),对应发送ACK包,之后双方都可以挂断电话,结束通话。

求一键三连:点赞、分享、收藏

点赞对我真的非常重要!在线求赞,加个关注我会非常感激!@小郑说编程

相关推荐
白帽黑客沐瑶2 天前
【网络安全就业】信息安全专业的就业前景(非常详细)零基础入门到精通,收藏这篇就够了
网络·安全·web安全·计算机·程序员·编程·网络安全就业
树码小子2 天前
Java网络编程:(socket API编程:TCP协议的 socket API -- 回显程序的服务器端程序的编写)
java·网络·tcp/ip
绿箭柠檬茶2 天前
Ubuntu 服务器配置转发网络访问
服务器·网络·ubuntu
FPGA_Linuxer2 天前
FPGA 40 DAC线缆和光模块带光纤实现40G UDP差异
网络协议·fpga开发·udp
real 12 天前
传输层协议UDP
网络·网络协议·udp
路由侠内网穿透2 天前
本地部署 GPS 跟踪系统 Traccar 并实现外部访问
运维·服务器·网络·windows·tcp/ip
喵手2 天前
玩转Java网络编程:基于Socket的服务器和客户端开发!
java·服务器·网络
徐子元竟然被占了!!3 天前
实验-基本ACL
网络
ftpeak3 天前
从零开始使用 axum-server 构建 HTTP/HTTPS 服务
网络·http·https·rust·web·web app
LabVIEW开发3 天前
LabVIEW气体污染无线监测
网络·labview·labview知识·labview功能·labview程序