分享

今天我抓了个包

 率性而为 2022-02-21

低并发编程第 11 篇原创文章

今天用 postman 发了个请求

GET http://www./check

只返回了一个字符串

success

整个过程的网络包,用 wireshark 全都抓下来了

图片

用简单的方式写在下面就是这个样子滴
A 和 B 分别代表我本机的 IP 和远程服务的 IP 地址
黑色代表包的方向是 A -> B,蓝色则相反

三次握手

A->B   TCP   [SYN]

A<-B   TCP   [SYN,ACK]

A->B   TCP   [ACK]

HTTP 请求

A->B   HTTP  GET / HTTP/1.1

A<-B   TCP    [ACK]

A<-B   HTTP  200(text/plain)

A->B   TCP    [ACK]

Keep-Alive

A->B   TCP    [TCP Keep-Alive]

A<-B   TCP    [TCP Keep-Alive ACK]

A->B   TCP    [TCP Keep-Alive]

A<-B   TCP    [TCP Keep-Alive ACK]

...(几分钟后)

A->B   TCP    [TCP Keep-Alive]

A<-B   TCP    [TCP Keep-Alive ACK]

四次挥手

A<-B   TCP    [FIN,ACK]

A->B   TCP    [ACK]

A->B   TCP    [FIN,ACK]

A<-B   TCP    [ACK]


这么多包,我看心情点开了 A->B 发送的第一个 HTTP 协议的包

A->B   HTTP  GET / HTTP/1.1

在 wireshark 里查看它的详情

aa aa aa aa aa aa bb bb bb bb bb bb 08 00 45 00 01 1d 6d 7e 40 00 80 06 00 00 c0 a8 1f a4 6e f2 44 04 db 08 00 50 2c 85 bd c9 05 ae c5 63 50 18 02 02 94 52 00 00 47 45 54 20 63 68 65 63 6b 20 48 54 54 50 2f 31 2e 31 0d 0a 0d 0a

没错,这一长串用 16 进制表示的数据,就是从网卡直接发出去的数据,一个字节都没有省略

来,给你一分钟时间肉眼拆一下包


哈哈,还是我来吧

数据链路层

aa aa aa aa aa aa bb bb bb bb bb bb 08 00 45 00 01 1d 6d 7e 40 00 80 06 00 00 c0 a8 1f a4 6e f2 44 04 db 08 00 50 2c 85 bd c9 05 ae c5 63 50 18 02 02 94 52 00 00 47 45 54 20 63 68 65 63 6b 20 48 54 54 50 2f 31 2e 31 0d 0a 0d 0a

最开头是数据链路层,使用的协议是 Ethernet 以太网协议,协议格式如下:

  • 原地址(6字节)aa aa aa aa aa aa(mac地址)

  • 目标地址(6字节)bb bb bb bb bb bb(mac地址)

  • 类型(2字节)08 00(ipv4)

  • 数据45 00 01 ... ... ...

原地址和目标地址其实是 mac 地址,这里我用了假的,怕你们人肉我哈哈
类型是指其上一层,也就是后面的数据部分的协议类型,这里的  80 00 指的是 IP 协议(ipv4)
后面对于数据链路层来说,就是一堆数据了,它不关心是什么

网络层

我们把数据链路层去掉,也就相当于 拆包
aa aa aa aa aa aa bb bb bb bb bb bb 08 00 45 00 01 1d 6d 7e 40 00 80 06 00 00 c0 a8 1f a4 6e f2 44 04 db 08 00 50 2c 85 bd c9 05 ae c5 63 50 18 02 02 94 52 00 00 47 45 54 20 63 68 65 63 6b 20 48 54 54 50 2f 31 2e 31 0d 0a 0d 0a
拆包后的开头部分就是网络层,使用的协议当然就是上面数据链路层指定的 IP 协议,它的数据格式如下:
图片

信息太多,只提取几个关键的信息

  • 协议06(TCP)

  • 源地址c0 a8 1f a4(IP地址:192.168.31.164)

  • 目的地址6e f2 44 04(IP地址:110.242.68.4)

  • 数据db 08 00 50 ... ... ...

其实和上面数据链路层的分析过程一样,关键信息还是这些,协议表示上一层也就是数据部分的协议是 TCP 协议,源地址和目的地址不再是 mac,在网络层就表示 IP 地址了。
这里的地址为啥不用假的呢因为源地址是我局域网的地址你知道了也没用,目的地址是百度,哈哈你去人肉吧~
收~
我们接着拆...

传输层

再次去掉网络层的 IP 协议的首部

aa aa aa aa aa aa bb bb bb bb bb bb 08 00 45 00 01 1d 6d 7e 40 00 80 06 00 00 c0 a8 1f a4 6e f2 44 04 db 08 00 50 2c 85 bd c9 05 ae c5 63 50 18 02 02 94 52 00 00 47 45 54 20 63 68 65 63 6b 20 48 54 54 50 2f 31 2e 31 0d 0a 0d 0a
剩下的开头部分,就到了数据传输层由于在网络层中已经指出,其上一层的数据部分是 TCP 协议,所以接下来用 TCP 协议的格式来分析就好了

图片

TCP 协议大家都知道,超级多的细节,这里不展开,仍然提取关键信息,走主流程

  • 源端口db 08(端口号:56072)

  • 目的端口00 50(端口号:80)

  • 数据47 45 54 20 ... ..

这里的 目的 不再是 mac 地址,也不再是 IP 地址了,因为此时包已经到达了目标机器,需要找具体对应的进程,所以这里是端口号

同样由于进程自己知道将以什么样的协议,来解读数据部分,所以这里也没有上层协议的指定,因为这已经是应用程序的事了。

我们接着拆...

应用层

再次去掉传输层的 TCP 协议的首部

aa aa aa aa aa aa bb bb bb bb bb bb 08 00 45 00 01 1d 6d 7e 40 00 80 06 00 00 c0 a8 1f a4 6e f2 44 04 db 08 00 50 2c 85 bd c9 05 ae c5 63 50 18 02 02 94 52 00 00 47 45 54 20 63 68 65 63 6b 20 48 54 54 50 2f 31 2e 31 0d 0a 0d 0a

就来到了我们最熟悉的应用层,使用的协议是什么呢?因为我知道我请求的服务是提供 HTTP 协议的 web 服务,同时我发送的也是 HTTP 协议的数据,所以使用的协议当然就是 HTTP 协议啦~

  • 请求行47 ... 0a(GET /check HTTP/1.0 \r\n)

  • 请求头

  • 请求体

  • 最后0d 0a(\r\n)

难怪熟悉,只看结构确实简单,且容易理解,都可以转换成字符来解读



今天没做什么,就是拆了个包

图片

其实我手动拆包的过程,也是各种硬件或软件拆包的过程,就是将数据的指针不断往后移动而已。
然后每一层都有不同的协议来解读,刚刚上述过程的协议,只是我向一个提供 http 协议的 web 服务器发请求所用到的各层协议,不过这也是最常见的了,所以今天就简单带你抓个包梳理下。
留个小问题,网络分层不是还有个 物理层 么?为啥文中没有写呢?
我们下期再见!

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多