网络 三次握手 四次挥手

在这里插入图片描述

1,三次握手

(我要和你建立链接,你真的要和我建立链接么,我真的要和你建立链接,成功)
这是一个建立连接的过程

  1. 第一次握手:客户端发送syn包(syn=x)到服务器,并进入SYN_SEND状态,等待服务器确认;
  2. 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;
  3. 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP
连接都将被一直保持下去。

2,四次挥手

(我要和你断开链接;好的,断吧。我也要和你断开链接;好的,断吧):
这是一个断开连接的过程

  1. 第一次挥手:客户端主动关闭方发送一个FIN,用来关闭客户端到服务端的数据传送,也就是客户端告诉服务端:我已经不会再给你发数据了(当然,在fin包之前发送出去的数据,如果没有收到对应的ack确认报文,客户端依然会重发这些数据),但是,此时客户端还可以接受数据。
  2. 第二次挥手:服务端收到FIN包后,发送一个ACK给客户端,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号)。
  3. 第三次挥手:服务端发送一个FIN,用来关闭服务端到客户端的数据传送,也就是告诉客户端,我的数据也发送完了,不会再给你发数据了。
  4. 第四次挥手:客户端收到FIN后,发送一个ACK给服务端,确认序号为收到序号+1,至此,完成四次挥手。

3,第3次握手失败会怎么办?

第三次失败,只有客户端处于成功状态(因为第2次服务器返回了ACK),服务器端没有接收到客户端的 ACK。这要分几种情况讨论:

1.客户端发出的 ACK 丢失了,发出的 下一个数据包没有丢失,则服务端接收到下一个数据包(这个数据包里也会带上 ACK 信息),能够进入正常的 ESTABLISHED 状态
如果服务端和客户端都没有数据发送,或者服务端想发送数据(但是发不了,因为没有收到客户端的
ACK),服务器都会有定时器发送第二步SYN+ACK数据包,如果客户端再次发送ACK成功,建立连接。
如果一直不成功,服务器肯定会有超时设置,超时之后会给客户端发RTS报文,进入CLOSED状态,防止SYN洪泛攻击。

4,为什么TCP链接需要三次握手,两次不可以么,为什么?

如果两次的话,那么当客户端滞留的链接请求报文又发送到服务器的时候,服务器会误以为客户端要与自己建立链接,就会发送一个确认数据包,但是由于客户端并没有要建立链接的意愿,所以不对服务器发送的数据包做出响应,但是服务器并不知道客户端的情况,就会一直处于等待的状态,如此,就会白白浪费服务端的资源。

5,为什么连接的时候是三次握手,关闭的时候却是四次握手?

TCP是全双工模式,关闭连接时,当主机B收到主机A的FIN报文时,仅仅表示主机 A不再发送数据了但是还能接收数据。此时,主机B也未必全部数据都发送给A了,所以B可以立即close;也可以发送一些数据给A后,再发送FIN报文给对方来表示同意现在关闭连接,因此,主机BACK和FIN一般都会分开发送。

链接:https://baijiahao.baidu.com/s?id=1631856490188327912&wfr=spider&for=pc

### TCP 连接建立与断开过程 #### 三次握手过程详解 TCP 使用三次握手来建立可靠的连接。具体过程如下: 当客户端希望与服务器建立通信时,会发送一个带有 SYN 标志的数据包给服务器,此时该数据包中的序列号设为 `x`。 服务器收到这个请求后,如果同意建立连接,则向客户端回送一个 ACK 报文作为应答,并设置确认序号为 `x+1` 同时也携带自己的初始序列号 `y` 和 SYN 标记[^1]。 最后一步是由客户端再次回应服务器一个 ACK 数据段,其中包含对服务器之前发送过来的序列号加一后的值即 `y+1` 来表示已经成功接收到了来自对方的信息并准备就绪可以开始传输实际数据了[^2]。 ```python # 客户端发起SYN请求 client.send(SYN, seq=x) # 服务端响应SYN/ACK server.receive(SYN, seq=x) server.send(ACK, ack=x + 1, seq=y, SYN=True) # 客户端完成第三次握手 client.receive(ACK, ack=x + 1, seq=y) client.send(ACK, ack=y + 1) ``` #### 四次挥手流程 对于终止一条已有的TCP连接来说,通常采用的是四步挥手的方式来进行操作。以下是具体的步骤描述: 一方(假设为客户方)先主动关闭连接并向另一方发送 FIN 控制位置位的数据报;接着等待被通知的一侧回复一个 ACK 应答信号以表明它收到了结束指示并且不再期待更多来自原方向上的新信息流[^3]。 随后被动关闭的那一边也会发出自己想要中断的意思表达也就是第二个 FIN 帧,与此同时还要附带有一个新的序列编号用于跟踪这条消息的状态变化情况;最终由最初提出切断提议者给出最后一个确认答复——第三个也是第四个 ACK 消息,以此正式宣告整个双向通讯链路彻底解除关系。 ```python # 主动关闭方发送FIN active_side.send(FIN, seq=a) # 被动关闭方返回ACK passive_side.receive(FIN, seq=a) passive_side.send(ACK, ack=a + 1) # 被动关闭方发送FIN passive_side.send(FIN, seq=b) # 主动关闭方返回ACK active_side.receive(FIN, seq=b) active_side.send(ACK, ack=b + 1) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值