为面试做准备中。

后面有对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。

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

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

四次挥手中你还不知道的ACK机制的更多相关文章

  1. [转载]或许您还不知道的八款Android开源游戏引擎

    或许您还不知道的八款Android开源游戏引擎         分类:             技术文章              2010-08-04 20:27     17430人阅读     ...

  2. Spring中你可能不知道的事(一)

    Spring作为Java的王牌开源项目,相信大家都用过,但是可能大家仅仅用到了Spring最常用的功能,Spring实在是庞大了,很多功能可能一辈子都不会用到,今天我就罗列下Spring中你可能不知道 ...

  3. JS你可能还不知道的一些知识点(一)

    js程序是用Unicode字符集编写的, 2.转义字符:反斜线 1 2 3 4 function Test(){   var s='you\'re right,it can\'t be a quote ...

  4. [No0000194]聊聊 Chrome DevTools 中你可能不知道的调试技巧

    对于前端开发者来说,ChromeDevTools 绝对是不可或缺的调试工具,我们常用的调试方法包含一些console等,而ChromeDevTools 其实很强大,下面来聊聊一些你可能不知道的debu ...

  5. JavaScript中你可能不知道的九件事

    今天凑巧去W3School扫了一遍JavaScript教程,发现从中看到了不少自己曾经没有注意过的细节. 我这些细节列在这里.分享给可能相同不知道的朋友: 1.使用 document.write() ...

  6. 用wireshark抓包分析TCP三次握手、四次挥手以及TCP实现可靠传输的机制

    关于TCP三次握手和四次挥手大家都在<计算机网络>课程里学过,还记得当时高超老师耐心地讲解.大学里我遇到的最好的老师大概就是这位了,虽然他只给我讲过<java程序设计>和< ...

  7. redis-cli中那些或许我们还不知道的一些实用小功能

    玩过redis的朋友都知道,redis中有一个叫做redis-cli的小工具,我们可以利用它在test和develop环境下进行高效的模拟测试,然而在现实环境中, 我们只知道直接键入redis-cli ...

  8. jdk1.8新特性,还不知道的朋友还不看看,1.9都快出来了

    一.接口的默认方法 Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可,这个特征又叫做扩展方法,示例如下:代码如下:interface Formula {     ...

  9. Spring中你可能不知道的事(二)

    在上一节中,我介绍了Spring中极为重要的BeanPostProcessor BeanFactoryPostProcessor Import ImportSelector,还介绍了一些其他的零碎知识 ...

随机推荐

  1. 利用xslt与xml实现具体字段字母的大小写转换

    定义一个全局的变量 <xsl:variable name="smallcase" select="'abcdefghijklmnopqrstuvwxyz'" ...

  2. 再探命令行传参之c与python

    继上一次java命令行传参 python sys模块包括了一组非常实用的服务,内含很多函数方法和变量,用来处理Python运行时配置以及资源,从而可以与前当程序之外的系统环境交互,如:python解释 ...

  3. sql之对top语句理解

    起因 事情的起因是在群里和大佬讨论问题,讨论select top x后加*的问题,这时突发奇想,想搞清楚这个看起来在sql中略显突兀的语句结构,就有了这篇文 先看例子 select * from 表 ...

  4. 最权威最简明的maven 使用教程

    Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Depen ...

  5. C# 通过ServiceStack 操作Redis——List类型的使用及示例

    Redis list的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销, /// <summary> /// Redis list的实现为一个双向链表 ...

  6. International Collegiate Programming Contest 2019 Latin American Regional Contests Problem K

    题目链接:https://codeforces.ml/gym/102428/attachments/download/9820/statements-en.pdf 题意:构造一个多项式使得外星人编号的 ...

  7. 学会使用 Mysql show processlist 排查问题

    mysql show full processlist 查看当前线程处理情况 事发现场 每次执行看到的结果应该都有变化,因为是实时的,所以我定义为:"事发现场",每次执行就相当于现 ...

  8. Java单例模式实现,一次性学完整,面试加分项

    单例模式是设计模式中使用最为普遍的一种模式.属于对象创建模式,它可以确保系统中一个类只产生一个实例.这样的行为能带来两大好处: 对于频繁使用的对象,可以省略创建对象所花费的时间,这对于那些重量级对象而 ...

  9. CPU发展史和相关品牌介绍

    CPU发展史和相关品牌介绍 CPU发展已经有40多年的历史了.我们通常将其分成 六个阶段. (1)第一阶段 (1971年-1973年) .这是4位和8位低档微处理器时代,代表产品是Intel 4004 ...

  10. [Fundamental of Power Electronics]-PART I-4.开关实现-0 序

    4 开关实现 在前面的章节中我们已经看到,可以使用晶体管,二极管来作为Buck,Boost和其他一些DC-DC变换器的开关元件.也许有人会想为什么会这样,以及通常如何实现半导体的开关.这些都是值得被提 ...