TCP协议,面试问到了

很重要的TCP协议知识,三次握手四次挥手。

TCP和UDP的关系

  • TCP 和 UDP 均是传输层协议。
  • TCP 是基于连接的可靠传输协议,UDP是面向无连接的不可靠传输协议。
  • TCP 面向字节流,UDP 面向报文。
  • TCP 只能支持点对点传输,UDP 支持一对多,多对一传输。

TCP协议如何完成三次握手、四次挥手

找到一张很完善的图,建议图文配合,容易理解。

三次握手

  1. 客户端发起连接,发送 SYN 消息给服务端,发送后客户端状态变为 SYN_SEND 。
  2. 服务端收到客户端的SYN消息(此时服务端状态为LISTEN),然后发送 SYN+ACK 消息给客户端(此时服务端状态变为SYN_RCVD)。
  3. 客户端收到消息,然后回复服务端ACK消息。(发送完毕客户端状态变为 ESTABLISHED ,服务端收到消息后状态变为 ESTABLISHED。此时两端状态一直进入输入传输状态)。

三次握手结束进入数据传输状态,分析一下为什么是三次握手,其实每一次握手都是必须的:

第一次握手是为了验证客户端的发送能力。

第二次握手时已知服务端自己的接收能力是无误的,回复客户端是为了通知客户端本身发送能力无误,同时也是测试服务端自己的发送能力。

第三次握手时客户端通知服务端其发送能力无误。

so,此时每一步握手都无误,缺一不可。

四次挥手

  1. 客户端发起结束挥手,发送 FIN 信息给服务端,表示自身无数据要发送给服务端,发送完后客户端状态变为 FIN_WAIT_1。
  2. 服务端收到 FIN 消息,此时服务端会将要发送给客户端的数据继续发送过去,等完全无数据包需要发送再次发送挥手 ACK 给客户端,发送完成后服务端进入 CLOSE_WAIT 状态。(客户端收到 ACK 消息后状态变更为 FIN_WAIT_2 ,继续等待。)
  3. 服务端在应用层同意关闭后最后发送 FIN 消息给客户端,然后状态变更为 LAST_ACK 。
  4. 客户端收到 FIN 消息后最后一次 ACK 消息给服务端,自身进入 TIME_WAIT 状态,在等待指定时间后关闭连接,服务端收到最后 ACK 消息后直接关闭连接。

四次挥手关闭连接,客户端发起关系请求需要服务端确认,服务端确认关闭连接需要通知客户端,客户端确认服务端发送的关闭消息,一共交互四次连接关闭。

看似几次交互,每一步都必不可少,握手保证双方收发能力正常,挥手保证双方确认同步。