TCP的ACK机制
下面是整个的tcp的三次握手和四次挥手的协议
TCP四次挥手
在客户端先发送一个FIN的包,表示要close(),客户端想和连接断开,发完之后出于FIN_WAIT_1状态下;服务端收到之后就变成CLOSE_WAIT,发送ACK的确认消息,把缓冲区的数据进行发送完成,接着也要发送一个FIN 的包,代表着也要和客户端说“拜拜”。客户端收到FIN的包后变成WAIT_TIME状态。接着发送一个ACK给服务端,服务端收到后就closed了。
重点:客户端收到FIN的包后变成WAIT_TIME状态发送ACK包后,会等待2MSL。为啥会等待2MSL呢? 1MSL时间内,客户端会不停发送ACK给服务端,对面如果没有响应,证明服务端已经关了。 万一服务端没有收到客户端发送的ACK,站在服务器的角度看来,我已经发送了FIN+ACK报文请求断开了,客户端还没有给我回应,应该是我发送的请求断开报文它没有收到,于是服务器又会重新发送一次,而客户端就能在这个2MSL时间段内收到这个重传的报文,接着给出回应报文,并且会重启2MSL计时器。
ack的定义就是提醒向自己发送数据包的对端,下次发送给我,应该从ack位置的包进行发送。
假设客户端发送data,包的数量是1-100,那么服务端回送的ack则是从101开始。如果服务端回传的超时(或者有存在丢包情况),客户端就会重新发送这个包
TCP窗口滑动
只有在确认收到之后,才可以向后滑动。有了滑动窗口,ACK的机制也就发生了变化。
左侧是以前的机制,即发送完之后给你一个个回复过去;
右侧的话,会有一个delay ack,直到都发完了,才会进行回复,减少了带宽。
发送端窗口win是4096 ,MSS是最大报文大小,后面的报文最大可以存放多少字节
TCP的ACK机制的更多相关文章
- TCP的延迟ACK机制
TCP的延迟ACK机制 TCP的延迟ACK机制一说到TCP,人们就喜欢开始扯三步握手之类的,那只是其中的一个环节而已.实际上每一个数据包的正确发送都是一个类似握手的过程,可以简单的把它视为两步握手.一 ...
- Linux下TCP延迟确认(Delayed Ack)机制导致的时延问题分析
版权声明:本文由潘安群原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/105 来源:腾云阁 https://www.qclo ...
- TCP的ACK原理和延迟确认机制
某天晚上睡觉前突然想到 tcp的ACK确认是单独发的还是和报文一起发的,下面看一下别人的解答 一.ACK定义TCP协议中,接收方成功接收到数据后,会回复一个ACK数据包,表示已经确认接收到ACK确认号 ...
- ActiveMQ讯息传送机制以及ACK机制
http://blog.csdn.net/lulongzhou_llz/article/details/42270113 ActiveMQ消息传送机制以及ACK机制详解 AcitveMQ是作为一种消息 ...
- 【原创】TCP超时重传机制探索
TCP超时重传机制探索 作者:tll (360电商技术) 1)通信模型 TCP(Transmission Control Protocol)是一种可靠传输协议.在传输过程中当发送方(sender)向接 ...
- TCP超时重传机制
TCP协议在能够发送数据之前就建立起了"连接".要实现这个连接,启动TCP连接的那一方首先将发送一个SYN数据包.这只是一个不包含数据的数据包, 然后,打开SYN标记.如果另一方同 ...
- 四次挥手中你还不知道的ACK机制
为面试做准备中. 后面有对ACK机制的详细讲解. 四次挥手比较好解释. 看一下我的草图. ACK表示发来的数据已确认接收无误. 图中一个箭头代表一次挥手. 第一次挥手: 主动关闭方:发送一个FIN,表 ...
- kafkaspot在ack机制下如何保证内存不溢
新浪微博:intsmaze刘洋洋哥. storm框架中的kafkaspout类实现的是BaseRichSpout,它里面已经重写了fail和ack方法,所以我们的bolt必须实现ack机制,就可以 ...
- Storm的BaseBasicBolt源码解析ack机制
我们在学习ack机制的时候,我们知道Storm的Bolt有BaseBasicBolt和BaseRichBolt.在BaseBasicBolt中,BasicOutputCollector在emit数据的 ...
随机推荐
- 解决Mac下AndroidStudio内容时卡顿
Mac下AndroidStudio在写代码的时候出现卡顿,小圆圈会一直转,此时我们应该检查下AndroidStudio的内存使用情况了. 1.点击左上角 AndroidStudio -- Prefer ...
- 类型转化 - js中的骚操作
Number Number() 把字符串数字转化成数字类型,布尔类型也可以转化 parseInt parseInt() 字符串数字转化成数字类型,当布尔类型不可以(NaN),但该函数可以把数字开头的数 ...
- [OGeek2019]bookmanager
做过的代码量最大的一个题 说出的好也好,不好也不好,利用点很简单,就是一个大规模的heapoverflow,就是逆起来有点儿难度 思路很简单,就是利用堆溢出覆盖结构体中的指针为__free_hook, ...
- C语言基础-C简介
C语言简介 C 语言是一种通用的高级语言,最初是由丹尼斯·里奇在贝尔实验室为开发 UNIX 操作系统而设计的.C 语言最开始是于 1972 年在 DEC PDP-11 计算机上被首次实现. 在 19 ...
- Linux系统目录简介
Linux系统目录简介 boot 系统启动 grub(内核加载程序,内核≈操作硬件) 界面 自检程序 bin 系统可执行文件 bash=终端程序 sbin 超级用户的可执行文件 root root家目 ...
- 动态规划——用二进制表示集合的状态压缩DP
动态规划当中有非常常见的一个分支--状态压缩动态规划,很多人对于状态压缩畏惧如虎,但其实并没有那么难,希望这文章能带你们学到这个经典的应用. 二进制表示状态 在讲解多重背包问题的时候,我们曾经讲过二进 ...
- 深入web workers (上)
前段时间,为了优化某个有点复杂的功能,我采用了shared workers + indexDB,构建了一个高性能的多页面共享的服务.由于是第一次真正意义上的运用workers,比以前单纯的学习有更多体 ...
- Newton插值的C++实现
Newton(牛顿)插值法具有递推性,这决定其性能要好于Lagrange(拉格朗日)插值法.其重点在于差商(Divided Difference)表的求解. 步骤1. 求解差商表,这里采用非递归法(看 ...
- 错误C3646“name”: 未知重写说明符 问题
在用多文件编译来写一个程序时,遇到了一个错误: 错误C3646"name": 未知重写说明符 于是我就去某搜索引擎上搜索一下前辈们对这个错误的心得 综合网上的经验我总结了一下出现这 ...
- 25类Android常用开源框架
1.图片加载,缓存,处理 框架名称 功能描述 Android Universal Image Loader 一个强大的加载,缓存,展示图片的库,已过时 Picasso 一个强大的图片下载与缓存的库 F ...