zxc的自留地

About Me

[笔记]网络知识

December 10, 2019

前言

前几天看了【Go 夜读】#68 网络知识十全大补丸,现在简单地做下笔记,笔者感觉讲的很好,推荐大家去看下

记录

网络硬件

  • 双绞线(twisted pair)

    线序 A: 白绿——1,绿——2,白橙——3,蓝——4,白蓝——5, 橙——6,白棕——7,棕——8

    线序 B: 白橙——1,橙——2,白绿——3,蓝——4,白蓝——5, 绿——6,白棕——7,棕——8

    绝缘铜导线,两两胶合,为了降低信号干扰,抵消电波。

    直通线,A-A、B-B (连路由器、交换机) 交叉线,A-B(为了交换数据,A 的接受连到 B 的发送,B 的接受连到 A 的发送)

  • 集线器 Hub

    工作在物理层,复制多路转发

  • 以太网供电 PoE(Power over Ethernet)

    IP 电话机、无线 AP、部分交换机

  • 交换机 Switch

    小型局域网二层交换机(隔离局域网)、大型局域网的三层交换机

  • 网桥 Bridge

    工作于二层网络,连接多个局域网 docker 虚拟网桥 docker0,容器 veth 虚拟以太网卡,连接到网桥,容器和容器就可以通信了 虚拟网卡(回环地址、tap、)

  • 路由器 Router

    工作于三层以太网,通过路由协议为报文提供路由,跨三层通信

    二层寻址是通过 mac 地址,三层寻址是通过路由协议, 路由协议:路由器不同的网口,连接不同的子网,根据数据包的地址,查看哪个网口可以跳过去,然后就将这个数据包发过去。

  • 防火墙 Firewall 传统防火墙工作于三层,更前沿的可以工作在四层和七层

  • 虚拟专用网 VPN

    公网上的虚拟加密通信网络,终端远程接入私有网络、两个私有网络的互联互通

    ssl vpn:在本地开一个应用层的代理(sock 代理,代理 tcp 或 udp),把公司的域名映射到本地的 IP 上去,然后在本地监听目标端口,然后通过 ssl 加密传送到公司的 VPN 设备上去,然后在解密,传送到公司内网上去。

  • 网关 Gateway

    网络出口设备,工作于三层,集路由、防火墙、流控、VPN 功能于一体 网桥是工作在二层的, 二层通常是局域网。网关是三层的,通常是内网和外网,两个网络之间的关卡,内外网隔离,架设 vpn,多个出口,负载均衡。

  • 无线接入点 AP

    运行 wifi 系列协议 802.11.x 的二层网络设备,无线网络的交换机,支持移动终端在多个接入点无缝漫游。

网络部署

小型企业网络 带vpn的企业网 数据中心网络

Linux 协议栈

Linux 收包流程

1 数据包到达网卡 NIC(Network Interface Card)

2 NIC 检验 MAC 网卡(网卡非混杂模式)和桢的校验字段 FCS

3 NIC 通过 DMA 将数据包放入提前映射好的内存区域

4 NIC 将数据包的引用放入接收的 ring buffer 队列 rx 中

5 NIC 等待 rx-usecs 的超时时间或者 rx 队列长度达到 rx-frames 后触发硬件中断 IRQ

6 CPU 执行硬件中断和网卡的驱动程序

7 驱动程序清理硬中断并触发软中断 NET_RX_SOFTIRQ

8 软中断对网卡进行轮训收包

9 数据包被放入 qdisc 队列

10 将数据包送入协议栈,调用 ip_recv

11 调用 netfilter 的 PREROUTING 链

12 查找路由表,进行转发或者投递到 local

13 对投递到 local 的数据包调用 netfilter 的 LOCAL_IN 链

14 调用四层协议栈,如 tcp_v4_rcv

15 查找到对应的 socket,运行 TCP 的状态机

16 将数据放入 TCP 的接收缓冲区中

17 通过 epoll 或者其他轮训方式通知应用程序

18 应用程序读取程序

混杂模式,不是 mac 不是本机的数据包也会处理。(虚拟机桥接模式、tcpdump wireshark 抓包)

硬件中断(不能被嵌套)处理时间过长,会触发软中断去执行

软中断执行 cpu 指令产生的中断

syscall、异常中断

半中断半轮训收包模式:数据包来了进入硬中断,然后进入软中断轮训收包,

socket 五元祖:协议,目的地址、目的端口、源地址、源端口

Linux 发包流程

1 应用数据发送程序

2 TCP 为发送的数据申请 skb

3 构建 TCP 头部,如 src 和 dst 的 port,checksum

4 调用第三层协议,构建 IP 头部,调用 netfilter 的 LOCAL_OUT 链

5 查找路由表

6 调用 netfilter 的 POST_ROUTING 链

7 对超时 MTU 的报文进行分片(fragment)

8 调用而成的发包函数 dev_queue_xmit

9 将待发数据包放入输出的 QDisc 队列

10 调用网卡驱动程序,将数据包放入循环缓冲队列 tx

11 驱动程序在 tx-usecs 的超时时间后,或者积累 tx-frames 个待发数据包后触发软中断

12 驱动程序启用网卡的硬件中断

13 驱动程序将数据包映射到 DMA 内存

14 网卡从 DMA 中取数据并发送

15 网卡发送完毕后触发硬件中断

16 硬中断清理中断信号后触发软中断

17 软中断释放已经发送玩的数据包的内存

Linux 防火墙

iptables

应用层规则管理工具和内核中的 table 模块(如 filter、nat)

iptables 命令

格式:iptables [-t table] command [chain][match][target]

例如:iptables -t filter -A INPUT -p tcp --sport 80 -j ACCEPT

|-table-|-cmd & chain-|-------match------|-target-|

系统自带 tables 包括 filter、nat、mangle,每个 table 包含一些系统自带的链或用户自建的链

默认使用 filter,表中包含 INPUT,FORWARD,OUTPUT 三条链(接收数据包、转发数据包、发送数据包)

常用的 target 是 ACCEPUT 和 DROP,DROP 和 REJECT 的区别就是 DROP 直接丢包,REJECT 会返回一个 ICMP 错误报文

简单命令:

1、查看设置,iptables -L -n [-t table_name]

2、清除 filter 表中的规则,iptables -F

3、设置默认策略,iptables -P [INPUT|OUTPUT|FORWARD][drop|accept]

一般会设置 accept,然后设置黑名单

iptables 匹配规则

1、匹配 IP 地址,source('-s' '--source' or '--src'), destination('-d' '--destination' or '--dst')

例如:iptables -A INPUT -s 10.10.10.0/24 -j DROP

2、逻辑取反,'!'表示 not,例如'-s!localhost'表示所有不是来自本机的数据包

3、指定源和目的网卡接口,'-i'(--in-interface'), '-o'(--out-interface)

4、高级拓展匹配,使用-p 或-m 加载协议模块和特殊功能模块,使用模块提供的更多匹配细节,可以使用-h 或者--help 获取帮助,如:iptables -p tcp -h

4.1 TCP 拓展匹配

--tcp-falgs,例如:iptables -A INPUT --protocol tcp --tcp-flags ALL SYN,ACK -j DROP

-- source-port 或--sport,对源端口匹配

--destination-port 或者--dport,对目的端口匹配

4.2 UDP 拓展匹配

提供--source-port --sport --destination-port --dport 与 TCP 相同

dnat 劫持数据,通过修改目的地址和目的端口,将数据发到本机,然后通过本机的应用程序,进行接收。

前言网络传输技术

TCP 拥塞控制算法

MSS:tcp 报文长度

cwnd:拥塞控制窗口

rtt:数据包在发送端和接收端来回时间

Tahoe 算法:

一阶段慢启动,指数增长,从 1 开始,

遇到超时发送窗口,从 1 开始,指数增长,然后到上次最大发送窗口的一般,进行线性增长

Reno 算法:

出现 3 次重传的时候,把自己的发送窗口缩小一定比例(1/2,1/3),然后线性增长,重传的 ACK 如果还是超时,然后从 1 开始,指数增长。

Cublic 算法:

packet loss: 丢包

Wmax: 最大发送窗口

三次曲线方式增加发送窗口,

BBR 算法:

通过对端的 ACK 确认机制,一秒中发送一定数量的包,然后看回来接收了多少包,然后包的数量除以时间就是带宽。

然后继续增大发送数据包,

直接测量当前带宽大小,通过对端返回的 ACK 包

HTTP

HTTP1.0

缺点:不能复用 tcp 连接,每个资源都要新建 tcp 连接,tcp 慢启动,速率很慢。

新建连接会造成性能压力

HTTP1.1(最主流)

改进:流水线 pipeline,复用连接。

前一个连接应答完成,才能进行发送下一个。文本协议不支持乱序

缺点:头部阻塞(前一个连接应答不完成,后面的都会等待)

HTTP2.0

改进:改成二进制协议,发送二进制的桢(文件切成片),支持乱序,解决头部阻塞

服务端主动 push,减少 rtt,提高加载速度

缺点:如果桢丢失,接收端 tcp 协议会等待,然后请求重传(ack 超时、三次确认),等接收到到完整数据,才把提交到应用层

HTTP3.0

改进:QUIC,使用 UDP,彻底解决头部阻塞

FEC:通过几个包计算除一个校验值,即使传输过程丢失了一个包,还能通过 FEC 和其他包,能算出这个包。