打开抖音互联网会发生什么? | 豆包MarsCode AI刷题

105 阅读7分钟

刷抖音网络是怎么交互的?

网络接入-互联网

image.png

image.png

网络接入-路由

  • 路由一定是对称的吗?
  • 路由工作在哪一层?
  • 路由改的是 MAC,找到发包口

网络接入-ARP 协议

image.png

网络接入-ip 协议

image.png

网络接入-nat

image.png

网络传输-数据包

image.png

网络传输-数据包传送

image.png

网络传输-先请求 DNS

image.png

网络传输-DNS底层协议 UDP

image.png

网络传输-TCP 三次握手

image.png

TCP 传输中 Seq 和 ACk

image.png

刷抖音为什么又快又稳?

网络提速

  • 多图并发下载

image.png

  • 多路复用

image.png

  • 网络提速-Quic/HTTP 3.0

image.png

  • 数据中心分布:扩大数据中心的分布,来提高传播范围 image.png

  • 同运营商访问策略:访问相同的运营商来提速 image.png

  • 静态资源:CDN、缓存加速,但是需要考虑成本

image.png

  • 网络提速:动态 API,优化请求路径

image.png

网络稳定

容灾案例

image.png

image.png

主动降级容灾

image.png

兜底策略容灾

image.png

故障排查

故障明确

image.png

故障止损

image.png

分段排查

image.png

常用操作

使用一些常用操作,如 dig 查询 dns 问题等,进行排查

image.png

总结

UDP Socket 实现 ack,感知丢包重传?

image.png

一、学会 UDP socket 编程

  1. 在 UDP 编程中,首先要创建套接字(socket),使用socket()函数,指定地址族(通常为 AF_INET 表示 IPv4)和套接字类型(SOCK_DGRAM 表示 UDP)。
  2. 绑定本地地址和端口(可选,如果不绑定,系统会自动分配),使用bind()函数。
  3. 发送数据使用sendto()函数,接收数据使用recvfrom()函数,需要指定对方的地址信息。

二、先从简单的 ack 学习,客户端等待 ack 再发包

  1. 客户端发送一个数据报给服务器。
  2. 服务器收到数据报后,立即回复一个包含 ack 信息的数据包给客户端。
  3. 客户端在发送数据后,进入等待状态,等待服务器返回的 ack 包。如果在一定时间内(通过设置套接字超时时间实现)没有收到 ack,则认为数据丢失,重新发送数据。

三、什么时候客户端认为是丢包?

当客户端发送数据后,在预设的超时时间内没有收到服务器回复的 ack 包时,就认为数据包丢失。可以通过设置套接字选项SO_RCVTIMEOSO_SNDTIMEO来控制接收和发送超时时间。

四、重传怎么考虑效率?

  1. 采用指数退避算法:第一次重传等待一个固定时间 T,第二次重传等待 2T,第三次等待 4T,以此类推,直到达到最大重传次数。
  2. 只重传未被确认的数据:记录已发送但未收到 ack 的数据报,有选择地进行重传,避免重复发送已经被确认的数据。

五、能不能不阻塞只穿丢掉的中间的段?

  1. 可以采用选择性重传(Selective Repeat)协议。在这种协议中,发送方和接收方都有一个缓冲区来存储发送和接收的数据。
  2. 接收方收到乱序的数据时,会将其放入缓冲区,并向发送方发送 ack,告知已经收到的数据序号。
  3. 发送方根据接收方的 ack 信息,只重传丢失的数据段,而不是从丢失数据段开始的所有后续数据段。这样可以在一定程度上避免阻塞,提高传输效率。

三台网段内的服务器,模拟实现一个路由器

方法一:Linux 操作系统配置方法

  1. 了解 Linux 的路由配置方式

    • 在 Linux 中,路由配置主要通过route命令或修改网络配置文件来实现。route命令可以用来查看、添加和删除路由表项。例如,route add -net [目标网络] netmask [子网掩码] gw [网关]用于添加路由。
    • 也可以编辑/etc/sysconfig/network - scripts/ifcfg - [网卡名]文件,添加GATEWAY=[网关IP]来配置默认网关。
  2. 确保是同网段直连可达的环境。在三台机器上另外配置 IP 网段和路由

    • 首先,为每台机器配置同一网段的 IP 地址。例如,使用ifconfig [网卡名] [IP地址] netmask [子网掩码]命令。
    • 然后,确保每台机器之间可以通过ping命令互相访问,验证网络连通性。
    • 在每台机器上配置默认路由,指向正确的网关(如果有)。
  3. 一台机器做客户端,一台机器做路由器,一台机器做服务端

    • 选择一台机器作为客户端,配置其默认网关为路由器的 IP 地址。例如,在客户端机器上执行route add default gw [路由器IP]
    • 选择另一台机器作为路由器,开启 IP 转发功能。在 Linux 中,编辑/etc/sysctl.conf文件,将net.ipv4.ip_forward = 1,然后执行sysctl - p使配置生效。
    • 第三台机器作为服务端,配置其 IP 地址,并确保其网络服务正常运行。
  4. 客户端配置到达服务器的下一跳指向路由器,路由器上配置到达服务端的路由

    • 在客户端上,添加到达服务端网段的路由,下一跳指向路由器的 IP 地址。例如,route add - net [服务端网段] netmask [子网掩码] gw [路由器IP]
    • 在路由器上,添加到达服务端网段的路由。例如,route add - net [服务端网段] netmask [子网掩码] gw [服务端直接相连的接口IP]
    • 客户端可以通过ping来验证是否可以访问服务端。如果配置正确,客户端可以成功ping通服务端。

方法二:用户态 socket 编程实现简易 route 软件

  1. 收到指定的包后,做转发

    • 使用用户态 socket 编程,创建原始套接字(SOCK_RAW)来捕获网络数据包。在 Linux 中,可以使用socket(AF_INET, SOCK_RAW, IPPROTO_RAW)创建套接字。
    • 当收到数据包时,解析数据包的目的 IP 地址。如果数据包的目的 IP 地址不是本地地址,则根据路由表将数据包转发到相应的下一跳。
    • 转发数据包时,需要重新计算 IP 头的校验和等相关字段。
  2. 注意是修改报文的 MAC。不是修改 IP

    • 在转发数据包时,需要修改数据包的 MAC 地址。可以通过获取下一跳的 MAC 地址来实现。
    • 使用ARP协议来获取下一跳的 MAC 地址。当收到一个需要转发的数据包时,首先检查本地ARP缓存,如果没有对应的 MAC 地址,则发送ARP请求来获取。
    • 修改数据包的以太网头部(MAC 地址),而不修改 IP 头中的源 IP 和目的 IP 地址。
  3. 实现一个对称路由。这样可以实现 TCP 交互

    • 为了实现对称路由,在处理 TCP 连接时,需要记录 TCP 连接的状态和相关信息。
    • 当收到 TCP SYN 包时,建立一个连接状态表,记录源 IP、源端口、目的 IP、目的端口等信息。
    • 当收到 TCP ACK 包时,根据连接状态表来判断是否是合法的连接,并进行相应的转发操作。这样可以确保 TCP 连接的双向交互能够正常进行。
  4. 可以通过 ping 来验证

    • 在实现简易路由软件后,可以通过ping命令来验证网络连通性。从客户端向服务端发送ping包,检查是否能够收到服务端的响应。
    • 如果ping包能够成功转发并收到响应,说明简易路由软件的基本功能已经实现。
  5. 可以支持 traceroute 吗?

    • 要支持traceroute,简易路由软件需要处理ICMPTTL超时消息。
    • 当收到一个ICMPTTL超时消息时,软件需要生成并返回一个ICMPTTL超时响应给源主机。
    • 在转发ICMP包时,需要递减TTL字段,并在TTL为 0 时生成TTL超时消息。这样,traceroute工具就可以正常工作,显示出经过的路由路径。

如何在路由器上配置端口转发?

写一个简单的C语言代码,实现模拟路由器的基本功能

如何测试模拟路由器的性能?