【计网】访问web时发生了什么

118 阅读6分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第21天,点击查看活动详情

1.网络接入

1.1 路由

同网段如何发包/交互:

把目标ip的MAC地址改成目标ip查询到返回的MAC地址

跨网段:走ip对应的网关(一般是连接的路由器的ip),没有匹配的话就走默认网关

路由对称吗?不一定,可以一个路径去另一个路径返回

路由的工作: 源IP地址和⽬标IP地址在传输过程中是不会变化的,只有源 MAC 地址和⽬标 MAC ⼀直在变化。

发包的时候要指定网卡才能发

动态路由BGF/OSPF等

1.2 ARP协议

怎么找到下一跳MAC:ARP协议

ARP本质上是查找下一跳MAC,不是请求目标地址

逻辑同网段才能发送ARP,首先ARP请求广播(不能跨网段),然后ARP应答单播(只有对应主机才回复)

免费ARP:不用请求就告诉ARP地址,比如新增服务器的时候
ipv6也有类似免费ARP的,新增ip时发送出去,防止ip冲突(同网段有相同ip)

ARP代理:中间设备抢先回应ARP请求,劫持ARP请求发往另外的地方,虚拟网络相关

1.3 IP协议:

为什么MAC地址不能代替IP地址? MAC协议是二层协议,无法向下兼容,因此封装了ip向下兼容所有二层协议。

ipv4不够用的解决方案:ipv6,NAT

1.4 NAT

NAT(Network Address Translation),是指网络地址转换

NAT把ip和端口都进行了改变,因为多个内网客户端访问同一个目标地址+端口,源端口恰好一样,冲突了,此时就改变NAT主机的源端口

1.5 数据包发送流程

image.png

1.6 DNS

请求DNS的过程:
客户端发www.douyin.com 网址解析请求
递归解析器去问".",com.去哪里解析
递归解析器去问"com.",douyin.com去哪里解析
douyin.com告诉递归解 www.douvin.com 解析到xxx

1.7 UDP

UDP用好很难,发包因为最大传输单元(Maximum Transmission Unit,MTU)限制,需要分片,而分片发送后需要重组,这两个操作都要消耗资源,UDP不知道有没有丢包,不可靠 image.png 协议使用:想发什么包,就分配一个UDP的头,把payload里面塞数据发出去就好

1.8 TCP

三次握手

通过MSS避免大多数的分片情况,在TCP option字段(比较重要,通过握手进行交互)当中,握手时取双方MSS最小值
MSS(Maximum Segment Size,最大报文长度),是TCP协议定义的一个选项,MSS选项用于在TCP连接建立时,收发双方协商通信时每一个报文段所能承载的最大数据长度。

TCPdump+wireshark了解

1.9 TCP传输

Seq ACK
sequence number:表示的是我方(发送方)这边,这个packet的数据部分的第一位应该在整个data stream中所在的位置。

acknowledge number:表示的是期望的对方(接收方)的下一次sequence number是多少。注意,SYN/FIN的传输虽然没有data,但是会让下一次传输的packet seq增加一,但是,ACK的传输,不会让下一次的传输packet加1

image.png

Timewait问题: 确保连接正常关闭,前一次的包在网络里消失,防止旧数据报干扰 Windows有Timewait recycle和Timewait reuse字段,有时影响效率,占用端口

丢包怎么办?
重传。

如何判断丢包? ACK相关

活动窗口

流量控制/拥塞控制

1.10 HTTP/HTTP1.1

为什么不直接用TCP而是HTTP?
HTTP依然是TCP,只是加了一些规范,分层,关注业务本身利于编程,让用户更清晰更简洁

HTTP1.1的优化:长连接(不用每次get post都重新建立HTTP)、部分传输、HOST、缓存

1.11 HTTPS

HTTPS解密出来依然是HTTP

使用SSL/TLS握手进行加密,确保没有劫持,也确保私钥不泄露 先做非对称加密即SSL/TLS握手,后面再做对称加密,非对称加密把对称加密的算法再加密

CA是证书的签发机构,它是公钥基础设施(Public Key Infrastructure,PKI)的核心。CA是负责签发证书、认证证书、管理已颁发证书的机关。

image.png

2.网络架构质量提升和优化

2.1 网络提速

2.1.1 协议优化-HTTP2.0

在一个TCP连接上跑多个HTTP

image.png 这里进行了多路复用/stream 同一个TCP连接通道多个stream串行(因为包是1个1个发)

TCP丢包怎么办? 会发生TCP队头阻塞,TCP option中指定ACK序列号(SACK),以确定重传的包减轻问题

2.1.2 协议优化-HTTP3.0/QUIC

TCP or UDP? TCP不可插拔,TCP拥塞算法才可以,因此在UDP上改进,做到TCP那样可靠
Kernel or Userspace? Userspace,因为Kernel不统一很难改
0 RTT 传输
弱网传输优势,避免队头阻塞

2.3 网络路径优化

数据中心分布 有核心机房、边缘机房等

同运营商访问(智能解析ip,访问同运营商的机房较快)

CDN静态资源(图片视频)路径优化,寻找方向边缘机房→汇聚机房→边缘机房,看每个机房有无缓存(比如别人访问过的缓存)

动态API(播放、评论接口)路径优化(DSA) 考虑延时的dp

2.2 网络稳定

2.2.1 容灾

故障发生 故障感知 自动切换 服务恢复

案例一:专线-外网容灾

专线比Internet快,专线挂了通过外网Internet容灾 image.png

案例二:调度容灾

做自动化计算切流量,防止雪崩 image.png

案例三:

通过SDN让客户端不要访问机房,做降级容灾
缺陷:浏览器很难做SDN控制用户访问的域名 image.png

案例四:

发现后面不通时,响应之前的缓存 降级,把上一次响应的数据继续返回去 image.png

2.2.2 故障排查

故障明确 故障止损 分段排查

故障明确

  • 什么业务?什么接口故障?

故障体现在哪里?

  • 访问其他目标是否正常?
  • 是否是修改导致的异常?

故障止损

先止损再排查

  • 用户体验第一
  • 对公司收入的影响是按照分钟甚至秒来计算 如何止损
  • 组件没有容灾,但是系统有没有?
  • 降级

分段排查

客户端排查

  • 客户端访问其他服务没问题吗?。
  • 其他客户端访问目标服务没问题吗? 服务端排查
  • 服务端监控/指标都正常吗?
  • 手动访问一下正常吗?
  • 分组件排查 中间链路排查
  • 中间网络设备有没有问题?
  • (交换机/路由器/网关LB)·旁路的DNS有没有问题?

排查常用命令

  • dig查询DNS问题
  • ping/telnet/nmap查询三层/四层连通性
  • Traceroute排查中间链路
  • iptabels
  • tcpdump

2.2.3 故障预防措施

监控报警 故障演练/预案 故障降级/止损

3.零散记录

socket是http的一种实现方式,很多框架都通过socket实现,是一种实现方式

iptables包的过滤传输 ipvs负载均衡基于netfilter

拆包和分包

网络虚拟化,同网段交换机接了很多物理机,虚拟化交换机和虚拟网卡、虚拟链路给虚拟机

一些名词:NAT LB负载均衡 MTU MSS等 SDN CDN websocket 动态路由协议 MAC地址