Wireshark抓包:理解TCP三次握手和四次挥手过程

TCP是一种面向连接、端到端可靠的协议,它被设计用于在互联网上传输数据和确保成功传递数据和消息。本节来介绍一下TCP中的三次握手和四次挥手。

文章目录

  • 1 TCP头部格式
  • 2 wireshark抓包分析
    • 2.1 SEQ和ACK
    • 2.2 三次握手
    • 2.3 四次挥手
  • 3 程序

1 TCP头部格式

TCP头部占据TCP段的前20个字节,其中包含端到端TCP套接字的参数和状态。如下图所示:

在这里插入图片描述

下面来逐个解释一下这些字段:

  • 源端口(Source port):16位,用于标识源端口号(发送方的TCP端口)
  • 目标端口(Destination port):16位,用于标识目标端口号(接收方的TCP端口)
  • 序列号(Sequence number):32位,指示在TCP会话期间发送了多少数据。当建立新的TCP连接时,初始序列号是一个随机值。
  • 确认号(``Acknowledgment Number`):32位,由接收方用于请求下一个TCP段。如果设置了ACK控制位,该字段包含段发送方期望接收的下一个序列号的值。一旦建立了连接,这个字段总是被发送。
  • 数据偏移(Data offset):4位,显示头部中32位字的数量,也称为头部长度
  • 保留数据(Reserved data):6位,保留字段,始终设置为零
  • 控制位标志(Control bit Flags):TCP使用9位控制标志来管理特定情况下的数据流,例如建立连接、发送数据和终止连接
    • URG: 与后面的紧急指针字段相关,当设置了此位时,数据应被视为优先于其他数据。
    • ACK: 与ACK相关,确认字段用于指示已成功接收到的数据量,如果设置了此字段,说明发送方期望接收方继续发送下一个TCP段
    • PSH: 推送功能,表示发送方希望接收方立即传输数据,而不必等到整个TCP段的数据都准备好再传输
    • RST: 重置连接,仅在存在无法恢复的错误时使用
    • SYN: 同步序列号,此标志用于设置初始序列号
    • FIN: 完成位用于结束TCP连接,因为TCP是全双工连接,所以双方都必须使用FIN位来结束连接
  • 窗口(Window):16位,指定接收方愿意接收多少字节
  • 校验和(Checksum):16位,用于对头部和数据进行错误检查
  • 紧急指针(Urgent Pointer):如果设置了URG控制标志,该值表示与序列号的偏移,指示最后一个紧急数据字节
  • 选项(Options):可选,长度可为0~320位之间的任意大小

2 wireshark抓包分析

程序流程:服务端监听本地环回地址127.0.0.1的12345端口,客户端则连接这个端口,连接上后服务端发送一个Hello, World!给客户端。

先来了解一下SEQACK的概念:

2.1 SEQ和ACK

客户端和服务器之间建立TCP连接时会进行三次握手。先来理解一下SEQACK的概念:

  1. 序列号(SEQ): 表示发送方发送的数据的起始位置。每发送一个新的数据段,序列号就会递增。
  2. 确认号(ACK): 表示接收方期望下次收到的数据的序列号。当接收方收到数据后,它会发送一个带有确认号的ACK,告诉发送方它已成功接收到了特定序列号之前的所有数据。
  3. 下一个期望的ACK: 当接收方收到一段数据时,ACK表示已成功接收的数据的下一个期望的序列号。因此,下一个期望的ACK号通常是上一个ACK号加上接收到的数据的长度。

2.2 三次握手

1、客户端发送SYN给服务端

在这里插入图片描述

  • 在wireshark中SEQ使用相对0的值,为的是方便分析,所以这里是0

从上图中可以看到SYN标识被设置:

在这里插入图片描述

2.服务端回复带有SEQACKSYN-ACK数据包

在这里插入图片描述

如下图所示:

在这里插入图片描述

3.客户端向服务器发送一个带有ACK号的数据包,确认服务器的序列号

在这里插入图片描述

如下图所示:

在这里插入图片描述

此时双方的SEQ已同步,以上就是三次握手的内容。下面客户端和服务器可以独立地发送和接收数据。

4.服务器向客户端发送“Hello, World!”

在这里插入图片描述

5.客户端向服务器发送一个ACK号,确认服务器的消息

上一个ACK号为1,长度为13,因此ACK号将为13+1=14。

在这里插入图片描述

2.3 四次挥手

接着上面的抓包来看,在程序中,服务端发送完“Hello, World!”后就关闭了客户端的socket。

1.服务端发送FIN给客户端

在这里插入图片描述

如下图所示:

在这里插入图片描述

2.客户端向服务器发送一个ACK号,确认服务器的FIN请求

在这里插入图片描述

如下图所示:

在这里插入图片描述

3.TCP是一种全双工连接,因此,客户端也向服务器发送一条消息以关闭连接

  • 前面的图中最后一行是红色的RST是我不小心直接关闭了程序,下面的图为重新抓的包,注意看最后两条即可

在这里插入图片描述

如下图所示:

在这里插入图片描述

4.服务器向客户端发送一个ACK号,确认客户端的FIN请求

在这里插入图片描述

如下图所示:

在这里插入图片描述

3 程序

本文的代码使用Windows环境下的网络编程库,所以需要在链接库中增加ws2_32

服务端

// Server.c#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>int main() {WSADATA wsaData;SOCKET listenSocket, clientSocket;struct sockaddr_in serverAddr, clientAddr;int addrLen = sizeof(clientAddr);char buffer[1024] = "Hello, World!";// Initialize Winsockif (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {fprintf(stderr, "WSAStartup failed\n");return 1;}// Create a socketif ((listenSocket = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) {fprintf(stderr, "Socket creation failed\n");WSACleanup();return 1;}// Set up server address informationmemset(&serverAddr, 0, sizeof(serverAddr));serverAddr.sin_family = AF_INET;serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");serverAddr.sin_port = htons(12345);// Bind the socketif (bind(listenSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {fprintf(stderr, "Bind failed\n");closesocket(listenSocket);WSACleanup();return 1;}// Listen for incoming connectionsif (listen(listenSocket, SOMAXCONN) == SOCKET_ERROR) {fprintf(stderr, "Listen failed\n");closesocket(listenSocket);WSACleanup();return 1;}printf("Server listening on 127.0.0.1:12345\n");// Accept a connection from a clientif ((clientSocket = accept(listenSocket, (struct sockaddr*)&clientAddr, &addrLen)) == INVALID_SOCKET) {fprintf(stderr, "Accept failed\n");closesocket(listenSocket);WSACleanup();return 1;}// Send data to the clientsend(clientSocket, buffer, strlen(buffer), 0);printf("Data sent to the client\n");// Clean upclosesocket(clientSocket);closesocket(listenSocket);WSACleanup();return 0;
}

客户端

// Client.c#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>int main() {WSADATA wsaData;SOCKET clientSocket;struct sockaddr_in serverAddr;char buffer[1024];// Initialize Winsockif (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {fprintf(stderr, "WSAStartup failed\n");return 1;}// Create a socketif ((clientSocket = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) {fprintf(stderr, "Socket creation failed\n");WSACleanup();return 1;}// Set up server address informationmemset(&serverAddr, 0, sizeof(serverAddr));serverAddr.sin_family = AF_INET;serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");serverAddr.sin_port = htons(12345);// Connect to the serverif (connect(clientSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {fprintf(stderr, "Connection failed\n");closesocket(clientSocket);WSACleanup();return 1;}// Receive data from the serverint bytesRead = recv(clientSocket, buffer, sizeof(buffer), 0);if (bytesRead > 0) {buffer[bytesRead] = '\0'; // Null-terminate the received dataprintf("Received data from server: %s\n", buffer);} else {fprintf(stderr, "Error receiving data\n");}while(1){if(recv(clientSocket, buffer, sizeof(buffer), 0) == 0){break;}}// Clean upclosesocket(clientSocket);WSACleanup();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/152909.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何进行数据结构的设计和实现?

数据结构的设计和实现 数据结构是计算机科学中至关重要的概念之一&#xff0c;它涉及如何组织和存储数据以便有效地进行操作。在软件开发中&#xff0c;数据结构的选择和设计直接影响了程序的性能、可维护性和可扩展性。在这篇文章中&#xff0c;我们将深入探讨如何进行数据结…

【FPGA】Verilog:实现 RS 触发器 | Flip-Flop | 使用 NOR 的 RS 触发器 | 使用 NAND 的 RS 触发器

目录 0x00 RS 触发器&#xff08;RS Flip-Flop&#xff09; 0x01 实现 RS 触发器 0x02 使用 NOR 的 RS 触发器 0x03 使用 NAND 的 RS 触发器 0x00 RS 触发器&#xff08;RS Flip-Flop&#xff09; 触发器&#xff08;Flip-Flop&#xff09;是一种带有时钟的二进制存储设备…

C/C++多级指针与多维数组

使用指针访问数组 指针类型的加减运算可以使指针内保存的首地址移动。 指针类型加n后。首地址向后移动 n * 步长 字节。 指针类型减n后。首地址向前移动 n * 步长 字节。 步长为指针所指向的类型所占空间大小。 例如&#xff1a; int *p (int *)100;p 1&#xff0c;结果为首…

Vue 2.0的源码构建

Vue.js 源码是基于 Rollup 构建的&#xff0c;它的构建相关配置都在 scripts 目录下。 1. 构建脚本 通常一个基于 NPM 托管的项目都会有一个 package.json 文件&#xff0c;它是对项目的描述文件&#xff0c;它的内容实际上是一个标准的 JSON 对象。 我们通常会配置 script …

Autox.js和Auto.js4.1.1手机编辑器不好用我自己写了一个编辑器

功能有 撤销 重做 格式化 跳转关键词 下面展示一些 内联代码片。 "ui"; ui.layout( <drawer id"drawer"><vertical><appbar><toolbar id"toolbar"title""h"20"/></appbar><horizontal b…

get_cli_args函数

CLI是"Command Line Interface"的缩写&#xff0c;中文意为"命令行界面"。它是一种与计算机进行交互的方式&#xff0c;用户通过键盘输入文本命令来执行特定的任务&#xff0c;而不是通过图形用户界面&#xff08;GUI&#xff09;进行操作。在命令行界面中…

P1734 最大约数和

P1734 最大约数和 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 预处理出小于等于S的数的约数和&#xff0c;将一个数的值作为体积&#xff0c;这个数的约数和作为价值&#xff0c;之后01背包模板。 void solve() {int n; cin>>n;vector<array<int,2>> a…

Linux环境搭建(tomcat,jdk,mysql下载)

是否具备环境&#xff08;前端node&#xff0c;后端环境jdk&#xff09;安装jdk,配置环境变量 JDK下载 - 编程宝库 (codebaoku.com) 进入opt目录 把下好的安装包拖到我们的工具中 把解压包解压 解压完成&#xff0c;可以删除解压包 复制解压文件的目录&#xff0c;配置环境变量…

【opencv】debug报错HEAP CORRUPTION DETECTED

运行至第一句涉及矩阵运算的代码&#xff08;如cv::multiply&#xff09;时报错 HEAP CORRUPTION DETECTED: after Normal block (#45034) at 0x000001BDC586F0E0. CRT detected that the application wrote to memory after end of heap buffer.release下不会报错&#xff0…

vue3使用西瓜播放器播放flv、hls、mp4视频

vue3使用西瓜播放器播放flv、hls、mp4视频 安装相关的插件 npm install xgplayer npminstall xgplayer-flv npm install xgplayer-hls npm install xgplayer-mp4 组件封装 <template><div :id"${playerId}" /> </template> <script setup la…

PDF控件Spire.PDF for .NET【转换】演示:自定义宽度、高度将 PDF 转 SVG

我们在上一篇文章中演示了如何将 PDF 页面转换为 SVG 文件格式。本指南向您展示如何使用最新版本的 Spire.PDF 以及 C# 和 VB.NET 指定输出文件的宽度和高度。 Spire.Doc 是一款专门对 Word 文档进行操作的 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻…

MyBatis 快速入门

MyBatis 快速入门 前言什么是 MyBatis简介核心特性使用示例配置文件Mapper 接口SQL 映射文件使用 MyBatis 如果大家对以上的导读很懵怎么办&#xff01;没关系 往下阅读&#xff01; 1. MyBatis 介绍1.1. 什么是MyBatis1.2. 持久层1.3. 框架1.4. JDBC 弊端1.5.…

如何解决网站被攻击的问题:企业网络攻防的关键路径

在当今数字化时代&#xff0c;企业面临着不断升级的网络威胁&#xff0c;网站遭受攻击的风险也与日俱增。解决网站被攻击的问题对企业发展至关重要&#xff0c;不仅关系到企业的信息安全&#xff0c;也直接影响到企业的声誉和利益。从企业发展的角度出发&#xff0c;我们将探讨…

科技云报道:全球勒索攻击创历史新高,如何建立网络安全的防线?

科技云报道原创。 最简单的方式&#xff0c;往往是最有效的&#xff0c;勒索软件攻击就属于这类。 近两年&#xff0c;随着人类社会加速向数字世界进化&#xff0c;勒索软件攻击成为网络安全最为严重的威胁之一。今年以来&#xff0c;勒索软件攻击在全球范围内呈现快速上升态…

开源和闭源的优劣势比较

开源与闭源软件之争一直是技术领域一个备受关注的话题&#xff0c;而在近期特斯拉CEO马斯克的表态中&#xff0c;关于开源的讨论更是引发了广泛的关注。以下是一些关于开源和闭源的优劣势以及对未来大模型发展的一些见解&#xff1a; 开源软件的优势&#xff1a; 创新与合作&a…

HDCTF2023 - Reverse方向全WP

文章目录 [HDCTF 2023]easy_re[HDCTF 2023]easy_asm[HDCTF 2023]fake_game[HDCTF 2023]enc[HDCTF 2023]double_code[HDCTF 2023]买了些什么呢[HDCTF2023]basketball [HDCTF 2023]easy_re UPX壳&#xff0c;脱壳 一个base64编码。 [HDCTF 2023]easy_asm ida打开后可以看到xor 10…

【FPGA】IP核

一.IP核是什么 IP&#xff1a;知识产权&#xff0c;半导体产业中&#xff1a;在ASIC和FPGA中定义为预先设计好的电路功能模块。 在使用的时候其他用户可以直接调用IP核心。 二. 为什么要是有IP核 提高开发效率&#xff0c;减小设计和调试的时间&#xff0c;加速开发进程&am…

go 判断两棵树内容是否一致

goroutine http://127.0.0.1:3999/concurrency/8 question 使用 go 判断 两个 树 存放的 序列 是否 相同, 如果 相同 他们 被称为 equivalent_tree tree struct type Tree struct {Left *TreeValue intRight *Tree }由于 递归的 写法 比较简单, 此处 使用循环的 形式 来实…

Rabin加解密算法(python3)

Rabin加解密算法 详细代码如下&#xff1a; # 空空 # dahouzi.cn import random from sympy import isprimedef decrypt_rabin(c, p, q):"""解密 Rabin 密文Args:c (int): 密文p (int): 素数 pq (int): 素数 qReturns:tuple: 解密结果 M1, M2, M3, M4"&q…

数据库管理工具,你可以用Navicat,但我选DBeaver!

大家好&#xff0c;我是豆小匠。数据库GUI工具哪家强&#xff0c;众人遥指Navicat。 可是Navicat老贵了。 如果公司有正版授权的还好&#xff0c;如果没有正版授权&#xff0c;还不给你用盗版&#xff0c;那才叫绝绝子。 好了&#xff0c;主角登场&#xff0c;DBeaver&#x…