使用wireshark抓取Tcp三次握手

article/2025/10/1 17:53:38

文章目录

  • wireshark的下载安装
  • TCP协议段格式简单介绍
  • 确认应答机制介绍
  • 使用wireshark抓取TCP的三次握手

wireshark的下载安装

软件的下载可以直接去官网下载 wireshark,选择自己电脑适合的版本就行。
在这里插入图片描述
但是不咋推荐,原因是国外网站访问速度太慢,写博文的时候我去官方下载安装包还下不下来,之后去搜狗下载了一个安装包,进行安装,点击安装包一路next进行安装,其中安装过程中需要注意的我会单独说明下。
阅读许可:
在这里插入图片描述
勾选下面几个选项,有些默认没有勾选:
在这里插入图片描述

TCP协议段格式简单介绍

TCP,即Transmission Control Protocol,传输控制协议。人如其名,要对数据的传输进行一个详细的控制。
TCP协议的特点

  • 有连接

  • 面向字节流(数据传输工程中是以一个一个字节为基本单位的)

  • 可靠传输(发送方向接收方发送数据后,发送方给以回应,告诉接收方已经收到数据了)

  • 全双工(收发双发可以同时发数据,也可已接收数据)
    TCP协议段格式
    在这里插入图片描述

  • 源/目的端口号:表示数据从一台主机的哪个程序来,要到另一台主机的哪一个程序去。

  • 32位序号,对要传输的数据进行编号,每一个字节对应一个序号,依次进行累加

  • 32位确认序号,接收方收到数据后,返回一个确认应答数据报,里面就包含一个确认序号,表示确认序号之前的数据接收方都收到了,TCP数据报里面的序号和确认序号是保证TCP可靠传输的一种重要方式。

  • 4位首部长度,单位是4个字节,那么TCP报头的最大数据大小就是60个字节。

  • 保留位留作他用,用于之后TCP协议的迭代更新。

  • 6位标志位:
    URG:紧急指针是否有效
    ACK:带有ACK标识的数据报称为确认报文段
    PSH:提示接收端应用程序立刻从TCP缓冲区把数据读走
    RST:对方要求重新建立连接;我们把携带RST标识的称为复位报文段
    SYN:请求建立连接;我们把携带SYN标识的报文称为同步报文段
    FIN:通知对方,本端要关闭了,我们称携带FIN标识的为结束报文段
    上面六个标志位就是TCP报头里面的六个比特位,默认情况下是0,当被使用的时候就变为1了。
    其他字段本篇博客不做介绍。

确认应答机制介绍

TCP协议的核心特性就是可靠性,而保证可靠性的核心机制就是确认应答机制,TCP在保证可靠和效率的时候引用了很多机制来实现,有确认应答,超时重传,连接管理(三次握手,四次挥手),滑动窗口(保证效率)等。下面就介绍一下确认应答有助于理解连接管理。**由于网络传输环境复杂多样,导致数据传输的不可靠性,如后发先至就是一种情况,**如下图:我分别给我的朋友小明发送了,两个数据报,先后到达表达的意思完全不一样,
在这里插入图片描述
本来小明想表达的是,我请他喝奶茶ok,做作业滚,但由于网络环境的复杂多样,导致它发送给我的数据报先发后至,造成了,我请他喝奶茶滚,做作业ok,这样发送双方要表达的意思就全变了,**因此我们可以在发送数据报的时候,就给每个数据报的每一个字节编一个号,这个编号叫序号,接收方收到数据后发送确认报文段,确认报文段里面也有一个针对发送方发送序号的确认序号,通过这确认序号对收到的数据进行确认,这个确认序号也是TCP报头里面的一个字段,**这样就可以避免这种混乱的情况了。
上面我已经介绍了tcp传输的数据的基本单位是字节,而不是像上面我随意画的那样传输一条一条的数据。tcp针对每一个字节的数据进行编号。编号的最大范围是32个比特位表示的最大范围,如下面的图可以简单看一下
在这里插入图片描述
上面的数据报的编号范围是从1开始编号,但也不一定,也可以以其他数字进行初始编号。TCP的确认应答机制大致如下图:
在这里插入图片描述
经过上面的简单了解了TCP的相关知识后我们就可以进行抓包了。

使用wireshark抓取TCP的三次握手

首先三次握手的流程我们应该清楚,大致如下图。
在这里插入图片描述

点击WLAN选择我们的的网卡,我们的主机就是通过这一块网卡和其他主机进行数据交互的,抓取通过这一块网卡的数据进行TCP三次握手分析。
在这里插入图片描述
我以抓取LeetCode网站为例,首先我在dos窗口,通过ping命令,来获取LeetCode网站的ip地址之后用于在wireshark里面进行数据的过滤分析。
在这里插入图片描述
打开wireshark点击那个蓝色的鲨鱼鳍,开始捕获新的分组并清空之前的分组,开始博捕获
在这里插入图片描述
之后快速在浏览器中访问LeetCode网站,之后在wireshark中停止捕获分组进行数据分析,停止捕获分组就点击开始捕获分组的右边的那个正方形,未停止捕获前是红色的,停止捕获后就是灰色的了。之后进行数据过滤,因为我们这台主机同一时刻可能在和不同主机的许多进程间进行数据传输也会和相同主机的不同进程进行数据交互,过滤数据后有助于数据的分析。
捕获暂停后,我在wireshark上面的过滤框里面输入ip.addr == 203.107.53.81 and tcp进行过滤,过滤出tcp协议,ip地址和203.107.53.81相关的数据包,过滤如图。
在这里插入图片描述
从图中看到,TCP好像建立了好几次握手,但是那是我的主机的不同进程和LeetCode网站的服务器端口号为443的进程进行通信,我只选取其中一个进程进行分析就行。选取端口号为51175的进程进行分析。TCP三次握手的一个重要目的就是确定通信双发的收发能力良好和进行一些参数的约定,如初始序列号的确定,序列号和确认序列号的讲解就在TCP协议段格式介绍那里。
第一次握手:Seq=0,初始序号为0,也就是要传输的数据第一个字节的编号为0,其实不是为0,只是wireshark这个软件帮我们设置的相对序列号,客户端首先向服务器发送一个SYN报文段请求建立连接,这时这个字段的值就变成了1,之后我们也可以在wireshark中观察下。对于传输的数据,数据报头里面的字段SYN,ACK和值也可以在wireshark里面看到,如果相应的字段后面标识了Set表示设置的该值,否则该值没有设置。如看第一次握手的SYN值,点击tcp协议,再点击Flags就可以查看了。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

第二次握手:服务器向客户端发送SYN(同步报文段),ACK(确认报文段)并且值都被激活为1,同步报文段表示服务器要和客户端建立连接,确认报文段,表示服务器收到客户端的请求,告诉客户端。这样第二次握手的初始序号Seq=0也是一个相对序号,服务器返回一个确认序列号Ack=0+1,表示客户端发来数据编号为0的数据服务器已经收到了,并且向客户端要下一个数据包.wireshark截图分析如下:
在这里插入图片描述

第三次握手,客户端返回一个ACK确认报文段 ,表示确认收到客户端发来的数据,里面的确认序Ack=0+1的值也变成了1,表示收到服务器发来的序号为0的数据,wireshark数据分析图如下:在这里插入图片描述
(说明上面TCP建立连接的图里面的ack和我这里说的Ack其实都是指一个东西,就是确认序号,Ack这是wireshark里面的东西,seq,Seq就是初始的数据序号,只是表示不同而已,不同的资料,文章说法不一样)
至此TCP的三次握手完成,可以进行后续的数据传输了。使用抓包工具抓取tcp的三次握手,可以加深我们对协议格式的理解,和tcp的一些机制的理解。


http://chatgpt.dhexx.cn/article/VTmWBlgm.shtml

相关文章

TCP的三次握手、四次挥手

一、TCP的三次握手 第一次握手:你能和我建立连接吗,可以接受到我的数据吗。 SYN 1 ,seq x 第二次握手:可以建立连接,我接受到你的请求了,能接受到我的数据吗,你的数据是这个吗 SYN 1 &#…

TCP三次握手原理

在众多的网络协议中,TCP协议占据着举足轻重的地位,你知道什么是TCP协议吗? 一、TCP协议 TCP(Transmission Control Protoco)协议属于计算机网络体系中的运输层。运输层的任务是负责向主机中应用层进程之间的通信提供通用的数据传输服务。所以…

TCP三次握手及四次挥手过程中的异常处理

1. 消息丢失的情况: 总的原则: ACK不会重传,SYN和FIN报文段有最大重传次数。无论是SYN还是FIN,达到最大重传次数后对端若仍无响应则直接进入CLOSED状态。 1.1 三次握手过程的消息丢失: 正常的三次握手的流程&#x…

HTTPS 中 TLS 和 TCP 能同时握手吗?

HTTPS 中 TLS 和 TCP 能同时握手吗? 大家好,我是小林。 有位读者在面试的时候,碰到这么个问题: 面试官跟他说 HTTPS 中的 TLS 握手过程可以同时进行三次握手,然后读者之前看我的文章是说「先进行 TCP 三次握手&#…

TCP优化一:TCP 三次握手的优化

TCP 三次握手的性能提升 TCP 是面向连接的、可靠的、双向传输的传输层通信协议,所以在传输数据之前需要经过三次握手才能建立连接。 那么,三次握手的过程在一个 HTTP 请求的平均时间占比 10% 以上,在网络状态不佳、高并发或者遭遇 SYN 攻击…

TCP握手过程和挥手过程

TCP报文首部 源端口和目的端口,各占2个字节,分别写入源端口和目的端口;序号,占4个字节,TCP连接中传送的字节流中的每个字节都按顺序编号。例如,一段报文的序号字段值是 301 ,而携带的数据共有1…

TCP三次握手

TCP协议是传输层协议,是一种面向连接的传输控制协议,可以控制流量的传输。是一种可靠的传输,能够保证数据的完整性,有效性和有序性。 1.TCP建立连接(三次握手) 第一次握手:PC1发送SYN请求&…

TCP握手与挥手详解(附有图)

为什么不是4次握手 首先我们知道TCP是3次握手与4次挥手,为什么不是4次握手呢,因为其中握手请求同步过程中并不需要数据传输因此将两次合并为一次了。 我们需要掌握哪些标志量 SYN:请求同步标志,为1的时候为有效 ACK&#xff1…

为什么TCP需要握手

一、TCP握手流程 二、为什么不是4次握手 TCP的每次请求都是成对的,原则上应该是四次 【Client to Server】第一次SYN,seqx【Server to Client】第二次ACK,seqy,ackx1(没有携带数据的ACK不消耗序列号)【Se…

tcp_tw_recycle引起的TCP握手失败

背景 测试环境的一台Nginx服务器,最近一直被前端同事吐槽网络有问题,经常出现访问HTTP请求时超时,哪怕是静态文件也经常超时。 刚开始以为是公司网络抽风了,也就没放在心上,但持续了一个星期,而且复现率很…

TCP握手过程(正解版)

参考文章 Why do we need a 3-way handshake? Why not just 2-way https://blog.csdn.net/qq_36903042/article/details/102656641 https://blog.csdn.net/qq_36903042/article/details/102513465 大部分网络博客的错误解读 首先需要声明的是, 百度搜索到的大…

网络协议 (五) TCP握手建立连接

一、握手策略 为了可以准确的将数据准确无误地送达目标主机,所有基于 TCP 实现的协议,都需要先完成 TCP 协议的三次握手策略。 1. 首先我们需要了解一下图中提到的几个标志符: 1.序号seq seq 是TCP通信过程中,某一个传输方向上字…

TCP 握手没成功怎么办?

大家好,我是小林。 之前收到个读者的问题,对于 TCP 三次握手和四次挥手的一些疑问: 第一次握手,如果客户端发送的SYN一直都传不到被服务器,那么客户端是一直重发SYN到永久吗?客户端停止重发SYN的时机是什么…

深入理解TCP三次握手

一、TCP 包头格式 首先,TCP报文是TCP层传输的数据单元,也称为报文段,下面就是TCP包头格式: 接下来我们来看看每个字段的含义: 源端口和端口字号: TCP源端口:源计算机上应用程序端的端口号&…

TCP的三次握手及四次挥手详解

三次握手 三次握手过程: (1)第一次握手:Client将标志位SYN置为1(表示要发起一个连接),随机产生一个值seqJ,并将该数据包发送给Server,Client进入SYN_SENT状态&#xff0c…

C语言中main函数参数使用

在C99标准中定义main函数两种正确的写法 int main(void); int main(int argc, char* argv[]);常见的不标准写法 void main() main()这里主要说明带参数的main函数如何使用 int main(int argc, char* argv[]) {int i;for (i0; i<argc; i)printf("%d: %s\r\n", i…

C语言main函数参数、返回值

C语言main函数返回值&#xff1a; main函数的返回值&#xff0c;用于说明程序的退出状态。如果返回0&#xff0c;则代表程序正常退出&#xff1b;返回其他数字的含义则由系统决定&#xff0c;通常&#xff0c;返回非零代表程序异常退出&#xff0c;即使程序运行结果正确也仍需修…

main 函数的参数说明

C/C语言中的main函数&#xff0c;经常带有参数argc&#xff0c;argv&#xff0c;如下&#xff1a; int main(int argc, char** argv)int main(int argc, char* argv[])这两个参数的作用是什么呢&#xff1f;argc 是指命令行输入参数的个数&#xff0c;argv存储了所有的命令行参…

C++ main函数及main函数的参数

C main函数及main函数的参数 1、main函数的几种形式 int main() int main(int argc) int main(int argc,char** argv)//int main(int argc,char* argv[])2、argc表示命令行参数的个数、argv表示命令行参数的值 &#xff08;1&#xff09;写个小代码&#xff0c;用命令行运行…

带参数的main函数

支持C语言的系统允许main函数有两个参数 int main(int argc,char *argv[]){//argc表示从命令行传入的参数的个数&#xff1b;//argv表示从命令行传入的字符串数组&#xff1b; } 回显命令行参数 #include<stdio.h> int main(int argc,char *argv[]){int i;for(i0;i<…