考察点:

1、对 TCP 建立连接过程的理解;

2、对 TCP 断开连接过程的理解;

技术点:

  • TCP 报文头信息
  • TCP 建立连接过程
  • TCP 断开连接过程

TCP 报文

  • 序号:占4个字节,表示发送的数据字节流
  • 确认号:占4个字节,发送方期待接收的下一序列号,只有 ACK=1 时才有效
  • ACK:确认序号的标志,ACK=1 表示确认号有效,ACK=0 表示报文不含确认序号信息
  • SYN:连接请求序号标志,用于建立连接,SYN=1 表示请求连接
  • FIN:结束标志,用于释放连接,为1表示关闭本方数据流

三次握手

  • 首先 C 端发送连接请求报文
  • S 端接受连接后回复 ACK 报文,并为这次连接分配资源
  • C 端接收到 ACK 报文后也向 S 端发送 ACK 报文,并分配资源

1、如果只握手前两次,会有什么后果?

  客户端第一次发送请求,有可能网络原因滞留了,客户端会认为失效了再次发送请求。某一个时间第一次请求突然又达到了服务端,没有第三次握手确认的话,服务端会认为客户端又发了一次请求,再一次去响应客户端,客户端发现这次已经超时,就会忽略这个请求,此时服务端一直等着客户端的响应。没有第三次握手确认的话,会造成资源的浪费

2、如果握了四次手,是怎么样的?

  服务端再次向客户端发送确认。完全可靠是不可能的,三次握手已经是可靠的了,如果认为三次握手不可靠,再握手一次,也是不可靠的,所以说三次握手就够了。

四次挥手

  • 假设 C 端发送中断连接请求,也就是发送 FIN 报文
  • S 端接到 FIN 报文后,先发送 ACK,这个时候 C 端就进入 FIN_WAIT 状态,继续等待 S 端的 FIN 报文
  • 当 S 端确定数据已发送完成,则向 C 端发送 FIN 报文
  • C 端收到 FIN 报文后,发送 ACK 后进入 TIME_WAIT 状态,如果 S 端没有收到 ACK 则可以重传。C 端等待了 2MSL 后依然没有收到回复,则证明 S 端已正常关闭
  • C 端关闭连接

1、为什么最后一次 C 端发送 ACK 后,要进入 TIME_WAIT 状态?

  如果最后一次 C 端发送 ACK 确认报文,S 端没有收到的话,S端 会认为 FIN 没有发送出,会重新发,所以有  2MSL(两倍的消息同步时间)时长等待。

2、为什么中断时有4次?

  因为发送报文时不会立刻中断,S 端先回一个 ACK 报文,告诉 C 端结束报文已经收到了,只有当 S 端所有的报文都发送完了,再回 FIN 报文,因此需要4次。

 

posted on 2023-04-09 00:34  三天乐趣  阅读(4)  评论(0编辑  收藏  举报