乐趣区

关于java:Java面试TCP协议为什么要设计三次握手

一个工作 5 年的粉丝,最近去面试了很多公司,每次都被各种技术原理题问得语无伦次。

因为找了快 1 个月工夫的工作,有点焦虑,来向我求助。

我能做的只是保障每天更新一个面试题,而后问他印象最粗浅的一个面试题是什么,他说。

“TCP 协定为什么要设计三次握手”。

好的,对于这个问题,咱们来看看普通人和高手的答复。

普通人:

我认为就是因为 TCP 它是一个双工协定,双工协定就是意味着它能够双向去进行数据传输。

那么既然是数据双向传输的话,那么意味着我两端都是建设一个通信连贯。两端都是彼此之间双向建设连贯。所有相当于说 A 要像 B 建设连贯,B 要像 A 建设连贯,这两个之间就是两次。

在加上在这个建设连贯过程中我还须要确认这个连贯是不是建设胜利。所以在客户端发送给服务端建设连贯的时候须要给个回应。

高手:

对于这个问题,我会从上面 3 个方面来答复。

  1. TCP 协定,是一种牢靠的,基于字节流的,面向连贯的传输层协定。

    • 可靠性体现在 TCP 协定通信单方的数据传输是稳固的,即使是在网络不好的状况下,TCP 都可能保障数据传输到指标端,而这个可靠性是基于数据包确认机制来实现的。
    • TCP 通信单方的数据传输是通过字节流来实现传输的
    • 面向连贯,是说数据传输之前,必须要建设一个连贯,而后基于这个连贯进行数据传输
  2. 因为 TCP 是面向连贯的协定,所以在进行数据通信之前,须要建设一个牢靠的连贯,TCP 采纳了三次握手的形式来实现连贯的建设。

    所谓的三次握手,就是通信单方一共须要发送三次申请,能力确保这个连贯的建设。

    • 客户端向服务端发送连贯申请并携带同步序列号 SYN。
    • 服务端收到申请后,发送 SYN 和 ACK,这里的 SYN 示意服务端的同步序列号,ACK 示意对后面收到申请的一个确认,示意通知客户端,我收到了你的申请。
    • 客户端收到服务端的申请后,再次发送 ACK,这个 ACK 是针对服务端连贯的一个确认,示意通知服务端,我收到了你的申请。

  3. 之所以 TCP 要设计三次握手,我认为有三个方面的起因:

    • TCP 是可靠性通信协议,所以 TCP 协定的通信单方都必须要保护一个序列号,去标记曾经发送进来的数据包,哪些是曾经被对方签收的。而三次握手就是通信单方互相告知序列号的起始值,为了确保这个序列号被收到,所以单方都须要有一个确认的操作。
    • TCP 协定须要在一个不牢靠的网络环境下实现牢靠的数据传输,意味着通信单方必须要通过某种伎俩来实现一个牢靠的数据传输通道,而三次通信是建设这样一个通道的最小值。当然还能够四次、五次,只是没必要节约这个资源。
    • 避免历史的反复连贯初始化造成的凌乱问题,比如说在网络比拟差的状况下,客户端间断屡次发送建设连贯的申请,假如只有两次握手,那么服务端只能抉择承受或者回绝这个连贯申请,然而服务端不晓得这次申请是不是之前因为网络梗塞而过期的申请,也就是说服务端不晓得以后客户端的连贯是无效还是有效。

以上就是我对这个问题的了解。

总结

网络通信这块内容还是比拟重要的,面对一些线上网络故障排查的时候,

能够疾速的去帮忙咱们定位问题,并找到解决办法。

如果有任何面试问题、职业倒退问题、学习问题,都能够私信我,另还有 Java 面试材料和简历模板能够收费支付。

版权申明:本博客所有文章除特地申明外,均采纳 CC BY-NC-SA 4.0 许可协定。转载请注明来自 Mic 带你学架构
如果本篇文章对您有帮忙,还请帮忙点个关注和赞,您的保持是我一直创作的能源。欢送关注同名微信公众号获取更多技术干货!

退出移动版