草庐IT

使用wireshark抓取Tcp三次握手

Ischanged 2023-08-11 原文

文章目录

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的一些机制的理解。

有关使用wireshark抓取Tcp三次握手的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  3. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  4. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  5. ruby - 在 Ruby 中使用匿名模块 - 2

    假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于

  6. ruby - 使用 ruby​​ 和 savon 的 SOAP 服务 - 2

    我正在尝试使用ruby​​和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我

  7. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  8. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  9. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  10. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

    我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

随机推荐