wireshark抓包图解 TCP三次握手/四次挥手详解

2023-10-26

一. TCP/IP协议族

TCP/IP是一个协议族,通常分不同层次进行开发,每个层次负责不同的通信功能。
包含以下四个层次:

1. 链路层,
   也称作数据链路层或者网络接口层,
   通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。
   它们一起处理与电缆(或其他任何传输媒介)的物理接口细节。

2. 网络层,
   也称作互联网层,处理分组在网络中的活动,例如分组的选路。
   网络层协议包括IP协议(网际协议)、ICMP协议(Internet互联网控制报文协议),
   以及IGMP协议(Internet组管理协议)。

3. 运输层
   主要为两台主机上的应用程序提供端到端的通信。
   在TCP/IP协议族中,有两个互不相同的传输协议:TCP(传输控制协议)和UDP(用户数据报协议)。
   TCP为两台主机提供高可靠性的数据通信。
         他所作的工作包括把应用程序交给它的数据分成合适的小块交给下面的网络层,确认接收到的分组,
         设置发送最后确认分组的超时时钟等。由于运输层提供了高可靠性的端到端通信,因此应用层可以忽略所有这些细节。
         而另一方面,
   UDP则为应用层提供一种非常简单的服务。它只是把称作数据报的分组从一台主机发送到另一台主机,
         但并不保证该数据报能到达另一端。任何必须的可靠性必须由应用层来提供。

4. 应用层
   负责处理特定的应用程序细节。
   包括Telnet(远程登录)、
FTP(文件传输协议)、SMTP(简单邮件传送协议)以及SNMP(简单网络管理协议)等。

wireshark抓到的包与对应的协议层如下图所示:

1. Frame:           物理层的数据帧概况

2. Ethernet II:     数据链路层以太网帧头部信息

3. Internet Protocol Version 4:        互联网层IP包头部信息

4. Transmission Control Protocol:   传输层的数据段头部信息,此处是TCP

5. Hypertext Transfer Protocol:        应用层的信息,此处是HTTP协议


二. TCP协议

TCP是一种面向连接(连接导向)的、可靠的基于字节流的传输层通信协议。
TCP将用户数据打包成报文段,它发送后启动一个定时器,另一端收到的数据进行确认、对失序的数据重新排序、丢弃重复数据。

TCP的特点有:

1. TCP是面向连接的运输层协议

2. 每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的

3. TCP提供可靠交付的服务

4. TCP提供全双工通信。数据在两个方向上独立的进行传输。
   因此,连接的每一端必须保持每个方向上的传输数据序号。

5. 面向字节流。
  面向字节流的含义:虽然应用程序和TCP交互是一次一个数据块,但TCP把应用程序交下来的数据看作是一连串的无结构的字节流


TCP报文首部,如下图所示:

1. 源端口号:      数据发起者的端口号,16bit

2. 目的端口号:   数据接收者的端口号,16bit

3. 序号:             32bit的序列号,由发送方使用

4. 确认序号:      32bit的确认号,
                          是接收数据方期望收到发送方的下一个报文段的序号,
                          因此确认序号应当是上次已成功收到数据字节序号加1。

5. 首部长度:      首部中32bit字的数目,可表示15*32bit=60字节的首部。
                          一般首部长度为20字节。

6. 保留:             6bit, 均为0

7. 紧急URG:         当URG=1时,表示报文段中有紧急数据,应尽快传送。

8. 确认比特ACK:   ACK = 1时代表这是一个确认的TCP包,取值0则不是确认包。

9. 推送比特PSH:   当发送端PSH=1时,接收端尽快的交付给应用进程。

10. 复位比特(RST):当RST=1时,表明TCP连接中出现严重差错,必须释放连接,再重新建立连接。

11. 同步比特SYN:   在建立连接是用来同步序号。
                                SYN=1, ACK=0表示一个连接请求报文段。
                                SYN=1,ACK=1表示同意建立连接。

12. 终止比特FIN:     FIN=1时,表明此报文段的发送端的数据已经发送完毕,并要求释放传输连接。

13. 窗口:                 用来控制对方发送的数据量,通知发放已确定的发送窗口上限。

14. 检验和:              该字段检验的范围包括首部和数据这两部分。由发端计算和存储,并由收端进行验证。

15. 紧急指针:          紧急指针在URG=1时才有效,它指出本报文段中的紧急数据的字节数。

16. 选项:                 长度可变,最长可达40字节


wireshark捕获到的TCP包中的每个字段如下图所示:


三. TCP三次握手

TCP建立连接时,会有三次握手过程,如下图所示,
wireshark截获到了三次握手的三个数据包。
第四个包才是http的,说明http的确是使用TCP建立连接的。



下面来逐步分析三次握手过程:

第一次握手:
客户端向服务器发送连接请求包,标志位SYN(同步序号)置为1,序号为X=0


第二次握手:
服务器收到客户端发过来报文,由SYN=1知道客户端要求建立联机。
向客户端发送一个SYN和ACK都置为1的TCP报文,设置初始序号Y=0,
将确认序号(Acknowledgement Number)设置为客户的序列号加1,即
   X+1 = 0+1=1, 
如下图:

第三次握手:
客户端收到服务器发来的包后检查确认序号(Acknowledgement Number)是否正确,
即第一次发送的序号加1(X+1=1)。以及标志位ACK是否为1。

若正确,服务器再次发送确认包,ACK标志位为1,SYN标志位为0。
确认序号(Acknowledgement Number)=Y+1=0+1=1,发送序号为X+1=1。
客户端收到后确认序号值与ACK=1则连接建立成功,可以传送数据了。


四. TCP四次挥手

TCP断开连接时,会有四次挥手过程,
如下图所示,wireshark截获到了四次挥手的四个数据包。


下面来逐步分析四次挥手过程:

第一次挥手:
客户端给服务器发送TCP包,用来关闭客户端到服务器的数据传送。
将标志位FIN和ACK置为1,序号为X=1,确认序号为Z=1。

服务器收到FIN后,发回一个ACK(标志位ACK=1),确认序号为收到的序号加1,即X=X+1=2。
序号为收到的确认序号=Z。


服务器关闭与客户端的连接,发送一个FIN。
标志位FIN和ACK置为1,序号为Y=1,确认序号为X=2。

客户端收到服务器发送的FIN之后,发回ACK确认(标志位ACK=1),确认序号为收到的序号加1,即Y+1=2。
序号为收到的确认序号X=2。

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

wireshark抓包图解 TCP三次握手/四次挥手详解 的相关文章

  • 出现错误 /usr/bin/env: 节点:权限被拒绝

    我已经在我的服务器 Centos 上完成了 ODOO v9 安装 一切都已安装成功 登录页面也可以正常工作 但登录后我收到一个包含以下错误的页面 usr bin env node Permission Denied 我尝试更改权限 但我的问
  • 什么是 Linux 上易于使用的 C++ 分析器? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我需要分析一些在 Linux 上运行 C 的代码 你们能推荐一些分析器吗 使用 gprof 只需编译 pg标志 我认为 但不确定 你必须关
  • 如何在 linux bash shell 中对字符串数组进行排序? [复制]

    这个问题在这里已经有答案了 例如 数组是 link2 pathname link1 pathname link3 pathname 我怎样才能得到像下面这样的数组 link1 pathname link2 pathname link3 pa
  • time_t 最终的 typedef 是什么?

    我搜索了我的 Linux 机器并看到了这个 typedef typedef time t time t 但我找不到 time t定义 The 文章对此进行了一些阐述 底线是类型time tC 规范中不保证 The time tdatatyp
  • 减少内存分配GCC命令

    今天 在我的计算机科学课上 我被告知我可以调整程序在编译期间可以分配的内存量 使用 GCC Linux 该数量默认设置为最佳模式 这意味着尽可能多 在调试应用程序期间 我可以从这个编译器功能中受益匪浅 因为我需要正确处理分配错误 这在我的
  • 为什么 Linux TAP 设备不处理 ARP 或 ICMPv6 数据包

    我正在使用以下命令打开 TAP 设备 p gt fd open dev net tun O RDWR skipping error handling code ifr ifr flags IFF TAP IFF ONE QUEUE IFF
  • 编写 AMD64 SysV 程序集时使用哪些寄存器作为临时寄存器?

    我正在使用实现一个功能cpuid根据 AMD64 SysV ABI 进行组装 我需要在函数本身中使用 2 个临时寄存器 第一个用于累积返回值 第二个用作计数器 我的功能目前如下所示 zero argument function some c
  • 如何编写写入 /var/log/myapp 目录的 C/C++ 应用程序?

    背景 在 Linux 系统上 应用程序日志 https help ubuntu com community LinuxLogFiles Application Logs存在于子目录中 var log 其所有者为root root并且在我的系
  • 如何在Linux中为特定程序设置进程ID

    我想知道是否有某种方法可以在运行某些应用程序之前强制使用 Linux 的某些特定进程 ID 我需要提前知道进程ID 实际上 有一种方法可以做到这一点 自内核 3 3 设置了 CONFIG CHECKPOINT RESTORE 在大多数发行版
  • 窗口放置:适用于 Linux (KDE) 的类似 WinSplit Revolution 的应用程序? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 适用于 Linux KDE 的类似 WinSplit Revolution 的应用程序是什么 或者也许 KDE 中有一个我缺少的功能 平铺通常是窗口管
  • 哪个信号被传递到信号处理程序中死锁的进程

    我有一个来自调用信号处理程序后死锁的进程的核心转储 如何确定传送了哪个信号以及是谁发送的 GDB 为接收信号的线程生成的回溯如下 信号处理程序在第 15 帧中被调用 gdb bt 0 0x00007fa9c204654b in sys fu
  • 获取后台进程的退出代码

    我有一个从我的主 bourne shell 脚本中调用的命令 CMD 该命令需要很长时间 我想修改脚本如下 作为后台进程并行运行命令 CMD CMD 在主脚本中 有一个循环每隔几秒监视生成的命令 该循环还向标准输出回显一些消息 指示脚本的进
  • c 中的分叉和管道过程

    所以我有一个项目要做 但我完全被难住了 我花了十个小时却一无所获 我并不是特别想要答案的代码 但是一些伪代码和正确方向的良好提示将有帮助 它分叉多个进程 k 命令行参数 通过管道连接 每个进程都连接到下一个进程 最后一个进程连接到第一个进程
  • 在大型文本文件中查找重复记录

    我在一台 Linux 机器 Redhat 上 并且有一个 11GB 的文本文件 文本文件中的每一行包含单个记录的数据 并且该行的前 n 个字符包含该记录的唯一标识符 该文件包含略多于 2700 万条记录 我需要验证文件中不存在具有相同唯一标
  • PHP exec - 检查是否启用或禁用

    有没有办法检查 php 脚本是否exec 在服务器上启用还是禁用 这将检查该功能是否确实有效 权限 权利等 if exec echo EXEC EXEC echo exec works
  • POSIX:FreeBSD 与 Linux 中的管道系统调用

    在 Linux 2 6 35 22 generic 中 man pipe指出 pipeline 创建一个管道 一个可用于进程间通信的单向数据通道 在 FreeBSD 6 3 RELEASE p5 中 man pipe指出 pipeline
  • 将尾部输出重定向到程序中

    我想使用 tail 作为标准输入向程序发送文本文件中的最新行 首先 我向程序回显一些每次都相同的输入 然后从输入文件发送尾部输入 该输入文件应首先通过 sed 处理 以下是我期望工作的命令行 但是当程序运行时 它只接收回显输入 而不接收尾部
  • 查找系统日志最大消息长度

    大多数 Unix 程序员都会习惯由syslog h 并且许多实现 例如 glibc 对发送给它的 syslog 消息的大小没有真正的限制 但通常对侦听的应用程序有限制 dev log 我想知道是否有人知道如何找到系统日志的最大消息大小 或者
  • /etc/php5/conf.d 文件夹中的 .ini 文件有什么用?

    我知道 ini 文件位于 etc php5 cli与 PHP 的 CLI 使用有关 文件位于 etc php5 fpm是关于 PHP 的 FastCGI FPM 方面 但是位于以下位置的 ini 文件又如何呢 etc php5 conf d
  • 获取当前时间(以小时和分钟为单位)

    我正在尝试从系统收集信息 并且需要获取当前时间 以小时和分钟为单位 目前我有 date awk print 4 输出如下 16 18 54 怎样才能把秒数去掉呢 提供格式字符串 date H M Running man date将给出所有格

随机推荐

  • C++:std::thread:线程用法

    1 std thread的基本用法 最简单的 std thread用法如下 调用 thread将立即同时开始执行这个新建立的线程 新线程的任务执行完毕之后 main 的主线程也会继续执行 include
  • Java中自定义注解的使用

    Java中自定义注解的使用 一般来说 市面上有一些的框架 企业都不会直接拿过来就用 通过会做二次开发或封装 为了更加适配自己的开发规范和业务 那么在封装或适配的过程中 自定义注解就起着比较重要的作用 1 注解定义 原理及作用 1 1 什么是
  • linux qt creator 无法调试

    ubuntu linux操作系统 现象是qt creator 一启动调试 就提示 you can t do that without a process to debug 网上的解答大多是把程序设置成debug模式 但是不生效 下面 介绍解
  • 智能情绪分析技术_视频安防监控系统智能分析技术应用

    本文转自网络 一 概述 在视频监控飞速发展的今天 海量视频画面已经大大超过了人力有效处理的范围 而智能视频分析技术极大地发挥与拓展了视频监控系统的作用与能力 使监控系统具有更高的智能化 大幅度降低资源与人员配置 全面提升安全防范工作的效率
  • java常用类-Math类

    Math类是一个数学工具类方法 里面有很多静态工具方法 方便开发者直接调用 下面列举几个常见的方法 其它方法可查看API文档 public class testMath public static void main String args
  • js中用ajax实现表单提交,Thinkjs使用ajax实现表单提交

    前端代码 1 form submit evt gt evt preventDefault 阻止表单默认提交 ajax url user personal update type POST dataType json data form se
  • 理解FPGA中的亚稳态

    一 前言 大家应该经常能听说到亚稳态这个词 亚稳态主要是指触发器的输出在一段时间内不能达到一个确定的状态 过了这段时间触发器的输出随机选择输出0 1 这是我们在设计时需要避免的 本文主要讲述了FPGA中的亚稳态问题 可以帮助大家更好地理解亚
  • VmWare虚拟机设置ubuntu和windows之间的共享文件夹

    一般在进行编程作业的时候 我们会采用 开发在Windows中编辑源代码 在linux中编译 执行源代码 这往往需要需要将在Windows下编辑好的源代码上传到linux系统种进行编译 怎么来进行上传呢 其实通过VMWare的共享文件夹就可以
  • centos系统出现grub问题修复

    问题 解决方式 1 查看系统分区情况 ls 查看分区 ls hd0 msdos1 查看分区内容 找到存在vmlinuz文件和initramfs文件的分区 操作3步骤 3 grub gt set root hd0 msdos1 将存在vmli
  • echarts(横向柱状图和grid)

    场景 最近在做知识图谱的时候 右侧弹窗需要有数据统计功能 大概 如下图 当时想到的是横向柱状图来实现 目前的效果与UI的不同是后面统计的数量显示的位置 后来经其他前端同事启发 他是用进度条来实现的 发现自己的思想有些死板了 原来进度条实现也
  • VScode中设置vue代码的自动提示&主题

    VScode中设置vue代码的自动提示 下载VueHelper即可 主题推荐 Solarized Light
  • react 阻止默认行为

    react在做某一些弹层的时候 会用到原生的监听点击事件document addEventListener click 这个时候会用到阻止默认事件发生 代码如下 e nativeEvent stopImmediatePropagation
  • 2023linux面试问答_Linux基础

    1 什么是Linux Linux是一套免费使用和自由传播的类Unix操作系统 是一个基于POSIX和Unix 的多用户 多任务 支持多线程和多CPU的操作系统 它能运行主要的Unix工 具软件 应用程序和网络协议 它支持32位和64位硬件
  • 深入随机数Random

    以下内容来自 http www cnblogs com rupeng p 3723018 html 今天再园子上看到了杨老师的一片blog 受益了 原来随机数还有这么多道道 要走的路还远啊 以下为个人收录 几乎所有编程语言中都提供了 生成一
  • windows2008文件服务器端口,windows server 2008 文件服务器不定期出现大量CLOSE_WAIT状态的连接,必须重启服务器,客户端才能访问共享。...

    故障现象如题 用netstat ano p tcp 可以看到大量的连接 都处于close wait状态 然后客户端访问共享就很卡 EXCEL也卡死 服务器重启恢复正常 但是过一段时间又出现这个问题 不知道有谁知道这个问题可能出在哪里 服务器
  • apt-cache - 搜索软件包

    Apt cache是一个命令行工具 可以从本地 APT 文件中查询和显示有关包的可用信息 包信息包括包名称 描述 版本 依赖项 repo 和维护者 存储来自 Debian 镜像的副本的本地 apt 文件位于 var lib apt list
  • day03-switch&循环语句

    1 流程控制语句 应用 在一个程序执行的过程中 各条语句的执行顺序对程序的结果是有直接影响的 所以 我们必须清楚每条语句的执行流程 而且 很多时候要通过控制语句的执行顺序来实现我们想要的功能 1 1 流程控制语句分类 顺序结构 分支结构 i
  • 计算机网络第五章——传输层(下)

    安得广厦千万间 大庇天下寒士俱欢颜 文章目录 按序的不丢失的 这个校验也是二进制求反码来判断有没有发送错误 TCP传输的时候就是以一个字节为单位 所以就会把一个字节编一个序号 对于一个文件第一个需要是多少是可以随机的 发送的时候是以报文段为
  • 4元数(转)

    这是国内找不到的超好文章 为什么大陆的4元数文章很垃圾呢 翻译中 奉献给大家 70秒即懂 能使用 用四元数 4元数 阔特尼恩 Quaternion旋转 C 中田 亨 独立行政法人 产业技术综合研究所 数字人类研究中心 研究员 博士 工学 2
  • wireshark抓包图解 TCP三次握手/四次挥手详解

    一 TCP IP协议族 TCP IP是一个协议族 通常分不同层次进行开发 每个层次负责不同的通信功能 包含以下四个层次 1 链路层 也称作数据链路层或者网络接口层 通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡 它们一起处理与电