【计算机网络】TCP 的三次握手和四次挥手

TCP 是面向连接的,面向连接就是数据通讯的时候需要进行三次握手,断开通讯的时候需要进行四次挥手。

TCP 会采取分段发送的方式进行数据的发送。完整数据 -> 按字节编号 -> 发送数据报

为了解决数据报丢失、数据报错乱等问题,TCP协议要求:接收方收到数据报后,必须对数据报进行确认!

发送方如果长时间没有收到确认数据报(ACK=1),则会判定丢失或者是错误,然后重发。

在这里插入图片描述

1.seq(sequence number),表示这次数据报的序列号,随机生成的
2.ack(acknowledgement number),确认号,ack=seq+1,表示下次希望接收的数据报序列号
3.ACK(acknowledgement),确定序列号有效,表示这次数据报是一个确定的数据报
4.SYN(synchronous),发起新连接
5.FIN(FINISH),完成

TCP 的三次握手

TCP协议要实现数据的收发,必须要先建立连接。

连接的本质其实就是双方各自开辟的一块儿内存空间,空间中主要是数据缓冲区和一些变量。

在这里插入图片描述

TCP三次握手示意图:

Client            Server
  |                  |
  |    SYN=SEQ_A     |
  |----------------->|
  |                  |
  |  SYN=SEQ_B       |
  |  ACK=SEQ_A+1     |
  |<-----------------|
  |                  |
  |    ACK=SEQ_B+1   |
  |    SEQ=SEQ_A+1   |
  |----------------->|
  |                  |

在这里插入图片描述

在这些示意图中,箭头表示数据流的方向。三次握手中,Client向Server发送一个带有SYN标志的报文段,Server收到后回复一个带有SYN和ACK标志的报文段,然后Client再回复一个带有ACK标志的报文段,完成三次握手。

TCP(Transmission Control Protocol)是一种常用的传输层协议,用于在网络上建立可靠的连接。TCP的三次握手是在建立连接时进行的一系列步骤,以确保通信双方都愿意开始数据传输。下面是TCP三次握手的详细讲解:

  1. 第一次握手(SYN - 发送同步序列号):
    在建立连接之前,客户端首先向服务器发送一个带有SYN标志的TCP报文段。
    这个报文段的序列号(Seq)被设置为一个随机值(假设为A)作为初始序列号。
    客户端还将设置连接标志(SYN)以及窗口大小等信息,并在选项字段中放入一些控制信息。这个报文段的目的是告诉服务器,客户端想要建立连接,并指定初始序列号A。

  2. 第二次握手(SYN + ACK - 发送同步序列号和确认序列号):
    服务器接收到客户端的SYN报文段后,会对其进行确认。
    服务器向客户端发送一个带有SYN和ACK标志的TCP报文段,其中确认号(Ack)被设置为客户端发送的初始序列号A加1(即A+1),而服务器的初始序列号被设置为另一个随机值(假设为B)。
    服务器也会设置自己的连接标志(SYN),并在选项字段中放入一些控制信息。这个报文段的目的是告诉客户端,服务器愿意建立连接,并确认客户端的初始序列号A。

  3. 第三次握手(ACK - 发送确认序列号):
    客户端收到服务器的SYN + ACK报文段后,会向服务器发送一个带有ACK标志的TCP报文段,确认服务器的初始序列号B。
    客户端的确认号被设置为服务器发送的初始序列号B加1(即B+1),而连接标志(SYN)被置为0。此时,连接已建立,双方可以开始进行数据传输。服务器收到这个确认报文段后,也确认了连接的建立。

用一个非常简单的例子帮助理解:SYN:我要和你说话,你能听见吗?ACK:我能听见!带入图示就非常好理解了。

在这里插入图片描述

这里的 0 是 wireshark 为了直观,调整了的,原始报文中不是 0

通过这三次握手,双方确认了彼此的能力和意愿,建立了一个可靠的连接,可以进行数据传输。这种三次握手机制可以确保通信双方都同意建立连接,减少了误操作或不必要的连接。在数据传输完成后,连接可以通过四次握手来正常关闭。

TCP 的四次挥手

TCP四次挥手示意图:

Client            Server
  |                  |
  |     FIN=SEQ_X    |
  |----------------->|
  |                  |
  |  ACK=SEQ_X+1     |
  |<-----------------|
  |                  |
  |    FIN=SEQ_Y     |
  |  ACK=SEQ_X+1     |
  |<-----------------|
  |                  |
  |  ACK=SEQ_Y+1     | 
  |  SEQ=SEQ_X+1     |
  |----------------->|
  |                  |

四次挥手中,Client首先发送一个带有FIN标志的报文段,然后Server回复一个带有ACK标志的报文段,接着Server发送一个带有FIN标志的报文段,最后Client回复一个带有ACK标志的报文段,完成四次挥手。

在这里插入图片描述

TCP(Transmission Control Protocol)的四次挥手是用于关闭一个已建立的连接的过程。与建立连接的三次握手类似,关闭连接需要双方都达成一致。下面是TCP四次挥手的详细讲解:

  1. 第一次挥手(FIN - 发送结束标志):
    当一方(通常是客户端)决定关闭连接时,它会向另一方(通常是服务器)发送一个带有FIN标志的TCP报文段。这个报文段表示发起方没有更多数据要发送,但是仍然愿意接收来自对方的数据。
    发起方将序列号(Seq)设置为当前已发送数据的最后一个字节的序号加1。这个报文段的目的是告诉另一方,发起方希望关闭连接。

  2. 第二次挥手(ACK - 发送确认):
    收到第一次挥手的FIN报文段后,另一方(通常是服务器)会向发起方发送一个带有ACK标志的TCP报文段,表示它已经收到了发起方的关闭请求。
    确认号(Ack)会被设置为发起方的序列号加1,表示另一方已经收到了发起方的所有数据。此时,连接进入半关闭状态,发起方仍然可以发送数据,但另一方不能。

  3. 第三次挥手(FIN - 发送结束标志):
    当另一方(通常是服务器)也准备好关闭连接时,它会发送一个带有FIN标志的TCP报文段给发起方。
    这个报文段的序列号(Seq)被设置为当前已发送数据的最后一个字节的序号加1。此时,另一方表示它已经没有更多数据要发送,并准备好关闭连接。

  4. 第四次挥手(ACK - 发送确认):
    收到第三次挥手的FIN报文段后,发起方会向另一方发送一个带有ACK标志的TCP报文段,表示它已经收到了另一方的关闭请求。
    确认号(Ack)被设置为另一方的序列号加1,表示发起方已经确认了另一方的关闭请求。此时,连接正式关闭,双方都不能再发送数据。

在这里插入图片描述

用一个非常简单的例子帮助理解:FIN:我不想和你说话了! ACK:先等等!我想知道我们还有以后吗?FIN:(沉默…) ACK:算了吧,我们没有以后了。再见!ACK:再见! 带入图示就非常好理解了。

通过这四次挥手,双方完成了连接的关闭,确保彼此都知道对方已经停止发送数据,从而避免了数据丢失。这个过程保证了连接的可靠关闭,以及释放相关的资源。

总结三次握手和四次挥手

简述TCP连接的过程

三次握手:
TCP协议通过三次握手建立可靠的点对点连接,具体过程是:
首先服务器进入监听状态,然后即可处理连接

  1. 第一次握手:建立连接时,客户端发送 syn 包到服务器,并进入 SYN_SENT 状态,等待服务器确认。在发送的包中还会包含一个初始序列号 seq。此次握手的含义是客户 端希望与服务器建立连接。
  2. 第二次握手:服务器收到 syn 包,然后回应给客户端一个 SYN+ACK 包,此时服务器进入SYN_RCVD 状态。此次握手的含义是服务端回应客户端,表示已收到并同意客户端的连接请求。
  3. 第三次握手:客户端收到服务器的 SYN 包后,向服务器再次发送 ACK 包,并进入 ESTAB_LISHED状态。

最后,服务端收到客户端的 ACK 包,于是也进入ESTAB_LISHED状态,至此,连接建立完成。

四次挥手:

步骤发起方操作状态变化含义
1客户端发送 FINACK客户端:FIN_WAIT_1客户端希望关闭连接,不再发送数据。
2服务器回复 ACK服务器:CLOSE_WAIT服务器确认收到关闭请求。
3服务器发送 FIN服务器:LAST_ACK服务器完成数据发送,准备关闭连接。
4客户端回复 ACK客户端:TIME_WAIT客户端确认服务器的关闭请求,连接关闭。

在这里插入图片描述

最优回答:只需要将上图说明清楚即可。

为什么客户端断开时要等待两个 MSL?

主动断开的一侧为A, 被动断开的一侧为B。
第一个消息:A发FIN
第二个消息:B回复ACK(但是还得确认数据有没有传输完,所以之后还得返回一个 SIN)
第三个消息:B发出FIN
此时此刻:B单方面认为自己与A达成了共识,即双方都同意关闭连接。
此时,B能释放这个TCP连接占用的内存资源吗?不能,B一定要确保A收到自己的ACK、FIN。
所以B需要静静地等待A的第四个消息的到来:
第四个消息:A发出ACK,用于确认收到B的FIN
当B接收到此消息,即认为双方达成了同步:双方都知道连接可以释放了,此时B可以安全地释放此TCP连接所占用的内存资源、端口号。
所以被动关闭的B无需任何wait time,直接释放资源。

但,A并不知道B是否接到自己的ACK,A是这么想的

  • 如果B没有收到自己的ACK,会超时重传FIN
    那么A再次接到重传的FIN,会再次发送ACK

  • 如果B收到自己的ACK,也不会再发任何消息,包括ACK

无论是1还是2,A都需要等待,要取这两种情况等待时间的最大值,以应对最坏的情况发生,这个最坏情况是:
发送ACK消息最大存活时间(MSL)+ 来自FIN消息的最大存活时间(MSL)。
这恰恰就是2MSL(Maximum Segment Life).

等待2MSL时间,A就可以放心地释放TCP占用的资源、端口号,此时可以使用该端口号连接任何服务器。

实际应用中常用的是30秒,1分钟和2分钟等

补充:HTTP 和 TCP 的关系

HTTP 是对内容格式的规定(消息头、消息体、状态码、请求方法),使用了 TCP 协议完成消息的可靠传输。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

秀秀_heo

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

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

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

打赏作者

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

抵扣说明:

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

余额充值