小伙伴们好呀,今天来分享下这个网络知识。
利用 Wireshark 抓包 VMware Network Adapter VMnet8 网卡,来分析 虚拟机 上的流量。
如图所示,打开 SSH 工具,登录到虚拟机上,要先进行这个 TCP 链接,很标准的 三次握手。
Client --- > Server : SYN Seq=0
Client < --- Server : SYN+ACK Seq=0 ACK=1
Client --- > Server : ACK Seq=1 ACK=1
有个经典的面试题,就是为啥是 3次,不是 2次,4次?
因为 TCP是全双工协议,每一方都可以独立地向另一方发送数据,双方都得发一次 SYN 请求,并分别 ACK 一次,才能建立好连接。
开头是 SYN,中间刚好是 SYN+ACK ,最后则是 ACK 。刚好就 3 次。
这个过程,Linux 内核维护了两个队列:全连接队列(established connections)和半连接队列(half-open connections)来记录。
查看全连接队列:
netstat -ant | grep ESTABLISHED
查看半连接队列:
cat /proc/net/tcp
我把第三条包复制下来👇
1 0.000000 192.168.200.1 192.168.200.128 TCP 66 53159 → 22 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 WS=256 SACK_PERM
2 0.000174 192.168.200.128 192.168.200.1 TCP 66 22 → 53159 [SYN, ACK] Seq=0 Ack=1 Win=29200 Len=0 MSS=1460 SACK_PERM WS=128
3 0.000410 192.168.200.1 192.168.200.128 TCP 54 53159 → 22 [ACK] Seq=1 Ack=1 Win=1051136 Len=0
可以发现 3 这里 Win=1051136
这里我是有点小疑惑的,TCP 窗口大小不是 16 位(65536)吗?
后来发现这个和 WS(window_scaling)窗口缩放有关。
# 开启 返回 1
sudo sysctl net.ipv4.tcp_window_scaling
它属于 TCP_OPTION 的内容,是对 TCP 协议的扩展,允许将窗口大小扩张到更大的值,解决 TCP 窗口大小的原始设计所施加的性能限制。
RFC 7323 中的 TCP 窗口缩放选项部分简要介绍了此功能。 https://tools.ietf.org/html/rfc1323#page-8
里面还有 SACK(Selective Acknowledgment , 选择性确认) ,属于 重传机制 的一个。
一个简单例子 👇
发送方:发送 A,B,C,D
接收方:应答 A,D
发送方:重发 B,C
这里新开个 SSH 窗口,然后关掉,抓这个 TCP 的 FIN 包。
74 21.966960 192.168.200.1 192.168.200.128 TCP 54 53329 → 22 [FIN, ACK] Seq=3055 Ack=3486 Win=1050880 Len=0
75 21.967027 192.168.200.128 192.168.200.1 TCP 54 22 → 53329 [ACK] Seq=3486 Ack=2991 Win=35072 Len=0
76 21.978675 192.168.200.128 192.168.200.1 TCP 54 22 → 53329 [FIN, ACK] Seq=3486 Ack=3056 Win=35072 Len=0
77 21.978982 192.168.200.1 192.168.200.128 TCP 54 53329 → 22 [ACK] Seq=3056 Ack=3487 Win=1050880 Len=0
这里也很直观👇
Client --- > Server : FIN + ACK Seq=3055 Ack=3486
Client < --- Server : ACK Seq=3486 ACK=2991(数据未接收完,才 ACK 到 2991)
Client < --- Server : FIN + ACK Seq=3486 Ack=3056
Client --- > Server : ACK Seq=3056 Ack=3487
每个 FIN 信号,都要去 ACK 应答,一来一回,就四次了。
FIN 表示我这边发送完了,等待关闭,但是对方还在忙,只能 ACK 表示我知道了。
Address Resolution Protocol (request) 。
它的触发场景如下
112 74.131366 VMware_c0:00:08 Broadcast ARP 42 Who has 192.168.200.2? Tell 192.168.200.1
113 74.877192 VMware_c0:00:08 Broadcast ARP 42 Who has 192.168.200.2? Tell 192.168.200.1
这个居然这么拟人,哈哈 “Who has”
00:00:00:00:00:00这个目标MAC地址通常被用于发送广播消息或者表示目标MAC地址未知。
Over!
本文就到这里啦,感谢您的阅读,有不对的地方也请您帮忙指正!谢谢~😋
喜欢的小伙伴们,别忘了点赞关注呀~😋 祝你有个美好的一天!😝
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。