小伙伴们好呀,这节来分享下这个 ICMP协议 和 curl 访问 http 网站时涉及到的协议。
ARP 协议补充
先补充一下上文的 ARP 协议。
80 35.374000 VMware_c0:00:08 VMware_5b:db:1a ARP 42 Who has 192.168.200.128? Tell 192.168.200.1
81 35.374560 VMware_5b:db:1a VMware_c0:00:08 ARP 42 192.168.200.128 is at 00:0c:29:5b:db:1a
图片
MAC 地址是 6 字节,前三个是 厂商,后三个是序列号。
ICMP协议
Internet Control Message Protocol,互联网控制报文协议。ping 的时候触发。
这里直接在虚拟机上去 ping 192.168.2.187 (主机地址)
图片
14 8.900476 192.168.200.128 192.168.2.187 ICMP 98 Echo (ping) request id=0x0904, seq=1/256, ttl=64 (reply in 15)
15 8.900943 192.168.2.187 192.168.200.128 ICMP 98 Echo (ping) reply id=0x0904, seq=1/256, ttl=128 (request in 14)
可以看到,ping 请求时,这个报文的 type 是 8,表示 Echo (ping) request。
图片
应答时,这个 type 是 0 ,表示 (Echo (ping) reply)。
图片
DNS 协议
域名系统,Domain Name System。
curl www.baidu.com
访问百度时,第一步就是这个 域名解析 了。
图片
捕捉的包如下 👇
图片
图片
图片对应 21 的请求,可以发现 DNS 基于 UDP(User Datagram Protocol) 用户数据报协议。
同时有个 type 为 A 的类型,这个是请求 ipv4 地址的。
22 那里时 type : AAAA ,这个是 ipv6 地址的。
21 14.648767 192.168.200.128 192.168.200.2 DNS 73 Standard query 0x7abe A www.baidu.com
22 14.648817 192.168.200.128 192.168.200.2 DNS 73 Standard query 0xffc7 AAAA www.baidu.com
以前搭建博客时,有个域名解析的环节,那会也要配置解析这个 A (后知后觉~)
下面看看 response 的数据 👇
24 14.683310 192.168.200.2 192.168.200.128 DNS 132 Standard query response 0x7abe A www.baidu.com CNAME www.a.shifen.com A (ipv4地址) A (ipv4地址)
25 14.688004 192.168.200.2 192.168.200.128 DNS 156 Standard query response 0xffc7 AAAA www.baidu.com CNAME www.a.shifen.com AAAA (ipv6地址) AAAA (ipv6地址)
CNAME 即 别名记录
长知识了:百度的别名是 www.a.shifen.com
这里也是顺利拿到了 ipv4 地址
图片
吃瓜
哦嚯,无意间发现了大公司名字的另一层含义 👇
大家都是 shifen 👍
图片
图片
HTTP 协议
图片
DNS 解析成功后,拿到了这个 ip 地址,这里用的 ipv4 地址去建立 TCP 连接。
三次握手后,就发送 HTTP 请求了 👇。
29 14.714278 192.168.200.128 xxx.42 HTTP 131 GET / HTTP/1.1
Get 请求如下,这个的 User-Agent 是 curl (平时见到的都是 浏览器 标志 )
图片
这个 TCP 的报文段大小是 77 ,同时 [Next Sequence Number: 78 (relative sequence number)]
图片
响应 👇
从 30 这一条开始,这里 ACK = 78 刚好。
30 14.714429 ipv4 192.168.200.128 TCP 54 80 → 44626 [ACK] Seq=1 Ack=78 Win=64240 Len=0
31 14.733343 ipv4 192.168.200.128 TCP 1494 80 → 44626 [PSH, ACK] Seq=1 Ack=78 Win=64240 Len=1440 [TCP segment of a reassembled PDU]
32 14.733714 192.168.200.128 ipv4 TCP 54 44626 → 80 [ACK] Seq=78 Ack=1441 Win=31680 Len=0
33 14.733782 ipv4 192.168.200.128 HTTP 1395 HTTP/1.1 200 OK (text/html)
主要看 31 和 33 这两条,
PSH + ACK:用于传输数据并要求接收端立即交给应用层处理。
这里数据长度超过了 MTU(Maximum Transmission Unit 最大传输单元)1500 个字节,要进行分片。
所以,31 中出现 [TCP segment of a reassembled PDU],意味着它不是完整的,只是 PDU(Protocol Data Unit 协议数据单元)的一部分。
在 33 中可以看到这个 重组TCP 的记录 👇
[2 Reassembled TCP Segments (2781 bytes): #31(1440), #33(1341)]
图片
接着就是 HTTP 的内容了,和浏览器上看的差不多,就是 响应行,头,体 。就不多赘述了。
图片
下面又是 TCP 四次挥手 的内容了。
图片
curl 结束后,立刻去查这个 半连接队列 ,发现还在等待关闭。
图片
等待 2MSL (linux 上 2MSL = 60s )后,就关闭了。
sysctl net.ipv4.tcp_fin_timeout
图片
最后,补充下这个 模型,看看之前介绍到的协议都在哪一层 👇
OSI 七层模型
+-------------------------+
7 | Application Layer | DNS,HTTP,SSH,Telnet,FTP 等
+-------------------------+
6 | Presentation Layer |
+-------------------------+
5 | Session Layer |
+-------------------------+
4 | Transport Layer | (段 segement)TCP,UDP
+-------------------------+
3 | Network Layer | (包 packet)ICMP,IP
+-------------------------+
2 | Data Link Layer | (帧 frame)ARP
+-------------------------+
1 | Physical Layer |
+-------------------------+
TCP/IP四层
与 OSI 七层模型相比,TCP/IP 四层模型将 表示层 和 会话层 合并到了 应用层 中,将 数据链路层 和 物理层 合并到了 链路层 中。
+-------------------------+
4 | Application Layer |
+-------------------------+
3 | Transport Layer |
+-------------------------+
2 | Internet Layer |
+-------------------------+
1 | Link Layer | 链路层
+-------------------------+