乐趣区

关于java:面试必问TCP-的三次握手与四次挥手你真的搞懂了吗

请看图

序列号 seq:占 4 个字节,用来标记数据段的程序,TCP 把连贯中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生;给字节编上序号后,就给每一个报文段指派一个序号;序列号 seq 就是这个报文段中的第一个字节的数据编号。

确认号 ack:占 4 个字节,期待收到对方下一个报文段的第一个数据字节的序号;序列号示意报文段携带数据的第一个字节的编号;而确认号指的是冀望接管到下一个字节的编号;因而以后报文段最初一个字节的编号 + 1 即为确认号。

确认 ACK:占 1 位,仅当 ACK= 1 时,确认号字段才无效。ACK= 0 时,确认号有效

同步 SYN:连贯建设时用于同步序号。当 SYN=1,ACK= 0 时示意:这是一个连贯申请报文段。若批准连贯,则在响应报文段中使得 SYN=1,ACK=1。因而,SYN= 1 示意这是一个连贯申请,或连贯承受报文。SYN 这个标记位只有在 TCP 建产连贯时才会被置 1,握手实现后 SYN 标记位被置 0。

终止 FIN:用来开释一个连贯。FIN= 1 示意:此报文段的发送方的数据曾经发送结束,并要求开释运输连贯

PS:ACK、SYN 和 FIN 这些大写的单词示意标记位,其值要么是 1,要么是 0;ack、seq 小写的单词示意序号。

三次握手过程了解

第一次握手 :建设连贯时,客户端发送 syn 包(syn=j)到服务器,并进入 SYN_SENT 状态,期待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。

第二次握手 :服务器收到 syn 包,必须确认客户的 SYN(ack=j+1),同时本人也发送一个 SYN 包(syn=k),即 SYN+ACK 包,此时服务器进入 SYN_RECV 状态;

第三次握手 :客户端收到服务器的 SYN+ACK 包,向服务器发送确认包 ACK(ack=k+1),此包发送结束,客户端和服务器进入 ESTABLISHED(TCP 连贯胜利)状态,实现三次握手。

四次挥手过程了解

1)客户端过程收回连贯开释报文,并且进行发送数据。开释数据报文首部,FIN=1,其序列号为 seq=u(等于后面曾经传送过去的数据的最初一个字节的序号加 1),此时,客户端进入 FIN-WAIT-1(终止期待 1)状态。TCP 规定,FIN 报文段即便不携带数据,也要耗费一个序号。

2)服务器收到连贯开释报文,收回确认报文,ACK=1,ack=u+1,并且带上本人的序列号 seq=v,此时,服务端就进入了 CLOSE-WAIT(敞开期待)状态。TCP 服务器告诉高层的利用过程,客户端向服务器的方向就开释了,这时候处于半敞开状态,即客户端曾经没有数据要发送了,然而服务器若发送数据,客户端仍然要承受。这个状态还要继续一段时间,也就是整个 CLOSE-WAIT 状态继续的工夫。

3)客户端收到服务器的确认申请后,此时,客户端就进入 FIN-WAIT-2(终止期待 2)状态,期待服务器发送连贯开释报文(在这之前还须要承受服务器发送的最初的数据)。

4)服务器将最初的数据发送结束后,就向客户端发送连贯开释报文,FIN=1,ack=u+1,因为在半敞开状态,服务器很可能又发送了一些数据,假设此时的序列号为 seq=w,此时,服务器就进入了 LAST-ACK(最初确认)状态,期待客户端的确认。

5)客户端收到服务器的连贯开释报文后,必须收回确认,ACK=1,ack=w+1,而本人的序列号是 seq=u+1,此时,客户端就进入了 TIME-WAIT(工夫期待)状态。留神此时 TCP 连贯还没有开释,必须通过 2∗∗MSL(最长报文段寿命)的工夫后,当客户端撤销相应的 TCB 后,才进入 CLOSED 状态。

6)服务器只有收到了客户端收回的确认,立刻进入 CLOSED 状态。同样,撤销 TCB 后,就完结了这次的 TCP 连贯。能够看到,服务器完结 TCP 连贯的工夫要比客户端早一些。

常见面试题

为什么连贯的时候是三次握手,敞开的时候却是四次握手

答:因为当 Server 端收到 Client 端的 SYN 连贯申请报文后,能够间接发送 SYN+ACK 报文。其中 ACK 报文是用来应答的,SYN 报文是用来同步的。然而敞开连贯时,当 Server 端收到 FIN 报文时,很可能并不会立刻敞开 SOCKET,所以只能先回复一个 ACK 报文,通知 Client 端,” 你发的 FIN 报文我收到了 ”。只有等到我 Server 端所有的报文都发送完了,我能力发送 FIN 报文,因而不能一起发送。故须要四步握手。

为什么 TIME_WAIT 状态须要通过 2MSL(最大报文段生存工夫) 能力返回到 CLOSE 状态

答:尽管按情理,四个报文都发送结束,咱们能够间接进入 CLOSE 状态了,然而咱们必须假象网络是不牢靠的,有能够最初一个 ACK 失落。所以 TIME_WAIT 状态就是用来重发可能失落的 ACK 报文。在 Client 发送出最初的 ACK 回复,但该 ACK 可能失落。Server 如果没有收到 ACK,将一直反复发送 FIN 片段。所以 Client 不能立刻敞开,它必须确认 Server 接管到了该 ACK。Client 会在发送出 ACK 之后进入到 TIME_WAIT 状态。

Client 会设置一个计时器,期待 2MSL 的工夫。如果在该工夫内再次收到 FIN,那么 Client 会重发 ACK 并再次期待 2MSL。所谓的 2MSL 是两倍的 MSL(Maximum Segment Lifetime)。MSL 指一个片段在网络中最大的存活工夫,2MSL 就是一个发送和一个回复所需的最大工夫。如果直到 2MSL,Client 都没有再次收到 FIN,那么 Client 推断 ACK 曾经被胜利接管,则完结 TCP 连贯。

为什么不能用两次握手进行连贯

答:3 次握手实现两个重要的性能,既要单方做好发送数据的筹备工作 (单方都晓得彼此已筹备好),也要容许单方就初始序列号进行协商,这个序列号在握手过程中被发送和确认。

当初把三次握手改成仅须要两次握手,死锁是可能产生的。作为例子,思考计算机 S 和 C 之间的通信,假设 C 给 S 发送一个连贯申请分组,S 收到了这个分组,并发送了确认应答分组。依照两次握手的协定,S 认为连贯曾经胜利地建设了,能够开始发送数据分组。

可是,C 在 S 的应答分组在传输中被失落的状况下,将不晓得 S 是否已筹备好,不晓得 S 建设什么样的序列号,C 甚至狐疑 S 是否收到本人的连贯申请分组。在这种状况下,C 认为连贯还未建设胜利,将疏忽 S 发来的任何数据分组,只期待连贯确认应答分组。而 S 在收回的分组超时后,反复发送同样的分组。这样就造成了死锁。

如果曾经建设了连贯,然而客户端忽然呈现故障了怎么办

答:TCP 还设有一个保活计时器,显然,客户端如果呈现故障,服务器不能始终等上来,白白浪费资源。服务器每收到一次客户端的申请后都会从新复位这个计时器,工夫通常是设置为 2 小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,当前每隔 75 分钟发送一次。若一连发送 10 个探测报文依然没反馈,服务器就认为客户端出了故障,接着就敞开连贯。

写在最初

欢送大家关注我的公众号【 惊涛骇浪如码 】,海量 Java 相干文章,学习材料都会在外面更新,整顿的材料也会放在外面。

感觉写的还不错的就点个赞,加个关注呗!点关注,不迷路,继续更新!!!

视频解说:每个程序员必备的网络常识:计算机网络底层原理 150 分钟深度分析!

  1. 从一个 HTTP 申请来看网络分层原理
  2. TCP 协定底层常识还记得吗
  3. TCP 三次握手四次挥手是咋回事
  4. 什么是粘包半包,怎么来的
  5. 什么是连贯,什么是可靠性传输
  6. 散列算法 / 对称加密 / 非对称加密
  7. HTTPS 平安加密通道原理分析
退出移动版