刷抖音网络是怎么交互的?
网络接入-互联网
网络接入-路由
- 路由一定是对称的吗?
- 路由工作在哪一层?
- 路由改的是 MAC,找到发包口
网络接入-ARP 协议
网络接入-ip 协议
网络接入-nat
网络传输-数据包
网络传输-数据包传送
网络传输-先请求 DNS
网络传输-DNS底层协议 UDP
网络传输-TCP 三次握手
TCP 传输中 Seq 和 ACk
刷抖音为什么又快又稳?
网络提速
- 多图并发下载
- 多路复用
- 网络提速-Quic/HTTP 3.0
-
数据中心分布:扩大数据中心的分布,来提高传播范围
-
同运营商访问策略:访问相同的运营商来提速
-
静态资源:CDN、缓存加速,但是需要考虑成本
- 网络提速:动态 API,优化请求路径
网络稳定
容灾案例
主动降级容灾
兜底策略容灾
故障排查
故障明确
故障止损
分段排查
常用操作
使用一些常用操作,如 dig 查询 dns 问题等,进行排查
总结
UDP Socket 实现 ack,感知丢包重传?
一、学会 UDP socket 编程
- 在 UDP 编程中,首先要创建套接字(socket),使用
socket()
函数,指定地址族(通常为 AF_INET 表示 IPv4)和套接字类型(SOCK_DGRAM 表示 UDP)。 - 绑定本地地址和端口(可选,如果不绑定,系统会自动分配),使用
bind()
函数。 - 发送数据使用
sendto()
函数,接收数据使用recvfrom()
函数,需要指定对方的地址信息。
二、先从简单的 ack 学习,客户端等待 ack 再发包
- 客户端发送一个数据报给服务器。
- 服务器收到数据报后,立即回复一个包含 ack 信息的数据包给客户端。
- 客户端在发送数据后,进入等待状态,等待服务器返回的 ack 包。如果在一定时间内(通过设置套接字超时时间实现)没有收到 ack,则认为数据丢失,重新发送数据。
三、什么时候客户端认为是丢包?
当客户端发送数据后,在预设的超时时间内没有收到服务器回复的 ack 包时,就认为数据包丢失。可以通过设置套接字选项SO_RCVTIMEO
和SO_SNDTIMEO
来控制接收和发送超时时间。
四、重传怎么考虑效率?
- 采用指数退避算法:第一次重传等待一个固定时间 T,第二次重传等待 2T,第三次等待 4T,以此类推,直到达到最大重传次数。
- 只重传未被确认的数据:记录已发送但未收到 ack 的数据报,有选择地进行重传,避免重复发送已经被确认的数据。
五、能不能不阻塞只穿丢掉的中间的段?
- 可以采用选择性重传(Selective Repeat)协议。在这种协议中,发送方和接收方都有一个缓冲区来存储发送和接收的数据。
- 接收方收到乱序的数据时,会将其放入缓冲区,并向发送方发送 ack,告知已经收到的数据序号。
- 发送方根据接收方的 ack 信息,只重传丢失的数据段,而不是从丢失数据段开始的所有后续数据段。这样可以在一定程度上避免阻塞,提高传输效率。
三台网段内的服务器,模拟实现一个路由器
方法一:Linux 操作系统配置方法
-
了解 Linux 的路由配置方式
- 在 Linux 中,路由配置主要通过
route
命令或修改网络配置文件来实现。route
命令可以用来查看、添加和删除路由表项。例如,route add -net [目标网络] netmask [子网掩码] gw [网关]
用于添加路由。 - 也可以编辑
/etc/sysconfig/network - scripts/ifcfg - [网卡名]
文件,添加GATEWAY=[网关IP]
来配置默认网关。
- 在 Linux 中,路由配置主要通过
-
确保是同网段直连可达的环境。在三台机器上另外配置 IP 网段和路由
- 首先,为每台机器配置同一网段的 IP 地址。例如,使用
ifconfig [网卡名] [IP地址] netmask [子网掩码]
命令。 - 然后,确保每台机器之间可以通过
ping
命令互相访问,验证网络连通性。 - 在每台机器上配置默认路由,指向正确的网关(如果有)。
- 首先,为每台机器配置同一网段的 IP 地址。例如,使用
-
一台机器做客户端,一台机器做路由器,一台机器做服务端
- 选择一台机器作为客户端,配置其默认网关为路由器的 IP 地址。例如,在客户端机器上执行
route add default gw [路由器IP]
。 - 选择另一台机器作为路由器,开启 IP 转发功能。在 Linux 中,编辑
/etc/sysctl.conf
文件,将net.ipv4.ip_forward = 1
,然后执行sysctl - p
使配置生效。 - 第三台机器作为服务端,配置其 IP 地址,并确保其网络服务正常运行。
- 选择一台机器作为客户端,配置其默认网关为路由器的 IP 地址。例如,在客户端机器上执行
-
客户端配置到达服务器的下一跳指向路由器,路由器上配置到达服务端的路由
- 在客户端上,添加到达服务端网段的路由,下一跳指向路由器的 IP 地址。例如,
route add - net [服务端网段] netmask [子网掩码] gw [路由器IP]
。 - 在路由器上,添加到达服务端网段的路由。例如,
route add - net [服务端网段] netmask [子网掩码] gw [服务端直接相连的接口IP]
。 - 客户端可以通过
ping
来验证是否可以访问服务端。如果配置正确,客户端可以成功ping
通服务端。
- 在客户端上,添加到达服务端网段的路由,下一跳指向路由器的 IP 地址。例如,
方法二:用户态 socket 编程实现简易 route 软件
-
收到指定的包后,做转发
- 使用用户态 socket 编程,创建原始套接字(
SOCK_RAW
)来捕获网络数据包。在 Linux 中,可以使用socket(AF_INET, SOCK_RAW, IPPROTO_RAW)
创建套接字。 - 当收到数据包时,解析数据包的目的 IP 地址。如果数据包的目的 IP 地址不是本地地址,则根据路由表将数据包转发到相应的下一跳。
- 转发数据包时,需要重新计算 IP 头的校验和等相关字段。
- 使用用户态 socket 编程,创建原始套接字(
-
注意是修改报文的 MAC。不是修改 IP
- 在转发数据包时,需要修改数据包的 MAC 地址。可以通过获取下一跳的 MAC 地址来实现。
- 使用
ARP
协议来获取下一跳的 MAC 地址。当收到一个需要转发的数据包时,首先检查本地ARP
缓存,如果没有对应的 MAC 地址,则发送ARP
请求来获取。 - 修改数据包的以太网头部(MAC 地址),而不修改 IP 头中的源 IP 和目的 IP 地址。
-
实现一个对称路由。这样可以实现 TCP 交互
- 为了实现对称路由,在处理 TCP 连接时,需要记录 TCP 连接的状态和相关信息。
- 当收到 TCP SYN 包时,建立一个连接状态表,记录源 IP、源端口、目的 IP、目的端口等信息。
- 当收到 TCP ACK 包时,根据连接状态表来判断是否是合法的连接,并进行相应的转发操作。这样可以确保 TCP 连接的双向交互能够正常进行。
-
可以通过 ping 来验证
- 在实现简易路由软件后,可以通过
ping
命令来验证网络连通性。从客户端向服务端发送ping
包,检查是否能够收到服务端的响应。 - 如果
ping
包能够成功转发并收到响应,说明简易路由软件的基本功能已经实现。
- 在实现简易路由软件后,可以通过
-
可以支持 traceroute 吗?
- 要支持
traceroute
,简易路由软件需要处理ICMP
的TTL
超时消息。 - 当收到一个
ICMP
的TTL
超时消息时,软件需要生成并返回一个ICMP
的TTL
超时响应给源主机。 - 在转发
ICMP
包时,需要递减TTL
字段,并在TTL
为 0 时生成TTL
超时消息。这样,traceroute
工具就可以正常工作,显示出经过的路由路径。
- 要支持
如何在路由器上配置端口转发?
写一个简单的C语言代码,实现模拟路由器的基本功能
如何测试模拟路由器的性能?