tcpdump抓包分析TCP三次握手过程

2023-05-16

转:http://hi.baidu.com/xxjjyy2008/blog/item/e6566bf837d91903d9f9fdd0.html

一、 tcpdump使用

1、首先看下MAN手册

TCPDUMP(8)                                                                                                                                                        

NAME
       tcpdump - dump traffic on a network

SYNOPSIS
       tcpdump [ -AdDeflLnNOpqRStuUvxX ] [ -c count ]
               [ -C file_size ] [ -F file ]
               [ -i interface ] [ -m module ] [ -M secret ]
               [ -r file ] [ -s snaplen ] [ -T type ] [ -w file ]
               [ -W filecount ]
               [ -E
spi@ipaddr algo:secret,... ]
               [ -y datalinktype ] [ -Z user ]
               [ expression ]

选项:

-A        以ASCII码显示消息包

-c         指定包个数

-C        配合-w,当写入文件时,先检查文件大小是否已经超过1M,若超过,生成新文件,文件名为指定文件名加后缀1。

-d        将匹配信息包的代码以人们能够理解的汇编格式给出

-dd      将匹配信息包的代码以c语言程序段的格式给出

-ddd    将匹配信息包的代码以十进制的形式给出。

-D        列出可以抓包的所有网络接口

-e        显示链路层内容

-f         外部的IP以数字方式显示

-i         指定网络接口

-l         使标准输出变为缓冲行形式

-n        IP,端口用数字方式显示

-t    在输出的每一行不打印时间戳;
-v    输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息;
-vv   输出详细的报文信息;
-c    在收到指定的包的数目后,tcpdump就会停止;
-F    从指定的文件中读取表达式,忽略其它的表达式;
-i    指定监听的网络接口;
-r    从指定的文件中读取包(这些包一般通过-w选项产生);
-w   直接将包写入文件中,并不分析和打印出来;
-T    将监听到的包直接解释为指定的类型的报文,常见的类型有rpc (远程过程调用)和snmp(简单网络管理协议;)

-x        让十六进制显示包内容

2、过滤

(1)指定接口(-i)

如:tcpdump -i eth0

(2)指定IP地址(host),可以辅加and , or ,!等逻辑符,以及src,dest等表示方向。

如:tcpdump host 192.168.1.23 捕获192.168.1.23发出或者收到的包

tcpdump -A host 192.168.1.90 and /( 192.168.1.104 or 192.168.1.105 /) 捕获192.168.1.23与192.168.1.104或者192.168.1.105之间往来的包

tcpdump host ! 192.168.1.23 捕获除192.168.1.23以外所有主机的包

tcpdump -A src 192.168.1.90 and dst 192.168.1.104 指定从90发往104的包

(3)指定端口(port)

如:tcpdump port 80 指定捕获80端口的包

(4)指定协议( 协议包括:ether, fddi, tr, wlan, ip, ip6, arp, rarp, decnet, tcp and udp)

如:tcpdump tcp 指定捕获TCP包

(5)其它(gateway, broadcast, less, greater)

如:tcpdump broadcast 所有广播包

二、三次握手过程分析

用netstat -an | grep LISTEN看一下,当前主机正在监听的端口,使用另一台机telnet过来,不输入任何内容,进行抓包。

我们这里以6000为例

tcpdump port 6000 -c 3 -n

内容如下:

21:07:17.790296 IP 192.168.1.104.2511 > 192.168.1.90.6000: S 3359422806:3359422806(0) win 64240 <mss1460,nop,nop,sackOK>
21:07:17.790317 IP 192.168.1.90.6000 > 192.168.1.104.2511: S 3675079922:3675079922(0) ack 3359422807 win5840 <mss 1460,nop,nop,sackOK>
21:07:17.790675 IP 192.168.1.104.2511 > 192.168.1.90.6000: . ack 1 win 64240

我们来对第一个包进行分析:

21:07:17(时间).

790296(ID号)

IP (协议)

192.168.1.104.2511 > 192.168.1.90.6000: (源IP,端口,目的IP,端口)中间>表示方向

S (表示为SYN包,即发起连接包  

    紧急指针— URG
    确认序号有效—ACK
    接收方应该尽快将这个报文段交给应用层—PSH
    重建连接—RST
    同步序号用来发起一个连接—SYN
    发端完成发送任务—IN
)

3359422806:3359422806(0) (IP包序号,相对序号为0)

win 64240 (数据窗口大小,告诉对方本机接收窗口大小,windows下默认为64240,可通过setsockopt动态修改,同样可以通过修改注册表项(HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Tcpip/Parameters的TCPWindowSize)来更改默认值)

<mss1460,nop,nop,sackOK> 对应TCP包头中的选项字段

  MSS: Maxitum Segment Size 最大分段大小,MSS表示TCP传往另一端的最大块数据的长度。当一个连接建立时,连接的双方都要通告各自的MSS。如果一方不接收来自另一方的MSS值,则MSS就定为默认的536字节。

以上三个包正好是TCP连接的三次握手过程:

(1) A主机发送序号为3359422806的SYN包到B,同时带有自身的WIN和MSS大小。

(2) B主机收到后,发送SYN+ACK的返回包到A,也带自身的WIN和MSS大小,3675079922,同时为为上一个包的应答包3359422807。

(3) A主机返回ACK,包序号为1(相对序号,如果需要看绝对序号,可以在tcpdump命令中加-S)

然后我们再来分析一下包的具体内容:

我们在tcpdump命令中加-x选项,后可得到如下内容:

22:07:13.436638 IP 192.168.1.104.2799 > 192.168.1.90.6000: S 3480877812:3480877812(0) win 64240 <mss 1460,nop,nop,sackOK>
    0x0000: 4500 0030 b195 4000 8006 c51f c0a8 0168
    0x0010: c0a8 015a 0aef 1770 cf79 faf4 0000 0000
    0x0020: 7002 faf0 174e 0000 0204 05b4 0101 0402
22:07:13.436675 IP 192.168.1.90.6000 > 192.168.1.104.2799: S 4226616929:4226616929(0) ack 3480877813 win 5840 <mss 1460,nop,nop,sackOK>
    0x0000: 4500 0030 0000 4000 4006 b6b5 c0a8 015a
    0x0010: c0a8 0168 1770 0aef fbed 0e61 cf79 faf5
    0x0020: 7012 16d0 f10e 0000 0204 05b4 0101 0402
22:07:13.437019 IP 192.168.1.104.2799 > 192.168.1.90.6000: . ack 1 win 64240
    0x0000: 4500 0028 b196 4000 8006 c526 c0a8 0168
    0x0010: c0a8 015a 0aef 1770 cf79 faf5 fbed 0e62
    0x0020: 5010 faf0 39b2 0000

还是一样,我们对第一个包进行分析,第一个包为SYN包,应该为一个空包,即只包括IP头和TCP头。
IP包头
4 - IP版本号 IPV4
5 - IP包头长度 5个32字节
00 - TOS (000 0000 0)前三个BIT优先权,现已忽略;4 bit的TOS分别代表:最小时延、最大吞吐量、最高可靠性和最小费用, 均为0表示一般服务;最后1BIT未用。
0030 -总长度,48个字节
b195 -包唯一标识
4000 -标志字段,和片偏移,用于分片
80 - TTL(128)
06 - 协议 TCP
c51f - MAC
c0a8 0168 - SRC IP,可以inet_ntoa转换成点号分隔的IP。
c0a8 015a - DST IP
TCP包头
0aef -源端口,十进制为2799
1770 -目的端口,十进制为6000
cf79 faf4 包序号,十进制为217554863
0000 0000 确认序号,0,未设置ACK,确认序号无效
7002 -TCP包头长度,标志位。(0111 000000 000010)前4bitTCP长度7个32BIT,中间6bit保留,后6bit为标志位(URG, ACK,PSH, RST, SYN, FIN),可以看出设置了倒数第二位,SYN位。
faf0 - 窗口大小,十进制为64240
174e - 校验和,覆盖了整个的 T C P报文段: T C P首部和T C P数据
0000 - 紧急指针, 只有当URG标志置1时紧急指针才有效
0204 05b4 0101 0402 - 选项字段,8个字节

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

tcpdump抓包分析TCP三次握手过程 的相关文章

  • 套接字术语 - “阻塞”是什么意思?

    当谈论 C 中的套接字编程时 术语 阻塞 是什么意思 我需要构建一个服务器组件 可能是 Windows 服务 来接收数据 进行一些处理并将数据返回给调用者 呼叫者可以等待回复 但我需要确保多个客户端可以同时呼叫 如果客户端 1 连接并且我花
  • 指示远程主机已关闭连接的 NetworkStream.Read 的替代方案?

    关于使用以下命令处理 TCP IP 连接TcpClient类 除了等待之外 还有其他方法可以检查远程主机是否已关闭连接吗 NetworkStream Read返回0的方法 您可以使用IOControlCode KeepAliveValues
  • Indy TCP - 循环读取数据

    TCP 服务器每 8 毫秒连续发送一次数据帧 我想编写一个能够接收这些数据帧的客户端 Indy 9 中是否有任何程序可以知道缓冲区中是否有可用数据 我当前的程序如下 我正在使用线程 procedure TThreadRead Execute
  • TCP recvfrom() 不存储“from”

    我正在使用 TCP 制作一个服务器程序 我想获取我刚刚收到的消息发送者的 IP 地址 这是我的代码 case FD READ Incoming data get ready to receive char buffer DEFAULT BU
  • 如何通过 GPRS 向 GPS 追踪器(TK103、GT02、GT06、TK102 等)发送命令

    这已经被问过这里https stackoverflow com questions 25460743 gps tracker tk103 how to send message through server https stackoverf
  • 可以为 iPhone/armv6 编译 libpcap 吗?

    尝试编译一个使用 pcap h 的基本程序 我已经在我的 Mac OSX 机器上设置了环境 该机器使用适用于 iPhone 3GS 的 iPhone 3 1 3 SDK 我还将 libpcap 安装到 libpcap 这样我就可以使用 I
  • TCPServer 具有同时全双工通信

    我正在尝试编写一个 C 服务器 客户端 它将同时通过 TCP 相互发送字节数组 我正在努力思考如何实现这一目标 我见过的所有示例都等待消息 然后发送响应 我需要同时进行沟通 我是否需要为服务器和客户端上的传入和传出创建 2 个单独的 TCP
  • 如何将我的 Kivy 客户端连接到服务器(TCP、套接字)

    因此 作为我的项目 2D 多人纸牌游戏 的一部分 我已经弄清楚如何在线托管和运行服务器脚本 我的计划是让两个单独的 kivy 客户端连接到服务器 这只是一个带有命令的脚本 但是我对操作顺序有些困惑 因为我think客户端连接可能与消息循环发
  • TCP 代理:在后端不可用时保持连接

    在 Docker 设置的上下文中 我想使用类似大使的模式来允许某些容器 例如数据库服务器 正常重新启动 而不必重新启动所有依赖的容器 例如 Web 服务器 并且没有错误消息 因为 数据库服务器不可用 因此 我想知道 是否有一个 TCP 代理
  • 通过 TCP 客户端套接字接收数据时出现问题

    我正在尝试用 C 语言编写一个 TCP 客户端程序 客户端将在其中启动 连接到服务器 然后它会发送一些信息 然后监听它收到的信息并做出相应的反应 我遇到麻烦的部分是持续聆听 这是我所拥有的 while 1 numbytes recv soc
  • 如何使用 kotlin 通过 TCP 连接发送和接收字符串

    我在 Windows 上有一个 TCP 服务器 我想在服务器和我的 Android 设备之间发送和接收文本字符串 我花了很多时间搜索使用 Kotlin 的示例 但没有找到任何有用的代码 所以我现在只能创建套接字并连接 fun connect
  • Android TCP 连接最佳实践

    我正在开发一个需要 TCP 连接到 TCP 服务器的 Android 应用程序 用 Node js 编写 我的 Android TCP 客户端正在工作 可以来回发送消息 我的具体问题是 在 Android 中处理与服务器的 TCP 连接的最
  • 在 Perl 中如何接受多个 TCP 连接?

    我对 Linux 的 Perl 脚本有疑问 它的主要目的是成为 3 个应用程序之间的中间人 它应该做什么 它应该能够等待 UDP 文本 不带空格 udp port 当它收到 UDP 文本时 它应该将其转发到连接的 TCP 客户端 问题是我的
  • Web 服务器可以处理多少个套接字连接?

    假设我要获得共享 虚拟或专用托管 我在某处读到服务器 计算机一次只能处理 64 000 个 TCP 连接 这是真的吗 无论带宽如何 任何类型的托管可以处理多少个 我假设 HTTP 通过 TCP 工作 这是否意味着只有 64 000 个用户可
  • 数据包丢失和数据包重复

    我试图找出数据包丢失和数据包重复问题之间的区别 有谁知道 数据包重复 是什么意思 和TCP检测到丢失时重传数据包一样吗 No In TCP 数据包 的传递是可靠的 我认为在这种情况下术语数据应该更好 因为它是面向流的协议 数据包丢失和重复是
  • 视频流上的 TCP 与 UDP

    我刚从网络编程考试回来 他们问我们的问题之一是 如果您要传输视频 您会使用 TCP 还是 UDP 请解释一下存储视频和实时视频流 对于这个问题 他们只是希望得到一个简短的答案 TCP 用于存储视频 UDP 用于实时视频 但我在回家的路上想到
  • 简单的跨平台 TCP IP API?

    我不打算使用像 QT 或 wxWidgets 的 API 这样的大东西 我只想要可以在 Android iOS Windows Mac Linux 上运行的简单套接字 我正在制作一个事件驱动的纸牌游戏 所以 TCP 是最好的 本质上 我只想
  • 无法分配请求的地址 - 可能的原因?

    我有一个由主服务器和分布式从服务器组成的程序 从属服务器向服务器发送状态更新 如果服务器在固定时间内没有收到特定从属服务器的消息 则会将该从属服务器标记为关闭 这种情况一直在发生 通过检查日志 我发现从站只能向服务器发送一个状态更新 然后永
  • 为什么 TCP 段中的 SYN 或 FIN 位会占用序列号空间中​​的一个字节?

    我试图理解这种设计背后的基本原理 我浏览了一些 RFC 但没有发现任何明显的东西 这并不是特别微妙 这样 SYN 和 FIN 位本身就可以被确认 因此如果丢失则可以重新发送 例如 如果连接关闭而没有发送更多数据 那么如果 FIN 没有发送任
  • 如何查找连接到 AF_INET 套接字的客户端的 UID?

    有什么方法或类似的东西ucred for AF UNIX如果是AF INET插座 TCP在我的例子中 找出连接到我的套接字的客户端的UID 还有 proc net tcp但它显示了UID of the creator插座的而不是连接的cli

随机推荐