17-TCP 协议(迟到的 ACK —— Windows )

2024-03-08 00:59
文章标签 windows 协议 tcp 17 迟到 ack

本文主要是介绍17-TCP 协议(迟到的 ACK —— Windows ),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 引言

我们知道,TCP 协议中,需要对接收到 TCP 段进行确认。有两种方式可以减少 TCP 报文段. 一种是累积确认,另一种是捎带确认。

  • 累积确认

有时候,发送方发送速度非常快,接收方一下下接收到了好几个 tcp 段,可以通过累积确认的方式,一次确认好几个 tcp 段,这样减少报文段的传输。

  • 捎带确认

有时候,双方互相发送数据,当接收到对方的 tcp 段后,先不着急确认,而是等待一会儿,连同数据和 ack 一起发送过去,这种情况叫捎带确认。如果等了一会儿(到时间了),接收方还没有数据要发送,那就直接回复一个纯 ack 过去,这样的 ack 称为延时的 ackDelayed ACK).

本文就来看一下,操作系统是如何进行时延确认的。

2. 实验

本节实验,我们使用新的客户端 echo_client.cpp 和 新的服务器 echo_serv.c.

  • 客户端:unp/protocol/tools/winclient/echo_client.cpp,部署在 Windows 上。
  • 服务器:unp/protocol/tools/tcpserver/echo_serv.cpp,部署在 Linux 上。

echo_serv 的功能是将接收到数据回射回去。echo_client 的功能是从键盘接收字符,每接收到一个字节就立即发送出去。

当 echo_client 连接到 echo_serv 的时候,在键盘上键入字符,echo_client 会将键入的字符立即发送到服务器,然后服务器将收到的字符回送回来。echo_client 接收到回送的字符后,将其打印到屏幕。

特别注意的是,echo_client 启动后,从键盘键入字符,是不会显示在屏幕上的。这个功能是由函数 getch 完成的,如果不太明白,建议先 baidu or google 一下这个函数。

2.1 实验步骤

  • Linux 端启动 echo_serv
$ echo_serv 192.168.80.130 8000
  • Windows 端打开 OmniPeek 进行抓包,然后启动 echo_client
$ echo_client 192.168.80.130 8000

然后分别键入 loveq 这五个字符,一定记得,是五个字符,最后一个字符 q 不要丢了!!!


这里写图片描述
图1 键入 loveq

可以看到显示了 love,因为这四个字符是服务器发送回来的。而键入的 q 直接导致了客户端退出。

2.2 抓包结果


这里写图片描述
图2 抓到的数据包

先来分析一下,4 号数据包,客户端给服务器发送了字符 l,服务器直接回送了 5 号数据包 ack. 详细情况见图 3.

注:数据包序号标注有点问题,不要以图 2 最左右的序号来看,实际序号就是从 1 开始,即 packet 2 实际上是 1 号,packet 8 实际上是 4 号数据包。


这里写图片描述
图3 延时的 ACK

然后,服务器紧接着又将收到的数据发给了客户端(6号包)。

7 号包对服务器发来的 6 号包进行确认.

此后,我们看到所有客户端对服务器回显的数据进行确认,都是只有 ack 而没有携带数据,因为你在输入l、o、v、e 的时候很慢很慢的,客户端等不及你输入数据就先把 ack 发过去了。

客户端有没有等你的数据呢?实际上是有的,看图 2 中红框,这个 Delta Time 表示相对上一个数据包的时间,我们可以发现这个时间基本上都是 200 ms 左右。

也就是说,如果 tcp 在等待了约 200ms 左右,还是没有数据要发送,就把这个 ack 单独发送出去了。(win10 系统测试现在是 40ms)。

以上是 windows 表现的结果,在 Linux 中又是另一番景象,下回分解。

3. 总结

  • 什么是时延 ACK
  • Windows 是如何实现的

这篇关于17-TCP 协议(迟到的 ACK —— Windows )的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/785442

相关文章

【Linux】应用层http协议

一、HTTP协议 1.1 简要介绍一下HTTP        我们在网络的应用层中可以自己定义协议,但是,已经有大佬定义了一些现成的,非常好用的应用层协议,供我们直接使用,HTTP(超文本传输协议)就是其中之一。        在互联网世界中,HTTP(超文本传输协议)是一个至关重要的协议,他定义了客户端(如浏览器)与服务器之间如何进行通信,以交换或者传输超文本(比如HTML文档)。

在 Windows 上部署 gitblit

在 Windows 上部署 gitblit 在 Windows 上部署 gitblit 缘起gitblit 是什么安装JDK部署 gitblit 下载 gitblit 并解压配置登录注册为 windows 服务 修改 installService.cmd 文件运行 installService.cmd运行 gitblitw.exe查看 services.msc 缘起

Windows如何添加右键新建菜单

Windows如何添加右键新建菜单 文章目录 Windows如何添加右键新建菜单实验环境缘起以新建`.md`文件为例第一步第二步第三步 总结 实验环境 Windows7 缘起 因为我习惯用 Markdown 格式写文本,每次新建一个.txt后都要手动修改为.md,真的麻烦。如何在右键新建菜单中添加.md选项呢? 网上有很多方法,这些方法我都尝试了,要么太麻烦,要么不凑效

【Go】go连接clickhouse使用TCP协议

离开你是傻是对是错 是看破是软弱 这结果是爱是恨或者是什么 如果是种解脱 怎么会还有眷恋在我心窝 那么爱你为什么                      🎵 黄品源/莫文蔚《那么爱你为什么》 package mainimport ("context""fmt""log""time""github.com/ClickHouse/clickhouse-go/v2")func main(

Windows下Nginx的安装及开机启动

1、将nginx-1.16.1.zip解压拷贝至D:\web\nginx目录下。 2、启动Nginx,两种方法: (1)直接双击nginx.exe,双击后一个黑色的弹窗一闪而过。 (2)打开cmd命令窗口,切换到nginx目录下,输入命令 nginx.exe 或者 start nginx ,回车即可。 3、检查nginx是否启动成功。 直接在浏览器地址栏输入网址 http://lo

2024.9.8 TCP/IP协议学习笔记

1.所谓的层就是数据交换的深度,电脑点对点就是单层,物理层,加上集线器还是物理层,加上交换机就变成链路层了,有地址表,路由器就到了第三层网络层,每个端口都有一个mac地址 2.A 给 C 发数据包,怎么知道是否要通过路由器转发呢?答案:子网 3.将源 IP 与目的 IP 分别同这个子网掩码进行与运算****,相等则是在一个子网,不相等就是在不同子网 4.A 如何知道,哪个设备是路由器?答案:在 A

图解TCP三次握手|深度解析|为什么是三次

写在前面 这篇文章我们来讲解析 TCP三次握手。 TCP 报文段 传输控制块TCB:存储了每一个连接中的一些重要信息。比如TCP连接表,指向发送和接收缓冲的指针,指向重传队列的指针,当前的发送和接收序列等等。 我们再来看一下TCP报文段的组成结构 TCP 三次握手 过程 假设有一台客户端,B有一台服务器。最初两端的TCP进程都是处于CLOSED关闭状态,客户端A打开链接,服务器端

Modbus-RTU协议

一、协议概述 Modbus-RTU(Remote Terminal Unit)是一种基于主从架构的通信协议,采用二进制数据表示,消息中的每个8位字节含有两个4位十六进制字符。它主要通过RS-485、RS-232、RS-422等物理接口实现数据的传输,传输距离远、抗干扰能力强、通信效率高。 二、报文结构 一个标准的Modbus-RTU报文通常包含以下部分: 地址域:单个字节,表示从站设备

Windows环境利用VS2022编译 libvpx 源码教程

libvpx libvpx 是一个开源的视频编码库,由 WebM 项目开发和维护,专门用于 VP8 和 VP9 视频编码格式的编解码处理。它支持高质量的视频压缩,广泛应用于视频会议、在线教育、视频直播服务等多种场景中。libvpx 的特点包括跨平台兼容性、硬件加速支持以及灵活的接口设计,使其可以轻松集成到各种应用程序中。 libvpx 的安装和配置过程相对简单,用户可以从官方网站下载源代码

C++实现俄罗斯方块(Windows控制台版)

C++实现俄罗斯方块(Windows控制台版) 在油管上看到一个使用C++控制台编写的俄罗斯方块小游戏,源代码200多行,B站上也有相关的讲解视频,非常不错,值得学习。 B站讲解视频地址为:【百万好评】国外技术大神C++游戏编程实战教程,油管580W收藏,新手10小时入门,并快速达到游戏开发能力(中英字幕) B站 CSDN博主千帐灯无此声还为此写了一篇博客:C++实现俄罗斯方块(源码+详解),讲