三次握手都经历了什么?

三次握手

在建立连接过中,了解下有使用到的知识点,其中 SYN、ACK 和 FIN 为 TCP 的 FLAG 位,SYN(Synchronize Sequence Numbers)用于建立连接时的同步信息;ACK(Acknowledgement)用于对收到的数据进行确认,所确认的数据由确认序列号表示;FIN(Finish)表示后面没有数据需要发送,通常意味着所建立的连接需要关闭了。

服务器需要客户端发起建立连接请求时先打开某个端口等待数据传输,否则将无法正常建立连接。

我们将 A 机器表示客户端,B 机器表示服务端。

三次握手的三个步骤

  • 首先 A 机器发出一个数据包并将 SYN 设为 1,表示希望建立连接。这个包中的序列号假设时x。
  • B 机器收到 A 机器发送过来的数据包后,通过 SYN 得知这是一个建立连接的请求,于是发送一个响应包并将 SYN 和 ACK 标记设为 1。假设这个包中的序列号为 y,而确认序列号必须是 x+1,表示收到了 A 发过来的 SYN。在 TCP 中,SYN 被当作数据部分的一个字节。
  • A 收到 B 的响应包后需进行确认,确认包中将 ACK 设为 1,并将确认序列号设为 y+1,表示收到了来自 B 的 SYN。

三次握手有什么目的?

有两个主要目的:

  • 信息对等:确认对方都具有发报和收报的能力。
  • 防止超时:为了防止出现请求超时导致的脏连接。
客户端服务端
自发报能力自收报能力对发报能力对收报能力自发报能力自收报能力对发报能力对收报能力
第一次NNNNNYYN
第二次YYYYNYYN
第三次YYYYYYYY

第一次: A => B

  • A 机器发报,A 无法确认自己和 B 机器的发报收报能力。
  • B 机器收报,确认了 B 自身能收报以及 A 能发报。

第二次: B => A

  • B 机器发报,还无法确认自身 B 的发报能力和对方 A 的收报能力
  • A 机器收报,那么 A 确认自己和 B机器发报收报能力正常

第三次: A => B

  • B 机器收报,那么 B 确认自己和 A 机器能力正常。

为什么不能两次连接?

防止超时请求。

要说防止超时得提到 IP 报头中的生存时间 TTL。由于 TTL 网络报头的生存时间大多数都会超过 TCP 请求超时的时间。

那如果是两次握手就可以创建连接,在传输完毕数据后便释放连接,这时,第一个超时的连接请求才刚到达 B 机器,B 机器会以为请求是 A 要再创建新连接,然后确认同意创建连接。因为 A 机器的状态不是 SYN_SENT,所以直接丢弃了 B 的确认数据,导致最后只有 B 机器单方面创建连接完毕。

在这里插入图片描述


在这里插入图片描述
每天进步一点点


参考资料:

  • 《码出高效 -Java开发手册》 作者:孤尽、鸣莎
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值