第 68 期 2019-11-21 网络知识十全大补丸

文章来自于:https://reading.developerlearning.cn/reading/68-2019-11-21-dive-into-network/

回看视频

分享者

刘楠

观看视频

Go 夜读第 68 期网络知识十全大补丸

本期 Go 夜读是由刘楠给大家带来的《网络知识十全大补丸》。

作者介绍

刘楠 (NandyLiu),曾经的少年黑客,大学时的计算机学院网管,毕业后曾在某前沿网络设备厂商研发网络安全和流控产品,解决了行业性的网络流控难题,在中美两国有流控算法专利,Network traffic control method and device(CN 102355425, US 8,804,525 B2). 后又在多个行业的头部企业任职,为亿级在线的国民聊天软件优化网络调度和传输体验,为金融市场开发高性能高实时性的金融行情系统。出身于教师世家,生活成长于校园,乐于传道和分享自己的想法。

背景

后端工程师在工作中经常会遇到计算机网络方面的问题,网络对多数人来说还是一个黑盒子,本次技术分享从常见的网络硬件、企业和数据中心的网络拓扑、Linux 协议栈和防火墙等基础网络知识开始介绍,一直讲到 TCP 和 HTTP 这些年的技术演进路线和未来趋势。

大纲

  • 网络硬件介绍
  • 网络部署模式
  • Linux 协议栈
  • Linux 防火墙
  • 前沿网络传输技术

QA

1. tap 是虚拟网卡吗?

虚拟网卡有很多种,比如 loopback 的 lo,docker 容器的 veth,tap 也是其中一种。

2. https 也能检测到数据包吗?

https 因为有加密所以一般不能检测数据包,强行检测需要使用中间人攻击伪造证书,会被客户端发现。

3. 老师想问下,跨网通讯,目的 mac 地址只填网关 mac 地址就可以了么,然后让网关自己去跳?

发往同网段的话通过 arp 或路由表填充目的 mac 地址,那么发送跨网段数据包-目的 mac 地址不需要填直接发给网关么,让网关来跳

本机通过路由,把跨网段的数据包在二层发给网关,所以目的MAC地址是网关的MAC地址,网关收到这个数据包后进入自己的协议栈的第三层,查找路由转发给下一跳的节点。

4. mac 地址不是随着数据包换的吗?

MAC 地址是二层网络使用的地址,二层网络属于一个邻居系统,只支持邻居之间的通信,所以 MAC 地址在二层网络中转发时不变,跨越二层经过三层设备的时候就会改变。

5. 网关与网桥感觉很像?

网关工作于三层,网桥工作于二层,网关是内网和外网之间的三层路由节点,网桥将两个二层网络连接为一个更大的二层网络。

6. 我觉得 VPN 和电路层代理很像,大佬可以讲讲?

VPN 工作于三层或以上,电路层代理是什么概念?是想问 socket 代理吗?四层的 SSL VPN 跟 socket 代理从概念到使用的技术都非常类似。

7. 请问一个问题,最近发现集群的网卡 drop 包很多,我们监控了一下平均每分钟都有几个,会有哪些问题导致的呢?驱动会不会影响这个参数?

drop 的原因很多,流量太大,负载过高,网卡的 buffer 满了,就可能会 drop,可以通过降低流量来观察 drop 会不会减少并消失。

8. 混杂模式下抓也会漏包

一般不会漏,不过上层的交换机如果只把属于抓包的这台机器的数据包转发过来,不属于你的数据你就抓不到了。如果想抓整个局域网的数据包,要使用ARP欺骗技术,把自己伪装成局域网的网关,实现中间人攻击。

  1. 看一下上层是不是收不过来了
  2. mtu?

有 mtu 问题的可能性,不过也不是太大。

9. 软中断就是 汇编中的 int 吧

中断下半部
Int 就是一个中断指令吧

软中断这个概念是用来处理中断任务的下半部(bottom half),简化硬件中断程序的处理逻辑,让硬中断程序只处理简单的 IO 操作,之后复杂的逻辑留给软中断程序来处理,减少硬中断占用 CPU 的时间,提高 CPU 对其他中断的处理实时性,简单的说就是一个任务分成两部分,上半部分是紧急处理阶段,下半部分是非紧急处理阶段,下半部分在具体实现上可以使用软中断的模式,软中断可以用 int 指令来主动触发,从而让 CPU 来处理下半部的逻辑。

10. I/O 的 select 还是 poll 模式,是在哪个环节有区别呢?

select 和 poll 用来操作 socket,是协议栈传输层以上的处理逻辑,用于轮询 socket,检查轮询的一批 socket 的发送和接受缓冲区是否可读可写。

11. 老师对 dpdk 了解吗 一直不知道处于哪个步骤

dpdk 技术在网卡驱动程序中就已经介入,网卡收发数据包直接使用 dpdk 设定好的内存区域,这个内存区域再映射到应用层,实现应用层直接与网卡驱动的数据交换,绕过操作系统协议栈,实现高性能网络数据处理

cpu 绑定?
硬直通 ovs evs 都可以绑定 cpu

可以通过二进制掩码的形式,实现 IRQ Affinity,指定中断由哪些 CPU 来处理,也叫中断的 CPU 绑定

12. local_in 就是 iptables 的 input 链吧

是的

13. iptables 可以用来做限速吗?比如模拟丢包,弱网

tc

tc 命令用于在二层构建数据发送队列,支持队列的各种调度,比如增加延时,设定丢包的概率模型,可以模拟常见的网络场景,实际上很多广域网模拟器的硬件,就是通过 linux + tc 在一个嵌入式的小盒子里实现的。

14. mangle 表一般可以做一些什么事情

用于对数据包进行修改,比如修改 IP 包头的 TTL 字段

15. 劫持是用 mangle 吗?

mangle 通常只对单个包做简单的修改,复杂的劫持逻辑不方便在内核中实现,一般会在 nat 中做一个 dnat,将需要劫持的流量的目的 IP 定向到本机,然后在本机监听对应的端口,实现中间人或代理劫持。

16. 那个经典了计算机网络的绿皮书讲 tcp 很不错

17.

https://www.7down.com/soft/179692.html

18. bbr 一般用于 1080 优化?

bbr 可以抗丢包,在有丢包的情况下依然能保持大带宽,所以对于 1080p 或更高清的视频传输,也是有很好的效果的。

19. 我在公司让 sa 帮忙把一台机器设置了 BBR,升级了内核,但是用 iperf 测试效果不是很好,一直没算弄清楚原因

sysctl -w net.ipv4.tcp_congestion_control=bbr

先要检查看你内核使用的是不是 BBR 算法,另外 BBR 只对发送端有效果,如果你开启BBR的是接收端,发送端没有开启 BBR,是没有意义的。BBR 最大的优势在于抗丢包,如果网络中没有随机丢包(非拥塞导致的丢包),BBR 相对传统 TCP 算法并没有明显优势。

20. 有比 BBR 更优秀的?

拥塞控制算法有自己的适用场景,另外是否优秀也有很多评价标准,有人认为 BBR 还不够激进,需要提高侵略性,也有人认为 BBR 抢占其他算法的带宽不公平。

21. 插个问题,我们用 1.1,但是也用了 WSS,这个时候 WSS 不知道是握手还是连接超时,到了六秒中,这个时候同一个页面其他的请求都没有收到,这个应该是 1.1 中阻塞了吧

我们用 1.1,但是也用了 WSS,这个时候 WSS 不知道是握手还是连接超时,到了六秒中,这个时候同一个页面其他的请求都没有收到,这个应该是 1.1 中阻塞了吧?建立连接的时候 WS 还是 HTTP 协议,只不过走 upgrade 升级,服务端收到 upgrade 后切换协议,大概这样的,WS 刚刚通过 HTTP 传的时候会不会新建 TCP?

不一定 ws会和页面其他请求用不同的 tcp 连接

websocket 会一直使用同一条 TCP 连接,你说的超时是晚到还是一直没有到?如果是一直不到,可能中间的链路对 websocket 有干扰,比如企业网出口的 http 代理,有可能把 websocket 当做普通 http 请求来处理,不支持 websocket 的 upgrade 操作,建议排查客户端的网络环境,比如让客户端通过手机开热点上网,对照测试,用排除法排查。

FEC也是一种纠错算法

那 fec 包也丢了咋办?

FEC 不是正常的业务包,丢了不影响业务的传输,没有关系。加入多少比例的 FEC 要看实际丢包率,FEC 要有足够的比例来填丢包的坑。

22. 老师给我们推荐点相关书籍吧

见参考资料。

参考资料

  1. W・Richard Stevens, TCP/IP 详解 卷 1:协议,TCP/IP ILLustrated Volume 1: The Protocols, 1994
  2. Christian Benvenuti, 深入理解 LINUX 网络技术内幕,Understanding Linux Network Internals, 2005
  3. Gnv Vibhav Reddy, G.Vijay Kumar, L.Roshini, Congestions and Control Mechanisms in Wired and Wireless Networks, 2014
  4. Neal Cardwell, Yuchung Cheng, BBR: Congestion-Based Congestion Control, acmqueue, 2016
  5. QUIC: a multiplexed stream transport over UDP, QUIC, a multiplexed transport over UDP
  6. HTTP/3: draft-ietf-quic-http-latest, https://quicwg.org/base-drafts/draft-ietf-quic-http.html