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

相关文章

windows下安装Nginx全过程

《windows下安装Nginx全过程》文章介绍了HTTP和反向代理服务器的概念,包括正向代理和反向代理的区别,并详细描述了如何安装和配置Nginx作为反向代理服务器... 目录概念代理正向代理反向代理安装基本属性nginx.conf查询结构属性使用运行重启停止总结概念是一个高性能的HTTP和反向代理we

在C#中调用Windows防火墙界面的常见方式

《在C#中调用Windows防火墙界面的常见方式》在C#中调用Windows防火墙界面(基础设置或高级安全设置),可以使用进程启动(Process.Start)或Win32API来实现,所以本文给大家... 目录引言1. 直接启动防火墙界面(1) 打开基本防火墙设置(firewall.cpl)(2) 打开高

基于Python实现局域网内Windows桌面文件传输

《基于Python实现局域网内Windows桌面文件传输》这篇文章介绍了如何使用Python实现一个局域网文件传输系统,包括发送端和接收端的代码示例,发送端和接收端都需要在同一局域网内运行,并且确保防... 目录发送端代码 (sender.py)接收端代码 (receiver.py)图形界面版本 (可选)使

Linux挂载linux/Windows共享目录实现方式

《Linux挂载linux/Windows共享目录实现方式》:本文主要介绍Linux挂载linux/Windows共享目录实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录文件共享协议linux环境作为服务端(NFS)在服务器端安装 NFS创建要共享的目录修改 NFS 配

基于Python开发Windows自动更新控制工具

《基于Python开发Windows自动更新控制工具》在当今数字化时代,操作系统更新已成为计算机维护的重要组成部分,本文介绍一款基于Python和PyQt5的Windows自动更新控制工具,有需要的可... 目录设计原理与技术实现系统架构概述数学建模工具界面完整代码实现技术深度分析多层级控制理论服务层控制注

Oracle数据库在windows系统上重启步骤

《Oracle数据库在windows系统上重启步骤》有时候在服务中重启了oracle之后,数据库并不能正常访问,下面:本文主要介绍Oracle数据库在windows系统上重启的相关资料,文中通过代... oracle数据库在Windows上重启的方法我这里是使用oracle自带的sqlplus工具实现的方

HTTP 与 SpringBoot 参数提交与接收协议方式

《HTTP与SpringBoot参数提交与接收协议方式》HTTP参数提交方式包括URL查询、表单、JSON/XML、路径变量、头部、Cookie、GraphQL、WebSocket和SSE,依据... 目录HTTP 协议支持多种参数提交方式,主要取决于请求方法(Method)和内容类型(Content-Ty

Java对接MQTT协议的完整实现示例代码

《Java对接MQTT协议的完整实现示例代码》MQTT是一个基于客户端-服务器的消息发布/订阅传输协议,MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛,:本文主要介绍Ja... 目录前言前置依赖1. MQTT配置类代码解析1.1 MQTT客户端工厂1.2 MQTT消息订阅适配器1.

Linux中的自定义协议+序列反序列化用法

《Linux中的自定义协议+序列反序列化用法》文章探讨网络程序在应用层的实现,涉及TCP协议的数据传输机制、结构化数据的序列化与反序列化方法,以及通过JSON和自定义协议构建网络计算器的思路,强调分层... 目录一,再次理解协议二,序列化和反序列化三,实现网络计算器3.1 日志文件3.2Socket.hpp

Linux中的HTTPS协议原理分析

《Linux中的HTTPS协议原理分析》文章解释了HTTPS的必要性:HTTP明文传输易被篡改和劫持,HTTPS通过非对称加密协商对称密钥、CA证书认证和混合加密机制,有效防范中间人攻击,保障通信安全... 目录一、什么是加密和解密?二、为什么需要加密?三、常见的加密方式3.1 对称加密3.2非对称加密四、