前几天看了【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 的二层网络设备,无线网络的交换机,支持移动终端在多个接入点无缝漫游。
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 五元祖:协议,目的地址、目的端口、源地址、源端口
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 软中断释放已经发送玩的数据包的内存
应用层规则管理工具和内核中的 table 模块(如 filter、nat)
格式: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,然后设置黑名单
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 劫持数据,通过修改目的地址和目的端口,将数据发到本机,然后通过本机的应用程序,进行接收。
MSS:tcp 报文长度
cwnd:拥塞控制窗口
rtt:数据包在发送端和接收端来回时间
Tahoe 算法:
一阶段慢启动,指数增长,从 1 开始,
遇到超时发送窗口,从 1 开始,指数增长,然后到上次最大发送窗口的一般,进行线性增长
Reno 算法:
出现 3 次重传的时候,把自己的发送窗口缩小一定比例(1/2,1/3),然后线性增长,重传的 ACK 如果还是超时,然后从 1 开始,指数增长。
Cublic 算法:
packet loss: 丢包
Wmax: 最大发送窗口
三次曲线方式增加发送窗口,
BBR 算法:
通过对端的 ACK 确认机制,一秒中发送一定数量的包,然后看回来接收了多少包,然后包的数量除以时间就是带宽。
然后继续增大发送数据包,
直接测量当前带宽大小,通过对端返回的 ACK 包
缺点:不能复用 tcp 连接,每个资源都要新建 tcp 连接,tcp 慢启动,速率很慢。
新建连接会造成性能压力
改进:流水线 pipeline,复用连接。
前一个连接应答完成,才能进行发送下一个。文本协议不支持乱序
缺点:头部阻塞(前一个连接应答不完成,后面的都会等待)
改进:改成二进制协议,发送二进制的桢(文件切成片),支持乱序,解决头部阻塞
服务端主动 push,减少 rtt,提高加载速度
缺点:如果桢丢失,接收端 tcp 协议会等待,然后请求重传(ack 超时、三次确认),等接收到到完整数据,才把提交到应用层
改进:QUIC,使用 UDP,彻底解决头部阻塞
FEC:通过几个包计算除一个校验值,即使传输过程丢失了一个包,还能通过 FEC 和其他包,能算出这个包。