wireshark抓包tcp为何没有四次挥手 而是三次挥手

2023-10-31

在wireshark上抓包,使用telnet直接连接baidu的ip,端口使用www,

p4@u1804:~$ ping www.baidu.com
PING www.a.shifen.com (183.232.231.174) 56(84) bytes of data.
64 bytes from 183.232.231.174 (183.232.231.174): icmp_seq=1 ttl=128 time=37.8 ms
64 bytes from 183.232.231.174 (183.232.231.174): icmp_seq=2 ttl=128 time=82.9 ms
^C
--- www.a.shifen.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 37.866/60.400/82.935/22.535 ms

ip是183.232.231.174,telnet连接一下,输入了个字符串“what???”

p4@u1804:~$ telnet 183.232.231.172 www
Trying 183.232.231.172...
Connected to 183.232.231.172.
Escape character is '^]'.
what???
HTTP/1.1 400 Bad Request

Connection closed by foreign host.

wireshark抓包记录如下

image-20211124193630929

可以看到三次握手(3,4,5)很正常,但是四次挥手却少了一次ack,成了三次挥手(13,14,15)。

上网查资料,发现有一种说法是,像《wireshark网络分析的艺术》P12-P21里说,由于延迟确认(也就是确认报文由下一个发送报文携带,一起传送过来),第二次挥手ack与第三次挥手fin合并成了一次,也就是包14。

** Seq是当前发送报文的第一个字节的序列号。Ack是确认号,期望收到对方下一个报文的第一个字节的序列号(可以理解为请求对方发送的第一个字节的序列号)。 ** Win是发送窗口的大小,单位字节。大写ACK和小写Ack不是同一个概念。

SYN和ACK、FIN、PSH都是标志位,SYN表示连接建立和连接接受请求,ACK只有为1时确认号Ack才有效,而且规定在连接建立以后所有传送的报文段ACK都要置为1。FIN指释放连接标志位,表示要释放一个连接。PSH是推送标志位,当两个进程通信时,有时一端想键入命令后立即收到对方的响应,就会把这一位置为1,接收方收到PSH=1的报文,会尽快地交付接收进程,而不再等整个缓存都填满了后再向上交付。

下面详细说一下三次握手和四次挥手的过程。用点分十进制的最后一个数字代表其IP地址。数字表示包的序列号,在抓包截图的第一列。Seq和Ack的功能是简述,不全述。

第一次握手,3。213 -> 172,发送SYN=1的tcp报文,Seq=0。请求建立连接,发送213的0号字节。

第二次握手,4。172 -> 213,发送SYN=1,ACK=1的tcp报文,Seq=0,Ack=1。对连接请求进行回复,同意建立连接,发送172的0号字节,请求213的1号字节。

第三次握手,5。213 -> 172,发送ACK=1的tcp报文,Seq=1,Ack=1。请求发送端通知接收端连接建立成功,发送213的1号字节,请求172的1号字节。

9,10,11,12,我输入what???的发送过程,以及172对我的应答,包11显示这是个bad request。http报文的解析如下。显示当前Sequence number是1,Acknowledgement number是10,意为当前发送包首字节序列号是10,请求213发送首字节序列号是10的包。在包12中213做了回复。

image-20211124201040952

第一次挥手,13。172 -> 213,发送FIN=1,PSH=1,ACK=1的tcp报文,Ack=29。172想关闭tcp连接,发送172的29号字节,请求213的10号字节。

第二次挥手,14。213 -> 172,发送FIN=1,ACK=1的tcp报文,Seq=29,Ack=10。213同意172关闭,同时自己也请求关闭,发送213的10号字节,请求172的30号字节。

第三次挥手,15。172 -> 213,发送ACK=1的tcp报文,Seq=30,Ack=11。172同意213关闭,发送172的30号字节,请求213的11号字节。

三次挥手之后,等待2MSL(Maximum Segment Lifetime 最长报文段寿命),如果没有回应,才会关闭tcp连接。这一部分详见课本计算机网络第七版P241。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

wireshark抓包tcp为何没有四次挥手 而是三次挥手 的相关文章

  • Locale.getDefault() 始终返回 en

    unix 机器上的服务器始终使用 en 作为默认区域设置 以下是区域设置输出 LANG en US LC CTYPE C LC NUMERIC C LC TIME C LC COLLATE C LC MONETARY C LC MESSAG
  • 拆分字符串以仅获取前 5 个字符

    我想去那个地点 var log src ap kernelmodule 10 001 100 但看起来我的代码必须处理 ap kernelmodule 10 002 100 ap kernelmodule 10 003 101 等 我想使用
  • Elasticsearch 无法写入日志文件

    我想激活 elasticsearch 的日志 当我运行 elasticsearch 二进制文件时 我意识到我在日志记录方面遇到问题 无法加载配置 这是输出 sudo usr share elasticsearch bin elasticse
  • awk 子串单个字符

    这是columns txt aaa bbb 3 ccc ddd 2 eee fff 1 3 3 g 3 hhh i jjj 3 kkk ll 3 mm nn oo 3 我可以找到第二列以 b 开头的行 awk if substr 2 1 1
  • 仅打印“docker-container ls -la”输出中的“Names”列

    发出时docker container ls la命令 输出如下所示 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a67f0c2b1769 busybox tail f dev
  • 如何在 Linux 中编写文本模式 GUI? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 当我编写脚本 程序时 我经常想弹出一个简单的文本 gui 来提示输入 我该怎么做 例如 来自 Shel
  • 如何禁用 GNOME 桌面屏幕锁定? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何阻止 GNOME 桌面在几分钟空闲时间后锁定屏幕 我已经尝试过官方手册了在红帽 https access redhat com doc
  • Jenkins中找不到环境变量

    我想在詹金斯中设置很多变量 我试过把它们放进去 bashrc bash profile and profile of the jenkins用户 但 Jenkins 在构建发生时找不到它们 唯一有效的方法是将所有环境变量放入Jenkinsf
  • 大多数 Linux 系统头文件与 C++ 兼容吗?

    大多数 Linux 系统头文件 API C 兼容吗 今天我试图做这样的事情 include
  • 如何在 Ubuntu VirtualBox 中运行 Meteor 应用程序并使用 Windows 主机上的编辑器进行编辑?

    我希望在运行 Ubuntu 的 virtualbox 来宾中运行一个用于开发目的的流星服务器 该项目将位于主机上的一个文件夹内 该文件夹将共享给来宾 该文件夹本身位于 Dropbox 文件夹内 这样我可以在多个虚拟机和工作站之间共享开发 但
  • 从 Python 调用 PARI/GP

    我想打电话PARI GP http pari math u bordeaux fr dochtml gpman html仅从Python计算函数nextprime n 对于不同的n是我定义的 不幸的是我无法得到帕里蟒蛇 http code
  • Linux中的定时器类

    我需要一个计时器来以相对较低的分辨率执行回调 在 Linux 中实现此类 C 计时器类的最佳方法是什么 有我可以使用的库吗 如果您在框架 Glib Qt Wx 内编写 那么您已经拥有一个具有定时回调功能的事件循环 我认为情况并非如此 如果您
  • 在哪里可以找到并安装 pygame 的依赖项?

    我对 Linux 比较陌生 正在尝试安装 python 的 pygame 开发环境 当我运行 setup py 时 它说我需要安装以下依赖项 我找到并安装了其中之一 SDL 然而 其他人则更加难以捉摸 Hunting dependencie
  • fopen 不返回

    我在 C 程序中使用 fopen 以只读模式 r 打开文件 但就我而言 我观察到 fopen 调用没有返回 它不返回 NULL 或有效指针 执行在 fopen 调用时被阻止 文件补丁绝对正确 我已经验证过 并且不存在与权限相关的问题 任何人
  • 所有平台上的java

    如果您想用 java 为 Windows Mac 和 Linux 编写桌面应用程序 那么所有这些代码都相同吗 您只需更改 GUI 即可使 Windows 应用程序更像 Windows 等等 如果不深入细节 它是如何工作的 Java 的卖点之
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • nslookup 报告“无法解析 '(null)': 名称无法解析”,尽管它成功解析了 DNS 名称

    我在 ubuntu 上 并且正在运行 docker 默认桥接网络 我有 Zookeeper kafka 的容器化版本 以及我编写的与 kafka 对话的应用程序 I do a docker exec it
  • PostgreSQL - 致命:用户“myuser”身份验证失败[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我刚刚在我的 Ubuntu Box 中安装了 PostGreSQL 我想做的第一件事就是创建一个数据库 我读了文档 http www postgres
  • 尝试安装 LESS 时出现“请尝试以 root/管理员身份再次运行此命令”错误

    我正在尝试在我的计算机上安装 LESS 并且已经安装了节点 但是 当我输入 node install g less 时 出现以下错误 并且不知道该怎么办 FPaulMAC bin paul npm install g less npm ER
  • 如何在 Linux shell 中将十六进制转换为 ASCII 字符?

    假设我有一个字符串5a 这是 ASCII 字母的十六进制表示Z 我需要找到一个 Linux shell 命令 它将接受一个十六进制字符串并输出该十六进制字符串代表的 ASCII 字符 所以如果我这样做 echo 5a command im

随机推荐

  • 【Android Jetpack】新一代导航管理——Navigation

    目录 前言 使用Navigation 创建导航视图 添加页面 添加导航 添加导航宿主 实现导航 原理解析 NavHostFragment 支持ToolBar 总结 前言 不知道小伙伴们是否注意到 用AS创建一个默认的新项目后 MainAct
  • 软件测试——性能测试

    性能测试基础 为什么要进行性能测试 WHY 最重要 应用程序是否能够很快的响应用户的要求 应用程序是否能处理预期的用户负载并有盈余能力 应用程序是否能处理业务所需要的事务数量 在预期和非预期的用户负载下 应用程序是否稳定 是否能够确保用户在
  • ISAAC WORKSPACE FILE

    Copyright 2019 NVIDIA CORPORATION All rights reserved NVIDIA CORPORATION and its licensors retain all intellectual prope
  • [需求管理-2]:什么是需求以及需求的收集与识别

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 需求管理 2 什么是需求以及需求的收集与识别 文火冰糖的硅基工坊的博客 CSDN博客 目录 第1章 什么是需求识别 第2章 需求的来源 2
  • 算法题 货仓选址(Python)

    题目 在一条数轴上有 N 家商店 它们的坐标分别为 A1 AN 现在需要在数轴上建立一家货仓 每天清晨 从货仓到每家商店都要运送一车商品 为了提高效率 求把货仓建在何处 可以使得货仓到每家商店的距离之和最小 输入格式 第一行输入整数N 第二
  • File类读取文件---本地文件和网络文件

    读取本地文件 File file new File resource audio 5 mp3 InputStream in null try 一次读多个字节 byte tempbytes new byte 100 int byteread
  • Vue项目开发环境安装、项目构建运行、打包部署详解

    Vue项目开发环境安装 项目构建运行 打包部署详解 背景 Vue工程化项目环境配置还是比较麻烦的 本篇来详细的记录下从0开始的安装 构建 打包 运行全过程 整体步骤 第一 安装Node js 这个是前端工程化项目运行的基础环境 第二 安装V
  • Java 网络编程 —— RMI 框架

    概述 RMI 是 Java 提供的一个完善的简单易用的远程方法调用框架 采用客户 服务器通信方式 在服务器上部署了提供各种服务的远程对象 客户端请求访问服务器上远程对象的方法 它要求客户端与服务器端都是 Java 程序 RMI 框架采用代理
  • 【程序员面试系列】算法题练习-汇总(含华为OD机试题目)

    做个4月算法刷题集合 方便复习巩固 欢迎交流探讨 题库源于牛客网 ACM模式 语言 Java Python 题库链接 HJ1 字符串最后一个单词的长度 描述 计算字符串最后一个单词的长度 单词以空格隔开 字符串长度小于5000 注 字符串末
  • 如何修复损坏的word

    Word是许多人在日常工作中经常使用的软件 但有时它可能会出现意外的崩溃或文档损坏 这对于你正在编辑的文件和工作的进展都会产生重大影响 但是 你不需要过于担心 因为还是有一些方法可以通过修复Word文档中的损坏来解决这个问题 那么如何修复损
  • TCP三次握手,两次可以吗?

    这个问题网络上的回答超级多 众说纷纭 以 RFC 793 来回答这个问题可能更加准确 Reliability The TCP must recover from data that is damaged lost duplicated or
  • C语言——qsort()函数用法

    qsort函数简介及用法 一 qsort 函数的简介 二 qsort 函数实例 1 排序整形数组 2 排序double型数组 3 排序字符型数据 4 结构体类型数据排序 三 使用冒泡排序模拟qsort 函数 一 qsort 函数的简介 qs
  • ' requires string as left operand, not int' aria-label='TypeError: 'in ' requires string as left operand, not int'> TypeError: 'in ' requires string as left operand, not int

    报错 Traceback most recent call last File D PyCharm 5 0 3 WorkSpace 2 NLP 9 DL在NLP中的应用 4 VectorizerVisualization py line 4
  • docker和k8s的关系

    docker和k8s的关系 过去十年间 云计算的技术得到了长足的发展 越来越多的人开始了解 云原生 技术 以著名的云原生计算基金会 CNCF Cloud Native Computing Foundation 为首 各大企业和社区都开始发展
  • javascript:;与javascript:void(0)使用介绍

    最近看了好几个关于 a 标签和javascript void 0 的帖子 谨记于此 以资查阅 注 以下代码未经全面测试 但每一种方法可能会出现的情况都基本做了说明 在做页面时 如果想做一个链接点击后不做任何事情 或者响应点击而完成其他事情
  • 一文读懂CAN总线及通信协议

    CAN总线的汽车 CAN概念 CAN是控制器域网 Controller Area Network CAN 的简称 是由研发和生产汽车电子产品著称的德国BOSCH公司开发了的 并最终成为国际标准 ISO11898 是ISO国际标准化的串行通信
  • CTFSHOW web入门——web171

    首先查询有多少列 1 order by 3 然后查询库名 1 union select 1 2 database 查看ctfshow web库的表 1 union select 1 2 table name from information
  • AtomicInteger如何保证线程安全?

    1 AtomicInteger不是final类型 如何保证线程安全 先看一下AtomicInteger类局部源码 关注两个字段 U以及value public class AtomicInteger extends Number imple
  • 使用Kalibr工具线对相机+IMU离线标定

    传感器标定的准确后面做算法才会更准确 所以对Kalibr进行学习 一 Kalibr编译 1 下载kalibr包 GitHub下载地址 2 解压后放到 catkin ws src文件夹下 重新命令文件夹为kalibr 3 安装依赖库 sudo
  • wireshark抓包tcp为何没有四次挥手 而是三次挥手

    在wireshark上抓包 使用telnet直接连接baidu的ip 端口使用www p4 u1804 ping www baidu com PING www a shifen com 183 232 231 174 56 84 bytes