四次挥手中你还不知道的ACK机制
为面试做准备中。
后面有对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。
这下你理解下面这个四次挥手的含义了吧。
大家要是觉得有收获的话,麻烦动动手,帮忙点赞,关注。欢迎关注我的公众号玩编程地码农
最新文章
- mysql 查询去重 distinct
- 自己封装的一个无限滚动 mark 待传
- 玩转MAC OS!实测DIY兼容机装苹果系统
- FactoryBean的使用
- WPF处理Windows消息
- C# ikvm 运行htmlunit Provider com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl not found
- .NET开发面向对象1
- 中文编程语言之Z语言初尝试: ZLOGO 4
- List Except 失效 差集失效
- nodeJS之crypto模块公钥加密及解密
- Oracle 手动建库
- HTML 标记 3 —— 框架
- CSS background汇总
- hadoop之定制自己的Partitioner
- Jenkins在windows环境下安装无法安装插件
- 企业搜索引擎开发之连接器connector(十七)
- 解题:BZOJ 4808 马
- Docker的一些常用
- 用QT写一个对话框
- js中三种定义变量 const, var, let 的区别