探索计算机网络——了解通信的机制

80 阅读11分钟

课程依赖

  • Linux/操作系统
  • Wireshark软件
  • Socket 网络编程开发环境

网络接入

网络接入—互联网

image.png

网络接入—路由

image.png

image.png

路由一定是对称的?

image.png

路由是工作在哪一层协议?

  • 传输层

image.png

路由是改的IP地址吗?

路由是改MAC,找到发包口,路由过程中源IP地址和目标IP地址是不会改变的,只会改变源MAC地址和目标MAC地址

image.png

  • 动态路由BGP/OSPF等

怎么找下一跳的MAC地址呢?

ARP协议

网络接入—ARP协议

  • 逻辑同网段才能发送ARP
  • ARP请求广播,ARP应答单播
  • 免费ARP?ARP代理?

ARP代理:中介的作用,存放IP和MAC地址对应的地方,扩充边界

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

抖音客户端怎么请求到服务器?

  • 因为同网段才能发送ARP,所以是在网络中不断的ARP路由跳转

网络接入—网络IP协议

  • 唯一标识,互联网通用。抖音客户端一个,抖音服务端一个。

  • MAC地址不能代理IP地址吗?

    • MAC不方便记忆,IP更方便记忆
    • MAC是二层的协议,二层不仅仅只有MAC协议,在很早之前的网络设备可能不支持MAC协议,为了所有的设备都能够使用网络,向上定义了一层IP层,统一不同的协议
  • IPv4不够用,一般怎么解决?

    • IPv6扩充
    • NAT(路由器原理)

网络接入—NAT

  • 家里路由器是怎样上网的?

本质上就是NAT,NAT的原理大致是:内部的用户通过一个NAT的设备,修改源地址,内部局域网的地址都是192.xxx.xxx.xxx,连接到互联网外部地址都是一个全局唯一的外网地址

  • 多个内网客户端访问同一个目标地址+端口,源端口恰好一样,冲突了?

NAT是改变IP加端口(使用端口号的NAT也叫做NAPT),在NAT设备上维护一张表,当存在冲突的连接,NAT维护在外网开启不同的端口处理,然后分别映射到内网中访问冲突的请求

网络传输—数据包

之前都是介绍网络打通的过程,网络打通了数据怎么进行下载呢?数据包

image.png

image.png

网络传输—先请求DNS

  • 客户端发 www.baidu.com 的解析请求
  • 递归解析器去问 ".",com. 去哪里解析
  • 递归解析器去问 "com.",douyin.com 去哪里解析
  • douyin.com 告诉递归解 www.douyin.com 解析到xxx

image.png

网络传输—DNS的传输协议UDP

UDP本身相对简单

image.png

总结:想发什么包,就分配一个UDP的头,把payload里面塞数据发出去就好!

  • DNS场景比较简单,发送DNS数据包,如果失败了就重发

UDP用好很难

  • 发包每次发多少?怎么避免分片?

MTU传输有限制,数据量大的话必须要分片,分片要消耗计算机资源,发送方分片i计算,接收方接收

  • 怎么知道没有丢包?
  • 怎么权衡传输效率和质量?
  • ...

总结:怎么保证协议可靠?

网络传输—TCP三次握手

image.png

拔了网线,连接会断吗?

如果有探活(keep-alive),每隔指定时间发送探测是否正常连接,假如网线断开了,那么无法收到ack,那么就可以认为连接断开了,拔了网线是否会断开主要看是否具有TCP的保活

你真的了解TCP三次握手吗?

  • 确保双方发送和连接都正常
  • 同步双方的序列号和发送窗口等,确保双方都已经正确的建立连接
  • 防止复用异时的连接
  • 分片长度确认机制:TCP MSS(Maximum Segment Size,最大报文长度),zhuanlan.zhihu.com/p/139537936,需要确定双方都能够支持的MSS,如果中间还有代理网络服务器,需要三方都支持

网络传输—TCP传输

  • sequence number:表示的是我方(发送方)这边,这个packet的数据部分的第一位应该在整个data stream中所在的位置
  • acknowledge number:表示的是期望的对方(接收方)的下一次sequence number是多少。注意SYN/FIN的传输虽然没有data,但是会让下一次传输的packet seq增加一,但是,ACK的传输,不会让下一次的传输packet加一。(实际建立连接的时候seq不为0,这里为了方便表示为0)

image.png

image.png

为什么老问你Timewait?

  • 首先timewait状态比较复杂,确保连接正常关闭,防止前一次ACK丢失(如果前一次ACK丢失,那么在2MSL(最长报文寿命)时间内就会再次收到服务端的FIN,就要刷新Timewait状态,重新向服务端发送ACK)
  • 以Linux服务器为例子,有两个字段time_wait_recycle和time_wait_reuse,再次连接可以不用进行三次握手,直接复用之前的连接,但是存在一定的风险
  • 这是一个协议里面规定了的机制,但是会经常影响效率的地方,一旦服务器或者客户端有太多的time_wait,会占用端口影响效率,所以使用time_wait_recycle和time_wait_reuse在一定程度上提高效率

丢包怎么办

重传,判断丢包就是ACK机制

滑动窗口再结合基础概念去理解

流量控制/拥塞控制结合基础概念去理解

网络传输—HTTP/HTTP1.1

为什么不直接用TCP通信呢?

  • TCP负责的内容已经够多了,让开发这能够更关注代码和业务的实现,而不是去关注于TCP数据传输,HTTP做好了和TCP交互的原则

image.png

为什么互联网上那么多HTTP通信?

其实HTTP只是多加了一层规矩。HTTP依然是TCP,只是这个规矩让用户更清晰/更简洁。

HTTP1.1哪些优化?

  • 长连接
  • 部分传输
  • HOST
  • 缓存

网络传输—HTTPS

传输中被插入小网站怎么办?

HTTPS解密出来依然是HTTP

image.png

网络传输—SSL/TLS握手

SSL类似于TCP的三次握手,在HTTP链接建立之前进行四次握手,从而客户度和服务端沟通好HTTP传输时对称加密的密钥,大致过程如下图:

image.png

1、客户端请求建立SSL链接,并向服务端发送一个随机数–Client random和客户端支持的加密方法,比如RSA公钥加密,此时是明文传输。

2、服务端回复一种客户端支持的加密方法、一个随机数–Server random、授信的服务器证书和非对称加密的公钥。

3、客户端收到服务端的回复后利用服务端的公钥,加上新的随机数–Premaster secret 通过服务端下发的公钥及加密方法进行加密,发送给服务器。

4、服务端收到客户端的回复,利用已知的加解密方式进行解密,同时利用Client random、Server random和Premaster secret通过一定的算法生成HTTP链接数据传输的对称加密key – session key。

对称加密和非对称加密

image.png 确保没有劫持,也确保私匙不泄密

image.png

网络架构怎么给抖音提质

网络提速

HTTP2.0

多路复用,并行的下载,并行的去访问

image.png

怎么理解多路复用/stream?

image.png TCP本质上只能一个包一个包的传送,当网络传输质量很好的时候,TCP传一个包接着就传下一个包,在我们应用层看起来就像是在并行stream1、2、3都在进行传送,但其实在TCP传输过程中还是一个包一个包进行传输

单个TCP链接传输

如果TCP丢包怎么办?

专业的说法对头阻塞,一旦发生了丢包,就会一直重传这个包,后面哪些包都要等待,需要重传成功之后,后面的包才能继续发送,这种情况是灾难性的,上层做的多路复用就无法体现,TCP针对这个 场景也有很多优化(例如TCP首部的option字段,可以指定需要重传的的报文段,哪个地方丢失了重传哪个地方就行了,不需要阻塞在哪里,但是本质上没有解决对头阻塞的问题)

QUIC/HTTP3.0

谷歌提出的QUICK协议,也逐渐发展成了HTTP3.0

TCP or UDP?

TCP协议本身比较复杂,并且已经非常流行了,如果对TCP协议进行修改将会影响很多设备,所以选择基于UDP去设计

Kernel or Userspcae

到底是在内核层去实现还是用户层去实现呢?

Kernel层需要考虑适配不同的系统windows、linux、ios,综合考虑做在了用户态userspace里面,在这个层面上去实现可靠传输和解决TCP传输中出现对头阻塞的问题

0 RTT

image.png 类似于session共享的机制:QUICK天然支持类似HTTPS的协议,HTTPS有SSL/TLS握手,非对称加密的握手类

详细请看这个介绍:cloud.tencent.com/developer/a…

弱网优势

一旦弱网环境出现丢包,出现对头阻塞,那么HTTP2.0所做的优化都没有效果,具体是基于UDP去实现可靠传输和解决对头阻塞,详细需要再多了解

除了协议优化?网络路径能不能优化呢?

  • CDN
  • DSA

数据中心分布

  • 核心机房:用户敏感数据、数据库(MySQL、MongoDB)等等
  • POP接入:主要和运营商去接入网络,增加和互联网交互的出入口,可能POP机房有100多个,核心机房就只有几十个
  • 边缘机房:更靠近用户,在例如不同城市就有移动、电信、联通和其他小型运营商的小型机房,

image.png

同运营商访问

  • 针对我国的网络现状,跨运营商访问质量会比较差
  • 针对客户端ip进行解析,解析到对应的运营商接入

image.png

静态资源(图片视频)路径优化(CDN)

本质商是一个静态的缓存系统

image.png

动态API(播放/评论接口)路径优化(DSA)

每个机房对其他机房做延迟探测,并且记录数据做成一张表,通过这张表结合算法做一个最优路径计算

image.png 刷的快,但是三天两天挂掉,谁刷抖音?

网络稳定

容灾概念

  • 故障发生
  • 故障感知
  • 自动切换
  • 服务恢复
网络容灾的具体案例一

专线比较快速直接,在互联网上比较乱,可能存在上海访问江苏,实际的访问路径为上海—>北京—>江苏

微服务部署可能存在跨机房调用,一般部署的时候走专线,并且做好外网容灾的考虑

image.png

网络容灾的具体案例二
  • 首先故障感知确定机房A挂掉了
  • 然后探测一下机房B是否可以承受机房A的流量
  • 如果可以承受将流量请求切换到机房B
  • 如果不能承受再考虑其它切换

image.png

网络容灾的具体案例三

不可用场景:

  • 云控系统宕机
  • SDK 需要授权,需要用户运行
  • 浏览器页面,不可以嵌入SDK,无法控制客户端

image.png

网络容灾的具体案例四

服务降级,把上一次访问的数据继续返回给客户端

image.png 没有容灾的故障怎么查?

故障排查

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

出现什么故障?->沟通是前提

  • 什么业务?什么接口故障?
  • 故障体现再哪里?
  • 访问其他目标是否正常?
  • 是否是修改导致的异常?
故障止损
  • 先止损再排查

    • 用户体验第一
    • 对公司的收入的影响是按照分钟甚至秒来计算
  • 如何止损

    • 组件没有容灾,但是系统有没有?
    • 降级
分段排查
  • 客户端排查

    • 客户端访问其他服务没问题吗?
    • 其他客户端访问目标服务没问题吗?
  • 服务端排查

    • 服务端监控/指标都正常吗?
    • 手动访问—下正常吗?
    • 分组件排查
  • 中间链路排查

    • 服务端跟客户端确保都没有问题
    • 中间网络设备有没有问题?(交换机/路由器/网关LB)
    • 旁路DNS有没有问题?
网络故障排查常用命令
  • dig查询dns问题
  • ping/telnet/nmap查询三层/四层连通性
  • Traceroute排查中间链路
  • iptables(客户端防火墙)
  • tcpdump(客户端服务端抓包)
网络故障排查案例一

image.png

网络故障排查案例二

image.png

网络故障排查案例三

image.png

网络故障排查案例四

image.png

故障预防很重要

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

总结

image.png