本文最后更新于 2022年02月08日 已经是 478天前了 ,文章可能具有时效性,若有错误或已失效,请在下方留言。
学校实验 NCEPU
未经授权,禁止转载!
使用软件及环境
- Wireshark
- 连接上互联网
- 浏览器
实验过程
实验前准备
安装好抓包软件,测试好本地网络连接是否正常,打开Wireshark开始抓包
完成实验操作
使用浏览器直接浏览网页https://mcenjoy.cn
,待网页加载完成后停止抓包,接着可以将抓到的包进行保存。
分析三次握手过程
过滤掉其他无用包 介绍一些参数
过滤参数 tcp && tcp.port == 443 && ip.addr == 193.200.134.40 && tcp.port == 1271
将无用的包过滤掉
字段 | 含义 |
---|---|
URG | 紧急指针是否有效。为1,表示某一位需要被优先处理 |
ACK | 确认号是否有效,一般置为1。 |
PSH | 提示接收端应用程序立即从TCP缓冲区把数据读走。 |
RST | 对方要求重新建立连接,复位。 |
SYN | 请求建立连接,并在其序列号的字段进行序列号的初始值设定。建立连接,设置为1 |
FIN | 希望断开连接。 |
Client -> Server
0000 00 74 9c dd e6 c1 80 fa 5b 6b f8 0e 08 00 45 00
0010 00 34 fd 07 40 00 80 06 00 00 0a 02 5a 37 c1 c8
0020 86 28 04 f7 01 bb 70 c2 3f 0c 00 00 00 00 80 02
0030 fa f0 ac 50 00 00 02 04 05 b4 01 03 03 08 01 01
0040 04 02
第一次请求Client->Server
[SYN]
TCP包头
0020 ** ** 04 f7 01 bb 70 c2 3f 0c 00 00 00 00 80 02
0030 fa f0 ac 50 00 00 02 04 05 b4 01 03 03 08 01 01
0040 04 02
数据 | 含义 | 值 |
---|---|---|
04 f7 | 源端口 | 1271 |
01 bb | 目的端口 | 443 |
70 c2 3f 0c | 32位序号 | 1891778316 |
00 00 00 00 | 32位确认序号 | 0 |
80 02 | 1000 0000 0000 0010 | |
1000 | TCP头部长度 | 8 |
0000 00 | 保留 | |
URG | 0 | |
ACK | 0 | |
PSH | 0 | |
RST | 0 | |
SYN | 1 | |
FIN | 0 | |
fa f0 | 窗口大小 | 64240 |
ac 50 | 校验和 | 0xac50 |
00 00 | 紧急指针 | 0x0000 |
Server -> Client
0000 80 fa 5b 6b f8 0e 00 74 9c dd e6 c1 08 00 45 04
0010 00 34 00 00 40 00 29 06 a5 96 c1 c8 86 28 0a 02
0020 5a 37 01 bb 04 f7 11 b2 bc 9a 70 c2 3f 0d 80 12
0030 fa f0 43 18 00 00 02 04 05 b4 01 01 04 02 01 03
0040 03 07
来自服务器的回复Server->Client
[SYN,ACK] 此时由 Client -> Server 的通道已经打通
TCP包头
0020 ** ** 01 bb 04 f7 11 b2 bc 9a 70 c2 3f 0d 80 12
0030 fa f0 43 18 00 00 02 04 05 b4 01 01 04 02 01 03
0040 03 07
数据 | 含义 | 值 |
---|---|---|
01 bb | 源端口 | 443 |
04 f7 | 目的端口 | 443 |
11 b2 bc 9a | 32位序号 | 296926362 |
70 c2 3f 0d | 32位确认序号 | 1891778317 |
80 12 | 1000 0000 0001 0010 | |
1000 | TCP头部长度 | 8 |
0000 00 | 保留 | |
URG | 0 | |
ACK | 1 | |
PSH | 0 | |
RST | 0 | |
SYN | 1 | |
FIN | 0 | |
fa f0 | 窗口大小 | 64240 |
43 18 | 校验和 | 0x4318 |
00 00 | 紧急指针 | 0x0000 |
Client -> Server
0000 00 74 9c dd e6 c1 80 fa 5b 6b f8 0e 08 00 45 00
0010 00 28 fd 0a 40 00 80 06 00 00 0a 02 5a 37 c1 c8
0020 86 28 04 f7 01 bb 70 c2 3f 0d 11 b2 bc 9b 50 10
0030 04 02 ac 44 00 00
来自客户端的回复Client->Server
[ACK] 此时由 Server -> Client 的通道已经打通,此时 TCP三次握手 已经完成接下来就可以进行数据的传输了,由于网站使用的是tls1.3(https)的协议后面就不进行详细分析了
TCP包头
0020 ** ** 04 f7 01 bb 70 c2 3f 0d 11 b2 bc 9b 50 10
0030 04 02 ac 44 00 00
数据 | 含义 | 值 |
---|---|---|
04 f7 | 源端口 | 1271 |
01 bb | 目的端口 | 443 |
70 c2 3f 0d | 32位序号 | 1891778317 |
11 b2 bc 9b | 32位确认序号 | 296926363 |
50 10 | 0101 0000 0001 0000 | |
0101 | TCP头部长度 | 5 |
0000 00 | 保留 | |
URG | 0 | |
ACK | 1 | |
PSH | 0 | |
RST | 0 | |
SYN | 0 | |
FIN | 0 | |
04 02 | 窗口大小 | 1026 |
ac 44 | 校验和 | 0xac44 |
00 00 | 紧急指针 | 0x0000 |
上面通讯如下图所示
sequenceDiagram
A–>B
分析四次挥手包
遇到的问题
我在抓四次挥手包时发现自己只能抓到3次?,很奇怪。经过查询资料后得知在如果对方收到本端FIN报文时,对方的接收通道就会关闭。此时,如果对方也没有数据发给本端,那么对方也会发送FIN给本端,用于关闭从对方到本端的连接,这时候就可能出现ACK和FIN合在一起的情况。当然,如果对方仍然有数据发送,那么就等数据发完,再发FIN来关闭连接,这时候就是四次挥手了。因此,四次挥手变成三次。
Client -> Server
0000 00 74 9c dd e6 c1 80 fa 5b 6b f8 0e 08 00 45 00
0010 00 28 3f 3c 40 00 80 06 00 00 0a 02 5a 37 c1 c8
0020 86 28 44 92 01 bb 25 55 d2 86 6b db ec 11 50 11
0030 04 00 ac 44 00 00
第一次请求Client->Server
[ACK FIN]向服务器请求关闭服务器的接收通道
TCP包头
0020 ** ** 44 92 01 bb 25 55 d2 86 6b db ec 11 50 11
0030 04 00 ac 44 00 00
数据 | 含义 | 值 |
---|---|---|
44 92 | 源端口 | 17554 |
01 bb | 目的端口 | 443 |
25 55 d2 86 | 32位序号 | 626381446 |
6b db ec 11 | 32位确认序号 | 1809574929 |
50 11 | 0101 0000 0001 0001 | |
0101 | TCP头部长度 | 5 |
0000 00 | 保留 | |
URG | 0 | |
ACK | 1 | |
PSH | 0 | |
RST | 0 | |
SYN | 0 | |
FIN | 1 | |
04 00 | 窗口大小 | 1024 |
ac 44 | 校验和 | 0xac44 |
00 00 | 紧急指针 | 0x0000 |
Server -> Client
0000 80 fa 5b 6b f8 0e 00 74 9c dd e6 c1 08 00 45 04
0010 00 28 13 aa 40 00 2a 06 90 f8 c1 c8 86 28 0a 02
0020 5a 37 01 bb 44 92 6b db ec 11 25 55 d2 86 50 10
0030 01 f5 6b 9f 00 00 00 00 00 00 00 00
Server->Client
[ACK]此时服务器已经关闭了自己的接收通道
TCP包头
0020 ** ** 01 bb 44 92 6b db ec 11 25 55 d2 86 50 10
0030 01 f5 6b 9f 00 00 00 00 00 00 00 00
数据 | 含义 | 值 |
---|---|---|
01 bb | 源端口 | 443 |
44 92 | 目的端口 | 17554 |
6b db ec 11 | 32位序号 | 1809574929 |
25 55 d2 86 | 32位确认序号 | 626381446 |
50 10 | 0101 0000 0001 0000 | |
0101 | TCP头部长度 | 5 |
0000 00 | 保留 | |
URG | 0 | |
ACK | 1 | |
PSH | 0 | |
RST | 0 | |
SYN | 0 | |
FIN | 0 | |
01 f5 | 窗口大小 | 501 |
6b 9f | 校验和 | 0x6b9f |
00 00 | 紧急指针 | 0x0000 |
Server -> Client
0000 80 fa 5b 6b f8 0e 00 74 9c dd e6 c1 08 00 45 04
0010 00 28 13 ab 40 00 2a 06 90 f7 c1 c8 86 28 0a 02
0020 5a 37 01 bb 44 92 6b db ec 11 25 55 d2 86 50 11
0030 01 f5 6b 9e 00 00 00 00 00 00 00 00
Server->Client
[ACK FIN]服务器向客户端请求关闭客户端的接收通道
TCP包头
0020 ** ** 01 bb 44 92 6b db ec 11 25 55 d2 86 50 11
0030 01 f5 6b 9e 00 00 00 00 00 00 00 00
数据 | 含义 | 值 |
---|---|---|
01 bb | 源端口 | 443 |
44 92 | 目的端口 | 17554 |
6b db ec 11 | 32位序号 | 1809574929 |
25 55 d2 86 | 32位确认序号 | 626381446 |
50 11 | 0101 0000 0001 0001 | |
0101 | TCP头部长度 | 5 |
0000 00 | 保留 | |
URG | 0 | |
ACK | 1 | |
PSH | 0 | |
RST | 0 | |
SYN | 0 | |
FIN | 1 | |
01 f5 | 窗口大小 | 501 |
6b 9e | 校验和 | 0x6b9e |
00 00 | 紧急指针 | 0x0000 |
Client -> Server
0000 00 74 9c dd e6 c1 80 fa 5b 6b f8 0e 08 00 45 00
0010 00 28 3f 3d 40 00 80 06 00 00 0a 02 5a 37 c1 c8
0020 86 28 44 92 01 bb 25 55 d2 87 6b db ec 12 50 10
0030 04 00 ac 44 00 00
Client->Server
[ACK]此时双向通道都已经关闭了,四次挥手包完成
TCP包头
0020 ** ** 44 92 01 bb 25 55 d2 87 6b db ec 12 50 10
0030 04 00 ac 44 00 00
数据 | 含义 | 值 |
---|---|---|
44 92 | 源端口 | 17554 |
01 bb | 目的端口 | 443 |
25 55 d2 87 | 32位序号 | 626381447 |
6b db ec 12 | 32位确认序号 | 1809574930 |
50 10 | 0101 0000 0001 0000 | |
0101 | TCP头部长度 | 5 |
0000 00 | 保留 | |
URG | 0 | |
ACK | 1 | |
PSH | 0 | |
RST | 0 | |
SYN | 0 | |
FIN | 0 | |
04 00 | 窗口大小 | 1024 |
ac 44 | 校验和 | 0xac44 |
00 00 | 紧急指针 | 0x0000 |
实验结果
成功抓到TCP握手与挥手的包,并且分析完成,验证了老师上课讲的内容。但在实验过程中也遇到了一些困难,特别是在抓挥手包时,服务器发送的包总是将ACK和FIN合并,导致只抓到三个包,后面经过查阅资料成功解决问题。