学计算机的那个

不是我觉到、悟到,你给不了我,给了也拿不住;只有我觉到、悟到,才有可能做到,能做到的才是我的.

0%

网络模型和常见协议

TCP/IP五层模型 VS OSI参考模型

1
2
3
4
5
6
7
应用层 文件传输,电子邮件,文件服务,虚拟终端 TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet
表示层 数据格式化,代码转换,数据加密 没有协议
会话层 解除或建立与别的接点的联系 没有协议
传输层 提供端对端的接口 TCP,UDP
网络层 为数据包选择路由 IP,ICMP,RIP,OSPF,BGP,IGMP
数据链路层 传输有地址的帧以及错误检测功能 SLIP,CSLIP,PPP,ARP,RARP,MTU
物理层 以二进制数据形式在物理媒体上传输数据 ISO2110,IEEE802,IEEE802.2

数据链路层

ARP

IP地址和MAC地址

MAC地址是数据链路层和物理层使用的地址,而IP地址是网络层和以上各层使用的地址,是一种逻辑地址

使用IP地址的IP数据报一旦交给了数据链路层,就被封装成了MAC帧,MAC帧在传送时使用的原地址和目的地址都是硬件地址,连接在通信链路上的设备(主机或者路由器)在接收MAC帧时,根据是MAC帧首部的硬件地址

1
2
IP地址本质上是终点地址,它在跳过路由器的时候不会变(NAT(Network address translation)例外)
MAC地址则是下一跳的地址,每跳过一次路由都会改变。

ARP地址解析协议

地址解析协议,基本功能是透过目标设备的IP地址,查询目标设备的MAC地址

每台安装有TCP/IP协议的主机里都有一个ARP缓存表,表里的IP地址与MAC地址是一一对应的

当主机A要向主机B发送IP数据报时,就先在其ARP高速缓存中查找有无主机B的IP地址,如果有,就把硬件地址写入MAC帧,然后通过局域网把该MAC帧发往此硬件地址。

没有就会按照如下步骤找出主机B的硬件地址

  1. 主机A,B在同一个局域网的时候,ARP广播发送一个ARP请求分组

    主机B在ARP分组中见到自己的IP地址,就会响应分组,并写入自己的硬件地址

  2. 主机A,B不在同一个局域网的时候,此时发送主机通过ARP协议获得的将不是目的主机的真实MAC地址,而是当前路由器的MAC地址 这种情况称为委托ARP或ARP代理。

同网段和不同网段设备通信原理

通信实现的前提是拥有双方的IP地址和MAC地址

主机A与主机B通信,已知A的IP地址,MAC地址,B的IP地址,通过ARP获取主机B的MAC地址

网络层

ICMP协议

IP协议并不提供可靠传输,如果丢包了,IP协议并不能通知传输层是否丢包,以及丢包原因。ICMP可以完成这样的功能

  1. 确认IP包是否成功到达目标地址。
  2. 通知在发送过程中IP包被废弃的具体原因。

IP通信中如果某个IP包因为某种原因未能到达目标地址,那么这个具体原因将由ICMP负责通知

  • ICMP消息类型

ICMP超时消息

IP包中有一个字段TTL(Time To Live,生存周期),它的值随着每经过一次路由器就会减1,直到0时该IP包就会被丢弃,此时IP路由器将会发送一个ICMP超时的消息给发送端主机,并通知该包已被丢弃。

  • traceroute
    可以显示出由执行程序的主机到达特定主机之前历经多少路由器。原理就是利用IP包的TTL从1开始按照顺序递增的同时发送UDP包,强制接收ICMP超时消息的一种方法,这样可以将所有路由器的IP地址逐一呈现。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Jack-Mac-mini:~ Jack$ traceroute www.baidu.com
traceroute to www.baidu.com (14.215.177.39), 64 hops max, 52 byte packets
1 xiaoqiang (192.168.31.1) 2.367 ms 1.271 ms 1.048 ms
2 192.168.1.1 (192.168.1.1) 1.821 ms 1.886 ms 1.760 ms
3 100.64.0.1 (100.64.0.1) 4.640 ms 4.539 ms 5.622 ms
4 202.105.158.97 (202.105.158.97) 30.972 ms
53.187.37.59.broad.dg.gd.dynamic.163data.com.cn (59.37.187.53) 4.616 ms
202.105.154.165 (202.105.154.165) 3.564 ms
5 119.145.47.85 (119.145.47.85) 4.626 ms
202.105.106.37 (202.105.106.37) 7.971 ms *
6 113.96.5.38 (113.96.5.38) 16.189 ms
113.96.4.246 (113.96.4.246) 8.064 ms
113.96.0.18 (113.96.0.18) 11.310 ms
7 113.96.11.74 (113.96.11.74) 8.232 ms 6.788 ms 9.168 ms
8 121.14.67.130 (121.14.67.130) 9.790 ms
14.215.32.90 (14.215.32.90) 10.042 ms 8.760 ms
9 * * *

ICMP回送消息

用于通信的主机或路由器之间,判断所发送的数据包是否已经成功到达对端的一种消息,网络上常用的ping命令就是利用这个消息实现的。

IP协议

IP分割与重组

在数据链路层,每一条数据链路都有它的最大传输单元MTU,所以如果你传输的数据包大于数据链路层的最大传输单元,就需要对它进行分割。

如图,由于以太网的默认MTU是1500字节,因此4342字节的IP数据报无法在一个帧当中发送完成,这时路由器将此IP数据报划分成了3个分片进行发送。

经过分片之后的IP数据报在被重组的时候,只能由目标主机进行。路由器虽然做分片但不会进行重组。因为无法保证IP数据报是否经由同一个路径传送

路径MTU发现

分片机制的不足:

  1. 加重路由器的负荷
  2. 一旦某个分片丢失,则会导致整个IP数据报作废

路径MTU:是指从发送端主机到接收端主机之间不需要分片时最大MTU的大小,即路径中存在的所有数据链中最小的MTU,就可以避免在中途的路由器上进行分片处理。

  • 路径MTU发现的原理 1.首先发送端发送IP数据报时将其首部的分片禁止标志位设置1,根据这个标志位,路由器遇到需要分片才能处理的大包,也不会去分片,而是将包丢弃。
  1. 丢弃的时候,ICMP会回送一个不可达消息将数据链路上的MTU的值发送主机
  2. 发送给同一个目标主机的IP数据报会设置步骤2获取到的MTU为当前MTU,发送主机会根据这个MTU对数据报进行分片处理。如此反复,直到数据报被发送到目标主机为止,没有再收到任何ICMP,就认为最后一次ICMP所通知的MTU即是一个合适MTU。一般会缓存10分钟

应用层协议

DNS协议

DNS 是域名到 IP 地址的映射,DNS 解析使用 UDP 数据报,端口号53,并且采用明文传输的方式
客户端在向服务端发送请求时,会先将 域名 到 DNS 服务器映射出 IP 地址,然后再访问。

Mac系统下更改host文件

1
sudo vi /etc/hosts

DNS 解析的两种方式

  • 递归查询 (用户向本地 DNS 服务器发起请求)

不断地自下而上遍历解析,“我去给你问一下”的方式

主机向本地域名服务器的查询采用递归查询,如果主机所询问的本地域名服务器不知道被查询域名的IP地址,那么本地域名服务器就以DNS客户的身份,向根域名服务器继续发出查询请求报文,而不是让主机自己进行下一步查询。因此,递归查询返回的结果或者是要查询的IP地址,或者是报错,表示无法查询到所需的IP地址。

  • 迭代查询 (本地 DNS 服务器向各级域名服务器发起请求)

迭代查询 是 “我告诉你谁可能知道”的方式

本地域名服务器向根域名服务器的查询通常采用迭代查询,当根域名服务器收到本地域名服务器发出的迭代查询请求报文是,要么给出所要查询的IP地址,要么告诉域名服务器下一步要向哪个域名服务器进行查询。然后本地域名服务器继续进行下一步查询。

DNS优化与应用

  1. DNS缓存
    DNS存在着多级缓存,从离浏览器的距离排序的话,有以下几种: 浏览器缓存,系统缓存,路由器缓存,IPS服务器缓存,根域名服务器缓存,顶级域名服务器缓存,主域名服务器缓存。

  2. DNS负载均衡(DNS重定向) DNS负载均衡技术的实现原理是在DNS服务器中为同一个主机名配置多个IP地址,在应答DNS查询时, DNS服务器对每个查询将以DNS文件中主机记录的IP地址按顺序返回不同的解析结果,将客户端的访问 引导到不同的机器上去,使得不同的客户端访问不同的服务器,从而达到负载均衡的目的

1
2
3
CDN(Content Delivery Network)就是利用DNS的重定向技术,DNS
服务器会返回一个跟 用户最接近的点的IP地址给用户,CDN节点的服务器负责响应用户的
请求,提供所需的内容。
  1. dns-prefetch DNS Prefetch 是一种 DNS 预解析技术。当你浏览网页时,浏览器会在加载网页时对网页中的域名进行解析缓存,这样在你单击当前网页中的连接时就无需进行 DNS 的解析,减少用户等待时间,提高用户体验。

DNS 解析存在的问题

DNS 劫持

被钓鱼网站劫持,有可能返回错误的 IP,浏览的不是目标浏览器

DNS 解析转发

小的运营商可能将 DNS 解析请求转发,解析的比较慢,效率低

DNS 劫持解决办法

使用 http 协议向 DNS 服务器 80 端口进行请求

1
2
3
HttpDNS是使用HTTP协议向DNS服务器的80端口进行请求,代替传统的DNS协议向DNS服务器的53端口进行请求,绕开了运营商的Local DNS,从而避免了使用运营商Local DNS造成的劫持和跨网问题。

HTTPDNS使用HTTP协议进行域名解析,代替现有基于UDP的DNS协议,域名解析请求直接发送到HTTPDNS服务器,从而绕过运营商的Local DNS,能够避免Local DNS造成的域名劫持问题和调度不精准问题
  • 长连接

找一个中间的长连 server ,在内网专线进行 Http 请求。客户端和这个长连 server通信即可。

DNS为什么使用UDP协议作为传输层协议?

主要是为了避免使用TCP协议时照成的连接时延,因为为了得到一个域名的IP地址,往往会向多个域名服务器查询,如果使用TCP协议,那么每次请求都会存在连接时延,这样使DNS服务变得很慢,因为大多数的地址查询请求,都是浏览器请求页面时发出的,这样会照成网页的等待时间过长。

使用UDP作为DNS协议的问题?

  1. 由于物理链路的最小MTU(最大传输单元,大于这个值会导致IP分片,IP包每次最大为1500)=576,所以为了限制报文长度不超过576,UDP的报文长度被限制在512个字节以内,这样一旦DNS的查询或者应答报文,超过了512字节,那么基于UDP的DNS协议,就会被截断为512字节,那么有可能用户得到的DNS应答就是不完整的,为了解决这个问题,可以使用TCP协议去请求报文。
  2. 安全问题,无法确定得到的应答一定是一个安全的应答。所以现在有了DNS over HTTPS来解决这个问题。

如何在测试过程中 MOCK 各种网络环境?

模拟iOS网络环境

参考

  1. 计算机网络–ARP地址解析协议详解
  2. 同网段和不同网段设备通信原理详解
  3. 图解TCP/IP