欧卡2中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

需要三步,才能开始

只需两步,慢速开始

欧卡2入门方向盘选莱仕达V9莱仕达折叠便携游戏方向盘支架欢迎地图Mod入驻
查看: 6950|回复: 2
收起左侧

[网络] 为什么TCP连接需要三次握手

[复制链接]
丶纠结灬 发表于 2020-5-2 21:44 | 显示全部楼层 |阅读模式
10金币
两次不可以吗?为什么?

最佳答案

查看完整内容

[md]两次不可以 ## 三次握手连接过程 1. 建立连接时,客户端发送 `SYN(SYN=j)` 包到服务器,并进入 `SYN_SEND` 状态,等待服务器响应、确认 2. 服务器收到 `SYN` 包,必须确认客户端的 `SYN(ACK=j+1)`,同时自己也发送一个 `SYN` 包,即 `SYN+ACK` 包,此时服务器进入 `SYN_RECV` 状态 3. 客户端收到服务器的 `SYN+ACK` 包,向服务器发送确认包 `ACK(ack=k+1)`,此包发送完毕客户端和服务器端进入 `ESTABLISHED` 状态,完 ...
 楼主| 丶纠结灬 发表于 2021-7-1 03:57 | 显示全部楼层
  • 通过三次握手才能阻止重复历史连接的初始化;
  • 通过三次握手才能对通信双方的初始序列号进行初始化;

想象一下这个场景,如果通信双方的通信次数只有两次,那么发送方一旦发出建立连接的请求之后它就没有办法撤回这一次请求,如果在网络状况复杂或者较差的网络中,发送方连续发送多次建立连接的请求,如果 TCP 建立连接只能通信两次,那么接收方只能选择接受或者拒绝发送方发起的请求,它并不清楚这一次请求是不是由于网络拥堵而早早过期的连接。

所以,TCP 选择使用三次握手来建立连接并在连接引入了 RST 这一控制消息,接收方当收到请求时会将发送方发来的 SEQ+1 发送给对方,这时由发送方来判断当前连接是否是历史连接:

  • 如果当前连接是历史连接,即 SEQ 过期或者超时,那么发送方就会直接发送 RST 控制消息中止这一次连接;
  • 如果当前连接不是历史连接,那么发送方就会发送 ACK 控制消息,通信双方就会成功建立连接;

使用三次握手和 RST 控制消息将是否建立连接的最终控制权交给了发送方,因为只有发送方有足够的上下文来判断当前连接是否是错误的或者过期的,这也是 TCP 使用三次握手建立连接的最主要原因。

TCP 建立连接时通过三次握手可以有效地避免历史错误连接的建立,减少通信双方不必要的资源消耗,三次握手能够帮助通信双方获取初始化序列号,它们能够保证数据包传输的不重不丢,还能保证它们的传输顺序,不会因为网络传输的问题发生混乱,到这里不使用『两次握手』和『四次握手』的原因已经非常清楚了:

  • 『两次握手』:无法避免历史错误连接的初始化,浪费接收方的资源;
  • 『四次握手』:TCP 协议的设计可以让我们同时传递 ACK 和 SYN 两个控制信息,减少了通信次数,所以不需要使用更多的通信次数传输相同的信息;

From: https://draveness.me/whys-the-design-tcp-three-way-handshake/


回复 打印

使用道具 举报

script 发表于 2020-5-2 21:44 | 显示全部楼层

两次不可以

三次握手连接过程

  1. 建立连接时,客户端发送 SYN(SYN=j) 包到服务器,并进入 SYN_SEND 状态,等待服务器响应、确认
  2. 服务器收到 SYN 包,必须确认客户端的 SYN(ACK=j+1),同时自己也发送一个 SYN 包,即 SYN+ACK 包,此时服务器进入 SYN_RECV 状态
  3. 客户端收到服务器的 SYN+ACK 包,向服务器发送确认包 ACK(ack=k+1),此包发送完毕客户端和服务器端进入  ESTABLISHED 状态,完成三次握手

为了保证服务端能收到客户端的信息并能做出正确的响应而进行前两次握手,为了保证客户端能够收到服务端的信息并能做出正确的响应而进行后两次握手

三次握手图示

superplot
回复 打印

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

联系我们|手机版|欧卡2中国 ( 湘ICP备11020288号-1 )

GMT+8, 2024-11-25 17:48 , Processed in 0.055771 second(s), 13 queries , Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表