首页 > 其他分享 >TCP连接的关键之谜:揭秘三次握手的必要性

TCP连接的关键之谜:揭秘三次握手的必要性

时间:2023-09-22 10:36:21浏览次数:34  
标签:报文 握手 SYN 必要性 揭秘 TCP 连接 客户端

TCP 连接建立

当我们浏览网页、发送电子邮件或者进行在线游戏时,我们常常不会想到背后复杂的网络连接过程。然而,正是这些看似不起眼的步骤,确保了我们与服务器之间的稳定通信。其中最重要的步骤之一就是TCP连接的建立,而其中的核心环节就是三次握手。

本文将详细探讨三次握手的原理、过程以及其重要性。我们将一步步解析为什么需要三次握手,它如何保证连接的稳定性和可靠性,以及它对于数据传输的重要作用。通过深入理解三次握手,我们将更好地理解网络通信的底层机制,并对TCP连接的可靠性有更清晰的认识。

TCP 三次握手过程和状态变迁

TCP是一种面向连接的传输层协议,它在进行数据传输之前需要先建立连接。这个连接的建立过程是通过三次握手来完成的。

image

我们根据这幅图详细讲解,每次连接中所发送的TCP报文。

在最开始,客户端和服务端都处于CLOSED状态。首先,服务端主动监听某个端口,处于LISTEN状态,即服务器必须处于启动状态。接下来,客户端准备开始访问网页,需要与服务器建立连接。第一次连接报文的格式如下:

image

客户端在发起连接时,会随机生成一个初始序号(client_isn),并将其放置在TCP首部的"序号"字段中。同时,客户端将SYN标志位置为1,表示发出的报文是SYN报文。客户端通过发送第一个SYN报文给服务端,表明它希望与服务端建立连接。该报文不包含应用层数据(也就是发送的数据)。此时,客户端的状态被标记为SYN-SENT。

image

当服务端收到客户端的SYN报文时,首先服务端会随机初始化自己的序号(server_isn),然后将该序号填入TCP首部的"序号"字段中。接着,服务端将"确认应答号"字段填入client_isn + 1,并将SYN和ACK标志位都设置为1。最后,服务端将该报文发送给客户端,该报文不包含应用层数据(此时服务器也没数据可发)。此时,服务端处于SYN-RCVD状态。

image

一旦客户端收到服务端的报文,它需要做以下优化来回应最后一个应答报文:首先,客户端将该应答报文的TCP首部的ACK标志位设置为1;其次,客户端在"确认应答号"字段中填入server_isn + 1的值;最后,客户端将报文发送给服务端。此次报文可以携带客户端到服务器的数据。完成这些操作后,客户端将进入ESTABLISHED状态。

一旦服务器收到客户端的应答报文,它也会切换到 ESTABLISHED 状态。

从上面的过程可以发现,在进行三次握手时,第三次握手是可以携带数据的,而前两次握手则不可以。这也是面试中经常被问到的问题。一旦完成三次握手,双方都会进入ESTABLISHED状态,表示连接已经成功建立,此时客户端和服务端就可以开始相互发送数据了。

为什么是三次握手?不是两次、四次?

相信大家通常回答的是:“因为三次握手才能保证双方具有接收和发送的能力。”这个回答没错,但它只是表面上的原因,并没有提出主要的原因。下面我将从三个方面分析三次握手的原因,加深我们对这个问题的理解。

  • 三次握手可以有效地避免历史重复连接的初始化(主要原因)
  • 三次握手可以保证双方都收到了可靠的初始序列号。
  • 三次握手可以避免资源浪费。

原因一:避免历史重复连接

简单来说,三次握手的主要原因是为了避免旧的重复连接初始化造成混乱。在复杂的网络环境中,数据包的传输并不总是按照规定时间发送到达目标主机,可能会因为网络拥堵等原因导致旧的数据包先到达目标主机。为了避免这种情况,TCP使用三次握手的方式来建立连接。

image

当客户端连续发送多个SYN建立连接的报文时,在网络拥堵等情况下,可能会出现以下情况:

  • 旧的SYN报文比最新的SYN报文先到达服务端。
  • 服务端收到旧的SYN报文后会回复一个SYN + ACK报文给客户端。
  • 客户端收到SYN + ACK报文后,根据自身的上下文判断这是一个历史连接(序列号过期或超时),然后发送RST报文给服务端,表示中止这次连接。

如果是两次握手的连接方式,就无法判断当前连接是否是历史连接。而三次握手可以在客户端准备发送第三次报文时,根据上下文判断当前连接是否是历史连接:

  • 如果是历史连接(序列号过期或超时),则第三次握手发送的报文是RST报文,以中止历史连接。
  • 如果不是历史连接,则第三次发送的报文是ACK报文,通信双方成功建立连接。

因此,TCP使用三次握手的主要原因是为了防止历史连接初始化了连接。

原因二:同步双方初始序列号

TCP协议的通信双方都必须维护一个序列号,这是确保可靠传输的关键因素。序列号在TCP连接中扮演了重要角色,它具有以下作用:

● 接收方可以消除重复的数据,确保数据的准确性。

● 接收方可以按照序列号的顺序接收数据包,保证数据的完整性。

● 序列号可以标识已经被对方接收的数据包,实现可靠的数据传输。

因此,在建立TCP连接时,客户端发送带有初始序列号的SYN报文,并需要服务器回复一个ACK报文,表示成功接收了客户端的SYN报文。然后,服务器发送带有初始序列号的SYN报文给客户端,并等待客户端的应答,这样一来一回,才能确保双方的初始序列号能够可靠地同步。

image

虽然四次握手也可以实现可靠地同步双方的初始序列号,但由于第二步和第三步可以合并为一步,所以最终演变成了三次握手。而两次握手只能保证一方的初始序列号被对方成功接收,无法保证双方的初始序列号都能被确认接收。因此,三次握手是为了确保TCP连接的稳定性和可靠性而采取的最佳选择。

原因三:避免资源浪费

如果只有"两次握手"的话,当客户端的SYN请求在网络中被阻塞时,客户端无法接收到服务器发送的ACK报文,因此会重新发送SYN。然而,由于没有第三次握手,服务器无法确定客户端是否收到了建立连接的ACK确认信号。因此,服务器只能在收到每个SYN请求后主动建立一个连接。这将导致以下情况的发生:

资源浪费:如果客户端的SYN请求被阻塞,导致重复发送多个SYN报文,服务器在收到请求后将建立多个冗余的无效连接。这将导致服务器资源的不必要浪费。

消息滞留:由于缺乏第三次握手,服务器无法知道客户端是否正确接收到了建立连接的ACK确认信号。因此,如果消息在网络中出现滞留,客户端将一直重复发送SYN请求,导致服务器不断建立新的连接。这将增加网络拥塞和延迟,并对整个网络性能产生负面影响。

image

因此,为了确保网络连接的稳定性和可靠性,TCP使用了三次握手来建立连接,以避免以上问题的发生。

总结

TCP连接建立是通过三次握手来完成的。在三次握手过程中,客户端首先发送一个带有SYN标志的报文给服务器,表示希望建立连接。服务器接收到客户端的请求后,回复一个带有SYN和ACK标志的报文给客户端,表示接受连接请求,并发送自己的初始序列号。最后,客户端再回复一个带有ACK标志的报文给服务器,表示连接建立成功。这样,双方就进入了ESTABLISHED状态,可以开始相互发送数据。

总的来说,TCP连接建立的三次握手过程是为了确保连接的稳定性和可靠性,避免历史连接的混乱和资源浪费,同时保证双方都具备接收和发送数据的能力。

标签:报文,握手,SYN,必要性,揭秘,TCP,连接,客户端
From: https://www.cnblogs.com/guoxiaoyu/p/17716038.html

相关文章

  • 使用TCP 创建服务器 多个客户端连接
    源码#include<stdio.h>#include<string.h>#include<unistd.h>#include<unistd.h>//close#include<sys/socket.h>//socket#include<arpa/inet.h>//inet_pton#include<netinet/in.h>//sockaddr_inintmain(){//1、......
  • tcpdump后台不间断抓包
    版本1的抓包命令这两天排查一个小问题,需要在服务器上使用tcpdump24小时不间断抓包,这里简单记录下。先看下tcpdump的语法:tcpdump[-AbdDefhHIJKlLnNOpqStuUvxX#][-Bbuffer_size][-ccount][-Cfile_size][-Grotate_seconds][-F......
  • HTTP之下的TCP做了什么?抓包解释!
    理清HTTP之下的TCP流程,让你的HTTP水平更上一层(qq.com)首先,我们准备这样一段服务端代码:constexpress=require('express')constapp=express()app.get('/',function(req,res){res.setHeader('Connection','close')res.end('hell......
  • ETHERCAT主站转MODBUS TCP协议网关
     ETHERCAT主站转MODBUSTCP协议网关                                  JM-ECTM-TCP产品介绍JM-ECTM-TCP是自主研发的一款ETHERCAT主站功能的通讯网关。该产品主要功能是将ETHERCAT......
  • 消息中间件大揭秘:选择之前你必须知道的关键信息
    Hello大家好!我是小米,很高兴再次和大家见面!今天的话题非常精彩,我们将深入探讨消息中间件,并了解一些常见的消息队列:RabbitMQ、RocketMQ、Kafka以及Redis。如果你正在准备面试,或者只是对这些消息中间件感兴趣,那么这篇文章一定会对你有所帮助。什么是消息中间件?首先,让我们来了解一下什......
  • tcpdump使用
    背景最近一直在排查线上问题,发现好多是客户自己网络的问题,因此此处记录下tcpdump使用命令1.先获取网卡名称iplinkshow2.使用tcpdump监控指定域名及端口tcpdump-i<网卡名称>-vnnhostwww.baidu.comxxx.pcap3.将xxx.pcap移到自己本地电脑,使用wireshark打开进行分......
  • TCP vs UDP:揭秘可靠性与效率之争
    概述今天我们开始主要讲解TCP的相关知识点。在之前讲解分层章节的时候,我们提到过一个重要观点。在网络层及以下几层,更多的是让主机与主机建立连接,也就是说你的电脑需要知道另一台电脑在哪里才能连接上它。然而,在网络中的通信往往是进程间的通信,而不是机器间的通信。因此,TCP协议引......
  • A TCP connection test tool
    Hi,ThisisaTCPconnectiontool. Youcanuseittoestablishmultipleconnectionswithserverandtestserverperformance. Download:source |exe ......
  • esp32-c3通过AT指令集创建SSL加密的TCP客户端
    官方文档https://docs.espressif.com/projects/esp-at/en/latest/esp32c3/Get_Started/index.html步骤fork源码创建新分支按键盘上的.进入编辑界面将如下证书换成目标服务器的证书提交返回到Action页面,等待自动编译完成下载下述文件将factory固件烧录到目标板的地......
  • 揭秘ES2017令人兴奋的语言特性
    大家好!我是星辰编程理财。今天我分享一篇关于ES2017(ES8)的文章,它将介绍ES2017的语言特性和功能,包括异步编程的神器async/await、对象操作的便捷利器Object.values()和Object.entries(),以及字符串填充的灵活运用等等。通过详细的阐述和示例,我将带领大家一起探索这些特性的用处,作为刚......