TCP三次握手、四次分手

TCP三次握手、四次挥手

TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,用于在网络上建立可靠的数据传输通道。在TCP/IP协议族中,TCP负责在数据传输过程中提供可靠性和完整性保证。TCP协议中的三次握手和四次挥手是建立和终止TCP连接时必须经过的过程。

TCP三次握手

TCP三次握手是建立TCP连接的过程,通过三次握手,发送方和接收方可以建立一个可靠的连接,确保数据能够安全可靠地传输。

TCP三次握手是TCP协议用于建立可靠连接的过程。以下是TCP三次握手的详细步骤:

  1. 第一次握手(SYN,同步序列编号):

客户端向服务器发起连接请求,发送一个TCP数据包,其中设置了SYN标志位(置为1),同时为该连接生成一个初始的序列号(ISN,随机数,记为X)。这一过程被称为第一次握手。(或者说客户端向服务器发送一个SYN报文段(SYN = Synchronize Sequence Numbers),其中SYN标志位被置为1,其中包含自己的随机初始序列号(ISN),并且该报文段不包含数据,表示发送方请求建立连接。)

  1. 第二次握手(SYN+ACK,确认):

服务器收到客户端的连接请求后,如果同意建立连接,会向客户端发送一个TCP数据包。这个数据包,SYN和ACK标志位都被设置为1.服务器也会为此连接生成一个初始序列号(随机数,记为Y),同时将客户端发来的序列号X加1(即X+1),作为确认号(ACK Number)发送给客户端,这一过程被称为第二次握手。(或者说服务器接收到客户端的SYN报文段后,返回一个SYN+ACK(同步序列编号+确认序列编号)报文段,其中确认序列号为客户端的SIN+1,同时也包含自己的初始系列号(ISN),该报文段中SYN和ACK标志位都被置为1,表示确认建立连接,并且该报文段也包含数据。)(SYN+ACK=Synchronize Acknowledgement)

实际上,ACK = 1 是一个标志位,表示数据包中包含一个确认号(ACK Number)。当ACK标志位为1时,才需要检查确认号。

  1. 第三次握手(ACK):

客户端收到服务器的SYN+ACK数据包后,会检查其中的ACK标志位和确认号是否正确。如果确认号是自己发送的序列号X加1,说明服务器已经正确接收到了客户端的请求。此时,客户端会发送一个ACK数据包,其中ACK标志位为1,确认号为服务器发送的序列号Y加1(即Y+1)。服务器收到这个ACK数据包后,就确认客户端也已经收到了自己的回应。这一过程被称为第三次握手。客户端收到服务器的SYN-ACK报文段后,客户端向服务器发送一个ACK(确认)报文段(ACK=Acknowledge)。该报文段中ACK标志位被置为1,表示客户端已经收到了服务器的SYN-ACK报文段,并向服务器发送确认信息。此时,TCP连接建立成功,可以进行数据传输。

TCP三次握手的过程保证了发送方和接收方之间的连接是可靠的,并且双方都同意建立连接。这也是TCP协议成为可靠传输协议的重要原因之一。

ISN(Initial Sequence Numbers,初始序列号)是TCP连接建立过程中的一个概念。在TCP协议中,每个数据包都有一个序列号,用于表示该数据包在数据流中的位置。当客户端和服务器建立连接时,它们各自为这个连接生成一个初始序列号,即所谓的ISN。

在上面的三次握手过程中,我们提到了客户端和服务器分别生成一个初始序列号(随机数,分别记为X和Y)。这两个初始序列号实际上就是客户端和服务器的ISN。这些随机数用于确保每一个TCP连接的唯一性,以及防止重复和失效的数据包被错误地接收。

在三次握手的过程中,客户端和服务器会交换它们的ISN,并在确认对方接收到数据包后,将序列号加1,作为确认号。这样,双方就可以根据浙西饿序列号来追踪数据流的顺序和完整性。

让我们重新审视三次握手的过程:

  1. 客户端发送SYN数据包,其中SYN = 1,同时生成一个初始序列号(ISN,记为X)。
  2. 服务器收到客户端的连接请求后,发送一个SYN+ACK数据包。其中,SYN = 1,ACK = 1。同时,服务器生成自己的初始序列号(记为Y),并将客户端的序列号加1(即X+1),作为确认号(ACK Number)。
  3. 客户端收到SYN+ACK数据包后,检查其中的ACK标志位(应为1),并检查确认号(应为X+1)。确认无误后,客户端发送一个ACK数据包,其中ACK = 1,确认号为Y+1。

在这个过程中,使用X+1作为服务器响应中的确认号(ACK Number)是为了确保服务器正确接收到了客户端的连接请求。当客户端检查到确认号为X+1时,说明服务器确实收到了初始的SYN数据包,并且已经为这个连接生成了自己的初始序列号。

ACK = 1 这个标志位只是表示数据包中包含了一个确认号,但它本身并不能确认服务器是否正确接收到了客户端的请求。通过检查确认号(ACK Number)是否为X+1,客户端可以确保服务器已经成功接收到了连接请求。这样的设计有助于提高TCP协议的可靠性。

image-20230315153842398

通俗理解

三次握手的过程可以类比为两个人握手。假设A和B两个人见面,要进行握手表示建立联系。握手的过程如下:

  1. A向B伸出手并说:“你好,我是A,你愿意和我握手吗?”
  2. B看到A的手,想要与A握手,于是回答:“你好,我是B,我愿意和你握手。”同时,B也向A伸出手。
  3. A看到B的手,确认对方愿意与自己握手,于是回答:“好的,我们握手吧。”然后与B握手。

类比到TCP三次握手的过程中,A和B分别表示发送方和接收方,握手的过程中发送方发送SYN报文段表示请求建立连接,接收方发送SYN+ACK报文段表示同意建立连接,最后发送方再发送ACK报文段表示确认连接建立成功。

TCP四次挥手

TCP四次挥手是终止TCP连接的过程,通过四次挥手,发送方和接收方可以完成数据传输,释放连接资源。

  1. 第一次挥手(FIN):

客户端决定不再发送数据时,客户端向服务器发送一个FIN(结束)报文段(FIN=Finish),表示客户端不再发送数据,并请求关闭连接。此时,客户端进入FIN_WAIT_1状态。

  1. 第二次挥手(ACK):

服务器收到客户端的FIN报文段后,会向客户端发送一个ACK(确认)报文段,表示服务器已经成功接收客户端的FIN报文段,并向客户端发送确认信息。此时,客户端进入FIN_WAIT_2状态,等待服务器关闭连接。

  1. 第三次挥手(FIN):

当服务器完成数据发送并准备好关闭连接时,它会向客户端发送一个FIN报文段,表示服务器也不再发送数据,并请求关闭连接。此时,服务器进入LAST_ACK状态,等待客户端的最后确认。

  1. 第四次挥手(ACK):

客户端收到服务器发送的FIN报文段后,向服务器发送一个ACK报文段,表示客户端已经成功收到了服务器的FIN报文段,并向服务器发送确认信息。此时,服务器关闭连接,TCP连接已经完全终止,连接资源被释放。客户端等待一段时间(通常是2倍的最大分段生存时间,MSL),然后关闭连接释放相关资源。这个等待时间确保了服务器能够收到客户端的最后一个ACK报文。

在TCP四次挥手的过程中,有一个TIME_WAIT状态,是为了防止出现“半开连接”的情况,保证连接的正确关闭。在客户端发送最后一个ACK报文段之后,会进入TIME_WAIT状态,等待2倍MSL(Maximum Segment Lifetime,最大报文段生存时间)时间,确保所有的数据都已经传输完成。如果在TIME_WAIT状态期,接收到了服务器发送的FIN报文段,说明服务器并没有接收到ACK报文段,此时客户端需要重新发送ACK报文段。如果超过2倍MSL时间后还没有收到服务器发送的FIN报文段,客户端就可以结束TIME_WAIT状态,释放连接资源。

需要注意的是,在TCP连接的建立和终止过程中,如果其中一方没有按照规定的步骤进行操作,或者出现网络故障等情况,就会导致TCP连接无法正常建立或者终止。比如,如果只进行了两次握手,就可以伪造一个TCP连接,这就是TCP的SYN攻击。因此,TCP协议的安全性也成为网络安全的重要问题之一。

image-20230315170411941

通俗理解

四次挥手的过程也可以类比为两个人挥手。假设A和B两个人要结束会面,进行挥手的过程如下:

  1. A对B说:“很高兴能与你见面,我们该结束了。”然后A离开。
  2. B回答:“好的,我们下次再见。”
  3. 然后,B也告诉A:“请确认收到我的消息。”
  4. A回答:“好的,我已经收到了,再见。”最后A也离开。

类比到TCP四次挥手的过程中,A和B分别表示发送方和接收方,挥手的过程中发送方发送FIN报文段表示请求关闭连接,接收方发送ACK报文段表示已经收到请求,然后接收方也发送FIN报文段表示也要关闭连接,最后发送方再发送ACK报文段表示确认连接关闭成功。

六大标志位

TCP中有六大标志位:SYN、ACK、FIN,这三个最为重要,还有URG、PSH、RSE,这些都是TCP协议中的控制标志(Control flag),用来控制TCP报文段的行为。

SYN表示“同步”,它是一个请求标志位,用于告诉接收方,发送方打算建立一个新的TCP连接。SYN报文段中,SYN标志位被设置为1,其余标志位被设置为0。

ACK表示“确认”,它是一个响应标志位,用于告诉发送方,接收方已经收到了发送方发送的报文段。ACK报文段中,ACK标志位被设置为1,其余标志位被设置为0。

在TCP三次握手过程中,当发送方向接收方发送一个SYN报文段时,接收方会回复一个SYN-ACK报文段,其中SYN和ACK标志位都被设置为1。这意味着接收方同意建立连接,并且向发送方发送确认报文段。接收方的SYN报文段中的SYN标志位告诉发送方,接收方已经收到了发送方的SYN报文段,而SYN-ACK报文段中的ACK标志位告诉发送方,接收方已经确认了建立连接的请求。

当发送方收到接收方的SYN-ACK报文段后,会向接收方发送一个ACK报文段,其中ACK标志位被设置为1。这意味着发送方已经收到了接收方的确认报文段,连接已经建立成功。

因此,SYN和ACK标志位在TCP协议中是非常重要的标志位,它们用于确保TCP连接的可靠性和正确性。

  1. SYN(同步序列编号 ,Synchronize Sequence Numbers)标志位:用于建立连接时的握手过程。发送端发送一个SYN报文段,请求建立连接,同时SYN标志位为1。接收端收到SYN报文段后,回复一个SYN+ACK报文段,表示同意建立连接,SYN和ACK标志位都为1。这是TCP三次握手的第一步和第二步。
  2. ACK(Acknowledgment)标志位:用于确认接收方是否正确接收到了报文段。在正常的数据传输过程中,发送端发送一个包含数据的TCP报文段,ACK标志位为1,表示接收方需要确认这个报文段已经被正确接收。接收方在正确接收到报文段后,回复一个ACK报文段,表示已经正确接收到。
  3. FIN(Finish)标志位:用于关闭TCP连接时的四次挥手过程。发送方向接收方发送一个FIN报文段,表示不再发送数据,请求关闭连接。接收方收到FIN报文段后,回复一个ACK报文段,表示已经收到请求,但仍然可以发送数据。当接收方也准备好关闭连接时,会向发送方发送一个FIN报文段,请求关闭连接。发送方收到FIN报文段后,回复一个ACK报文段,表示确认关闭连接。这是TCP四次挥手的最后一步。
  4. URG(Urgent)标志位:当这个标志位为1时,表示紧急指针(urgent pointer)字段有效,紧急指针用于指示紧急数据的边界,通常用于实时通信等场景。
  5. PSH(Push)标志位:当这个标志位为1时,表示接收方应该尽快将数据交给应用程序,而不是等到缓冲区满了再交给应用程序。
  6. RST(Reset)标志位:当这个标志位为1时,表示重置TCP连接,通常用于中断连接或者发生错误时。
1.SYN(Synchronize)是 TCP(Transmission Control Protocol,传输控制协议)连接建立过程中使用的一个标志位。TCP 是一种面向连接的、可靠的数据传输协议。在 TCP 传输中,建立连接前需要进行一个称为 "三次握手"(Three-way Handshake)的过程。SYN 是这个过程的关键部分。

三次握手的步骤如下:

客户端向服务器发送一个 TCP 数据包,其中 SYN 标志位设置为 1。这表示客户端请求建立连接。同时,客户端会设置一个初始序列号(ISN)。
服务器收到 SYN 数据包后,如果同意建立连接,会回复一个 TCP 数据包,其中 SYN 标志位和 ACK(Acknowledge,确认)标志位都设置为 1。服务器也会设置自己的初始序列号。
客户端收到服务器的回复后,会发送一个 TCP 数据包,其中 ACK 标志位设置为 1,以确认收到服务器的 SYN-ACK 数据包。此时,TCP 连接建立完成,可以开始数据传输。
在 nmap 中,SYN 扫描(-sS)是一种较快且不易被检测到的端口扫描方法。SYN 扫描的原理是发送一个 SYN 数据包到目标主机的指定端口,然后根据主机的响应判断该端口的状态。如果收到一个 SYN-ACK 数据包,说明端口处于开放状态;如果收到一个 RST(Reset,重置)数据包,说明端口处于关闭状态。SYN 扫描不会完成完整的 TCP 三次握手过程,因此它被称为 "半开放"(Half-open)扫描。
2.RST(Reset)是 TCP(Transmission Control Protocol,传输控制协议)中的一个标志位。RST 用于表示连接出现错误或异常,需要立即终止(重置)当前连接。在 TCP 数据包中,如果 RST 标志位被设置为 1,说明接收方拒绝了该连接或指示发送方终止连接。

RST 在以下场景中可能会被使用:

当一个 TCP 连接的一端接收到一个不符合期望的数据包时,如序列号不匹配的数据包,它可能会回复一个 RST 数据包,以通知对端关闭连接。
如果服务器接收到一个 SYN 数据包,但目标端口处于关闭状态,服务器可能会回复一个 RST 数据包,以告知客户端端口不可用。
在 nmap 端口扫描中,RST 数据包的响应通常表示目标端口处于关闭状态。例如,在 SYN 扫描(-sS)中,nmap 会发送一个 SYN 数据包到目标主机的指定端口。如果收到一个 RST 数据包,说明端口处于关闭状态。这种情况下,nmap 不会完成 TCP 三次握手过程,而是根据收到的 RST 数据包判断端口状态。
3.ACK(Acknowledge,确认)是 TCP(Transmission Control Protocol,传输控制协议)中的一个标志位。ACK 用于表示接收方已成功收到发送方传输的数据,以保证数据传输的可靠性。在 TCP 数据包中,如果 ACK 标志位被设置为 1,说明接收方确认收到了发送方的数据包。

TCP 是一种面向连接的、可靠的数据传输协议。在 TCP 传输中,发送方在传输数据后需要等待接收方的确认(ACK 数据包),以确保数据已成功传输。如果发送方在一定时间内未收到 ACK 数据包,它会重新发送数据包,直到收到确认或超过重试次数。

ACK 在 TCP 传输中的主要用途如下:

在 TCP 三次握手过程中,ACK 数据包用于确认收到 SYN 数据包,从而建立连接。
在 TCP 数据传输过程中,ACK 数据包用于确认收到数据包,保证数据的可靠传输。
在 TCP 四次挥手过程中,ACK 数据包用于确认收到 FIN(Finish,完成)数据包,以终止连接。
在 nmap 的 SYN 扫描(-sS)中,ACK 标志位也有重要作用。当目标主机的端口处于开放状态时,它会回复一个 SYN-ACK 数据包(SYN 和 ACK 标志位都设置为 1)以确认收到 SYN 数据包。nmap 会根据收到的 SYN-ACK 数据包判断端口状态,并在扫描过程中发送 RST 数据包以中止连接,从而避免完成 TCP 三次握手。这使得 SYN 扫描成为一种较快且不易被检测到的端口扫描方法。
4.FIN(Finish)是 TCP(Transmission Control Protocol,传输控制协议)中的一个标志位。FIN 用于表示一方已完成数据传输,希望关闭连接。在 TCP 数据包中,如果 FIN 标志位被设置为 1,说明发送方请求关闭连接。

TCP 是一种面向连接的、可靠的数据传输协议。当 TCP 连接中的一方完成数据传输并准备关闭连接时,它会发送一个 FIN 数据包。接收到 FIN 数据包的一方会发送一个 ACK 数据包以确认收到 FIN 数据包,然后也可能发送一个 FIN 数据包来表示双方都已完成数据传输。此过程称为 "四次挥手"(Four-way Handshake)。

四次挥手的步骤如下:

发送方发送一个 FIN 数据包,表示已完成数据传输,请求关闭连接。
接收方收到 FIN 数据包后,回复一个 ACK 数据包,确认收到 FIN 数据包。
接收方在完成数据传输后,也会发送一个 FIN 数据包,表示已准备好关闭连接。
发送方收到接收方的 FIN 数据包后,回复一个 ACK 数据包,确认收到 FIN 数据包。此时,连接被关闭。
在 nmap 的端口扫描中,FIN 扫描(-sF)是一种不易被检测到的端口扫描方法。FIN 扫描的原理是发送一个 FIN 数据包到目标主机的指定端口。按照 TCP 协议规范,处于关闭状态的端口应该回复一个 RST 数据包,而处于开放状态的端口应该忽略这个数据包。通过观察目标主机的响应,nmap 可以判断端口状态。不过,由于某些操作系统和防火墙的行为可能与 TCP 协议规范不一致,FIN 扫描的结果可能不如 SYN 扫描那么可靠。
5.URG(Urgent)是 TCP(Transmission Control Protocol,传输控制协议)中的一个标志位。当 URG 标志位被设置为 1 时,表示该 TCP 数据包中包含紧急数据。在这种情况下,TCP 报头中的紧急指针字段(Urgent Pointer)会指示紧急数据在数据包中的位置。

TCP 是一种面向连接的、可靠的数据传输协议。在某些情况下,发送方可能需要发送紧急数据,比如在远程登录(如 Telnet)过程中,用户希望中断正在运行的程序。这时,发送方可以使用 URG 标志位来告诉接收方该数据包中包含紧急数据。

接收方在收到设置了 URG 标志位的 TCP 数据包后,会优先处理紧急数据,然后继续处理其他数据。这种机制允许 TCP 在不影响正常数据传输的情况下处理紧急数据。

在实际应用中,URG 标志位和紧急数据的使用并不常见,因为现代网络应用通常使用其他方法来处理紧急数据或优先级较高的数据。在 nmap 的端口扫描中,URG 标志位通常不会用于判断端口状态。
6.PSH(Push)是 TCP(Transmission Control Protocol,传输控制协议)中的一个标志位。当 PSH 标志位被设置为 1 时,表示发送方希望接收方尽快地处理这个 TCP 数据包中的数据。这通常意味着发送方要求接收方立即将数据传递给上层应用,而不是等待接收缓冲区被填满或其他条件满足。

TCP 是一种面向连接的、可靠的数据传输协议。为了提高传输效率,TCP 会使用缓冲区来存储发送和接收的数据。在某些情况下,发送方可能希望接收方立即处理某些数据,而不是等待缓冲区满或其他条件满足。这时,发送方可以设置 PSH 标志位来达到这个目的。

当接收方收到设置了 PSH 标志位的 TCP 数据包时,它会尽快将数据传递给上层应用,而不是等待接收缓冲区被填满。这种机制允许 TCP 在保证可靠传输的同时,满足某些应用场景下的实时性要求。

在 nmap 的端口扫描中,PSH 标志位通常不会用于判断端口状态。PSH 标志位主要用于在 TCP 数据传输过程中控制数据处理的实时性。

三次握手包含的状态

在TCP三次握手过程中,通信双方(客户端和服务器)会经历一系列状态变化。以下是TCP三次握手过程中涉及的主要状态:

  1. CLOSED(关闭): 在TCP连接尚未建立或已经终止的情况下,通信双方的状态为CLOSED。
  2. LISTEN(监听): 服务器端在等待客户端连接请求时,进入LISTEN状态。在这个状态下,服务器监听特定端口,等待客户端发起连接请求。
  3. SYN_SENT(同步已发送): 当客户端向服务器发送SYN数据包后,客户端的状态变为SYN_SENT。在这个状态下,客户端等待服务器的响应。
  4. SYN_RECEIVED(同步已收到): 当服务器收到客户端的SYN数据包后,服务器的状态变为SYN_RECEIVED。在这个状态下,服务器已经准备好发送SYN+ACK数据包给客户端。
  5. ESTABLISHED(已建立): 当客户端收到服务器的SYN+ACK数据包,并向服务器发送ACK数据包后,客户端的状态变为ESTABLISHED。同时,当服务器收到客户端的ACK数据包后,服务器的状态也变为ESTABLISHED。在这个状态下,TCP连接已经成功建立,通信双方可以进行数据传输。

以下是三次握手过程中的状态变化总结:

  1. 客户端:CLOSED -> SYN_SENT -> ESTABLISHED
  2. 服务器:CLOSED -> LISTEN -> SYN_RECEIVED -> ESTABLISHED

MSL(Maximum Segment Lifetime)是指TCP数据包在网络上存活的最长时间。当TCP协议在进行数据传输时,每个数据包都会携带一个TTL(Time To Live)字段,用于表示数据包在网络上可以存活的时间。MSL是TCP协议中的一个重要参数,它表示一个TCP数据包在网络上存活的最长时间,通常为2倍的最大分段大小(MSS)。在MSL时间到达后,如果该数据包仍未被接收方确认,则该数据包将被网络丢弃,发送方需要重新发送数据。

经过这个过程,客户端和服务器之间建立了一个可靠的TCP连接,可以进行数据传输。当数据传输完成后,通信双方需要通过四次挥手(Four-way Handshake)过程来关闭TCP连接。

MSL的设置是为了避免已失效的数据包在网络上无限期地循环,浪费网络资源。同时,MSL还能保证连接的安全性,因为连接断开后的一段时间内,原有的数据包可能仍然存在于网络中,如果这些数据包被恶意攻击者拦截,可能会对连接造成风险。

在TCP连接断开时,通常需要经过4次握手,其中最后一次FIN ACK报文段被发送后,需要等待2倍MSL的时间,以确保连接中所有数据包都已经被完全接收和处理,从而避免可能的数据包重复和混乱

为什么需要两倍MSL时间?

根据搜索结果,需要两倍MSL时间的原因有两个:

  • 确保最后一个ACK包能够到达被动关闭方,如果ACK包丢失,被动关闭方会重发FIN包,主动关闭方可以再次发送ACK包并重新计时。
  • 确保旧的TCP报文段在网络上失效,防止它们干扰新的连接。如果不等待两倍MSL时间,可能会出现旧的TCP报文段与新的连接使用相同的源地址、源端口、目标地址和目标端口而导致顺序混乱或数据错误。

四次挥手包含的状态

四次挥手(Four-Way Handshake)是TCP(传输控制协议)中用于关闭一个已建立的连接的过程。这个过程涉及到四个步骤和四种状态,以确保双方都能安全地关闭连接。以下是四次挥手中的四个状态:

  1. 始状态(ESTABLISHED): 在四次挥手开始前,双方处于已建立连接的状态。此时,客户端和服务器之间可以进行双向数据传输。
  2. FIN_WAIT_1:在这个状态下,客户端主动发起关闭连接请求。客户端发送一个携带FIN标志位的报文给服务器,表示它已经完成了数据发送。发送完FIN报文后,客户端进入FIN_WAIT_1状态。在这个状态下,客户端等待服务器的确认(ACK)报文。
  3. CLOSE_WAIT:服务器收到客户端的FIN报文后,会发送一个确认报文(ACK)给客户端。此时,服务器处于CLOSE_WAIT状态。服务器还可以继续发送数据给客户端,但已经知道客户端将不再发送数据。
  4. FIN_WAIT_2:客户端收到服务器的确认报文(ACK)后,进入FIN_WAIT_2状态。在这个状态下,客户端等待服务器发送它自己的FIN报文,以表示服务器已经准备好关闭连接。
  5. LAST_ACK:服务器完成数据发送后,会发送一个携带FIN标志位的报文给客户端。此时,服务器进入LAST_ACK状态,等待客户端发送最后一个确认报文(ACK)。
  6. TIME_WAIT:客户端收到服务器的FIN报文后,发送一个确认报文(ACK)给服务器,并进入TIME_WAIT状态。客户端会等待一段时间(通常是2倍的最大报文段生存时间,2MSL),以确保服务器收到了确认报文。这个等待时间可以防止在网络中延迟的旧报文在新连接建立时产生干扰。
  7. CLOSED:当服务器收到客户端的最后一个确认报文(ACK)后,双方都进入CLOSED状态。此时,TCP连接已经完全关闭,双方可以释放资源。

通过这个四次挥手的过程,客户端和服务器可以确保双方都正确地关闭了连接,避免了数据丢失或错误。

为什么tcp握手是三次,不是两次?

TCP采用三次握手是为了保证连接的可靠性和正确性,防止出现不必要的错误和重复数据传输。具体来说,TCP采用三次握手的原因包括以下几点:

  1. 防止已失效的连接请求到达服务器:在第一次握手时,客户端向服务器发送SYN报文段,请求建立连接。如果该SYN报文段因网络延迟或其他原因长时间未被服务器收到,客户端可能会再次发送一个SYN报文段。如果此时客户端之前发送的SYN报文段已经到达服务器,但尚未被服务器处理,那么服务器会认为这是一个新的连接请求,进而发送SYN+ACK报文段给客户端,导致连接建立错误。采用三次握手可以避免这种情况的发生,保证只有合法的连接请求被处理。
  2. 确认双方的接收和发送能力:在第二次握手时,服务器接收到客户端发送的SYN报文段,返回SYN+ACK报文段,并且为自己的数据包分配一个序列号。此时服务器确认自己的接收和发送能力都正常,客户端也可以确认服务器的接收和发送能力正常。在第三次握手时,客户端接收到服务器发送的SYN+ACK报文段,并为自己的数据包分配一个序列号,确认自己的接收和发送能力正常,同时也确认了服务器的接收和发送能力正常。
  3. 避免网络延迟导致的重复数据传输:如果采用两次握手,当客户端发送一个SYN报文段请求建立连接时,由于网络延迟,该报文段可能会在一定时间后才到达服务器,此时服务器返回一个SYN+ACK报文段,表示接受请求。但是由于网络延迟,客户端并未收到该SYN+ACK报文段,而服务器却认为连接已经建立成功。当客户端再次发送一个SYN报文段时,由于之前的连接还未正式关闭,服务器会认为这是一个重复的连接请求,返回之前已经发送过的SYN+ACK报文段,导致客户端出现重复数据传输的问题。采用三次握手可以避免这种情况的发生。

综上所述,TCP采用三次握手是为了保证连接的可靠性和正确性,避免出现不必要的错误和重复数据传输。

为什么还需要ISN?

  1. 可靠性:使用ISN+1作为确认号可以确保客户端和服务器之间的通信是可靠的。当客户端收到服务器的SYN+ACK数据包时,它会检查确认号是否等于客户端发送的序列号加1。这个检查过程有助于确保连接请求和回应之间的一致性,以及防止因网络延迟导致的旧数据包被错误地接收。
  2. 安全性:在网络中,可能存在恶意攻击者试图伪造TCP数据包,企图插入、篡改或者中断连接。使用ISN+1作为确认号可以增加攻击者伪造合法数据包的难度。攻击者不仅需要猜测正确的ISN,还需要预测下一个正确的确认号,这大大降低了攻击的成功几率。

因此,虽然看起来可能有些多此一举,但实际上这个设计是为了确保TCP协议的可靠性和安全性。这也是TCP协议在数据传输过程中能够提供可靠性保证的一个关键因素。

SYN有什么用?

SYN(Synchronize Sequence Numbers,同步序列编号)是TCP协议中的一个控制位(flag),用于在建立连接过程中同步通信双方的初始序列号(ISN)。SYN标志位在三次握手过程中起到关键作用,它有如下用途:

  1. 建立连接:当客户端想要与服务器建立TCP连接时,它会发送一个SYN数据包,其中SYN标志位设为1,表明这是一个连接请求。同时,客户端为连接生成一个初始序列号(ISN)。通过这个SYN数据包,客户端告知服务器自己的初始序列号,并发起连接请求。
  2. 响应连接请求:当服务器收到客户端的SYN数据包后,如果同意建立连接,它会发送一个SYN+ACK数据包。在该数据包中,SYN标志位也设为1,表示服务器同意建立连接。同时,服务器为该连接生成自己的初始序列号,并将客户端的序列号加1作为确认号(ACK Number)。这样,客户端和服务器就交换了各自的初始序列号,并确认双方已经准备好建立连接。
  3. 确保唯一性:SYN数据包中的初始序列号是随机生成的。这样做是为了确保每次建立的TCP连接都具有唯一性,防止因网络延迟等原因造成的过期连接请求被错误地接受。

总之,SYN标志位在TCP连接建立过程中发挥着至关重要的作用。它用于同步通信双方的初始序列号,发起连接请求,并在服务器端确认连接。通过这个机制,TCP协议确保了连接的可靠性和数据传输的完整性。

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XingYuyu_Coder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值