为面试做准备中。

后面有对ACK机制的详细讲解。

四次挥手比较好解释。

看一下我的草图。

ACK表示发来的数据已确认接收无误。

图中一个箭头代表一次挥手。

第一次挥手:

  • 主动关闭方:发送一个FIN,表示自己没有数据要发送了。

第二次挥手:

  • 被动关闭方:收到FIN后知道对方不会再有数据传来。
  • 主动关闭方:收到ACK后将进入半关闭状态,只会发送ACK进行确认,不会发送其他数据。

第三次挥手:

  • 被动关闭方:发送一个FIN,表示自己没有数据要发送了。

第四次挥手:

  • 被动关闭方:收到ACK后将进入关闭状态。

面试过程中除了将上面的讲完之外。如何可以、还可以用自己的话讲述一遍,这样子面试官才会知道你是真的理解。

用自己的话讲就是:A和B通话,聊到最后A和B说我讲完了,B回复说我知道了。但是此时B还没有讲完,所以B又瞎扯了一堆后,B和A说我讲完了,A回复说我知道了。此时通信才完全断开。

这里再科普一下有关知识,大多数三次握手和四次挥手都没有提到。

发送任何数据、需要接收一个确认对吧。那这个确认是用什么标识的呢。其实还是用的ACK,这个ACK和三次握手四次挥手的ACK都是一回事,都是全大写的ACK。

也就是说真正的四次挥手其实是这样子的

主动关闭方:

发送一个FIN的同时还需要带一个ACK,这个ACK是为了确认被动关闭方所发送的上一条数据的。

可以这样子理解,FIN数据包和普通的数据包并没有什么区别好吧,只是将FIN标识位设为1罢了。

ACK : TCP协议规定,只有ACK=1时表示对方数据发送有效,也规定连接建立后所有发送的报文的ACK必须为1

所以说如论你是发送普通数据还是发送四次挥手的数据你都要带上ACK,用来表示对方发送的信息你此时已经收到哪里了。丢失的那些你不需要确认,你只需要确认你收到哪里了。

总结一下:

大写ACK可以理解为我收到你发来的数据了

ACK标志为除了三次握手的第一次握手置为0之外,其他的时候ACK都是置为1的,也就是说我们进行通信的时候ACK的标志位都是被置为1。为什么呢?哪怕传送失败了也是置为1吗?没错、传送失败了也是置为1、你想想我发送出错了,你还是需要确认你到底收到哪里了,所以你的ACK还是需要置为1。

这下你理解下面这个四次挥手的含义了吧。

大家要是觉得有收获的话,麻烦动动手,帮忙点赞,关注。欢迎关注我的公众号玩编程地码农

最新文章

  1. mysql 查询去重 distinct
  2. 自己封装的一个无限滚动 mark 待传
  3. 玩转MAC OS!实测DIY兼容机装苹果系统
  4. FactoryBean的使用
  5. WPF处理Windows消息
  6. C# ikvm 运行htmlunit Provider com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl not found
  7. .NET开发面向对象1
  8. 中文编程语言之Z语言初尝试: ZLOGO 4
  9. List Except 失效 差集失效
  10. nodeJS之crypto模块公钥加密及解密
  11. Oracle 手动建库
  12. HTML 标记 3 —— 框架
  13. CSS background汇总
  14. hadoop之定制自己的Partitioner
  15. Jenkins在windows环境下安装无法安装插件
  16. 企业搜索引擎开发之连接器connector(十七)
  17. 解题:BZOJ 4808 马
  18. Docker的一些常用
  19. 用QT写一个对话框
  20. js中三种定义变量 const, var, let 的区别

热门文章

  1. Java基础语法学习
  2. 趣谈 DHCP 协议,有点意思。
  3. C# 应用 - 使用 HttpListener 接受 Http 请求
  4. ProBuilder快速原型开发技术 ---模型精细化操作
  5. 【Django必备01】——什么是Django框架?有什么优势?模块组成介绍。
  6. python写一个学生信息管理系统
  7. Hadoop学习笔记—HDFS
  8. Spring Cloud 升级之路 - 2020.0.x - 1. 背景知识、需求描述与公共依赖
  9. WebGPU[4] 纹理三角形
  10. Github 镜像资源