面经

http 三次握手,四次挥手

三次握手的目的是建立可靠的通信信道。简单来说,通讯即数据的发送与接收,而三次握手的主要目的是双方确认自己与对方的发送与接收是正常的。

  • 第一次握手:Client 无法确认,Server 确认对方发送正常,自己接收正常。
  • 第二次握手:Client 确认自己发送、接收正常,对方发送、接收正常;Server 确认对方发送正常,自己接收正常。
  • 第三次握手:Client 确认自己发送、接收正常,对方发送、接收正常;Server 确认自己发送、接收正常,对方发送、接收正常。

三次握手确保双方的收发功能都正常,缺一不可。

为什么要四次挥手?

TCP 是全双工通信,允许双向数据传输。任何一方结束数据传输后都可以发送连接释放通知,待对方确认后进入半关闭状态。另一方也无数据发送时,发出连接释放通知,对方确认后完全关闭 TCP 连接。

例子: A 和 B 通话结束。

  1. A 发出“我没啥要说的”。
  2. B 回答“知道了”,但可能还有话,A 不能要求立即结束。
  3. B 可能继续说,最后确认“我说完了”。
  4. A 回答“知道了”,通话结束。

为何不能合并服务器的 ACK 和 FIN 成三次挥手?

服务器可能还有数据未发送。先回复 ACK 表示接收到关闭请求,再发送 FIN 断开服务器到客户端的数据传输。

若服务器的 ACK 在第二次挥手时未送达,会怎样?

客户端未收到确认,会重新发送 FIN 请求。

*为何第四次挥手客户端需等待 2 MSL?

防止服务器未收到 ACK,重发 FIN。客户端在 2*MSL 内收到 FIN 后,重新发送 ACK 并等待 2MSL,确保服务器收到 ACK。

MSL: 片段在网络中最大存活时间,2MSL 是发送和回复所需的最大时间。若在 2MSL 内未收到 FIN,客户端推断 ACK 已接收,结束 TCP 连接。

@Autowired 和@Resource 的区别

http://t.csdnimg.cn/vE7jG