网络读后感

1.网络为什么要分层?

复杂的程序都要分层。
06b355394f525c54f200d8a1af63ddea

当一个网络包经过一个网口的时候,(在混杂模式下)先请进来处理一把,先调用函数除掉二层的头,看一看里面保存的MAC地址,如果MAC地址是自己,则继续往上,调用函数出掉三层的头,看是发给自己还是再转发出去,如果IP地址不是自己则转发出去,如果IP地址是自己则发给上一层,具体是TCP还是UDP需要根据IP头里的标示决定,而分别调用process_tcp还是process_udp。假设是TCP,这时候看四层的头,看是一个应答还是一个发起吗,以发送一个回复包,如果是一个正常的数据包,则交给上层,这时候在四层的头里有端口,以决定分给哪个程序处理。

当发送的时候,调用process_tcp,把发送内容包上TCP头,记录下源端口号,再加上IP头,记录下源IP和目标IP,再加上MAC头,加上源MAC,和(通过通过一定的协议处理而获得的)目标MAC。

2.CIDR无类型域间选路

五类IP地址:
0b32d6e35ff0bbc5d46cfb87f6669d9e

A、B、C类所能包含的主机如下:

e9c59a4b2f0b804356759b10440ea7be

可以看到,C类太少,B类又太多,于是有了个折中的办法,CIDR,比如16.158.165.91/22,表示32位中,前22位是网络号,后10位是主机号。

192.168.0.1是Wifi路由器地址,192.168.0.255是广播地址。

qdisc 全称是queueing discipline,中文叫**排队规则。**内核如果需要通过网络接口发送数据,则都需要通过按照为这个接口配置的qdisc。

IP地址有定位功能,MAC是身份标识。

CIDR可以判断是不是本地人。

IP分公有和私有的。

3.IP如何分配

通过DHCP协议:新来的机器使用 IP 地址 0.0.0.0 发送了一个广播包,目的 IP 地址为 255.255.255.255。广播包封装在 UDP 里面,UDP 封装在 BOOTP 里面。在这个广播包里会有它是新人以及它的mac地址、它需要一个IP地址的信息。

DHCP Server收到后,分配给新人一个IP地址,服务器还发送了子网掩码、网关和 IP 地址租用期等信息。

当网络中有多个DHCP Server的时候会收到多个DHCP Offer,新来的机器收到回复后接收其中一个DHCP Offer,并且会向网络发送一个 DHCP Request 广播数据包,包中包含客户端的 MAC 地址、接受的租约中的 IP 地址、提供此租约的 DHCP 服务器地址等,并告诉所有 DHCP Server 它将接受哪一台服务器提供的 IP 地址,告诉其他 DHCP 服务器,谢谢你们的接纳,并请求撤销它们提供的 IP 地址,以便提供给下一个 IP 租用请求者。

此时,由于还没有得到 DHCP Server 的最后确认,客户端仍然使用 0.0.0.0 为源 IP 地址、255.255.255.255 为目标地址进行广播。在 BOOTP 里面,接受某个 DHCP Server 的分配的 IP。

当 DHCP Server 接收到客户机的 DHCP request 之后,会广播返回给客户机一个 DHCP ACK 消息包,表明已经接受客户机的选择,并将这一 IP 地址的合法租用信息和其他的配置信息都放入该广播包,发给客户机,欢迎它加入网络大家庭。

最终租约达成的时候,还是需要广播一下,让大家都知道。

客户机会在租期过去 50% 的时候,直接向为其提供 IP 地址的 DHCP Server 发送 DHCP request 消息包。客户机接收到该服务器回应的 DHCP ACK 消息包,会根据包中所提供的新的租期以及其他已经更新的 TCP/IP 参数,更新自己的配置。这样,IP 租用更新就完成了。

网络管理员不仅能自动分配 IP 地址,还能帮你自动安装操作系统:

6e69007db3fc68ff6da8496266abf6a4

4.从物理层到MAC层

一、MAC 层是用来解决多路访问的堵车问题的;

  • 方式一:分多个车道。每个车一个车道,你走你的,我走我的。这在计算机网络里叫作信道划分;
  • 方式二:今天单号出行,明天双号出行,轮着来。这在计算机网络里叫作轮流协议;
  • 方式三:不管三七二十一,有事儿先出门,发现特堵,就回去。错过高峰再出。我们叫作**随机接入协议。**著名的以太网,用的就是这个方式。

二、ARP 是通过吼的方式来寻找目标 MAC 地址的,吼完之后记住一段时间,这个叫作缓存;

5fe88a40a8b5d507601968efb50ac668

三、交换机是有 MAC 地址学习能力的,学完了它就知道谁在哪儿了,不用广播了。

5.交换机与VLAN

  • 当交换机的数目越来越多的时候,会遭遇环路问题,让网络包迷路,这就需要使用 STP 协议,通过华山论剑比武的方式,将有环路的图变成没有环路的树,从而解决环路问题。

STP是解决交换机环路的方法:在一开始给每个交换机一个ID以及优先级,之后进行PK,互相发送 BPDU 来比功夫,优先级低的处在优先级高的下面,路径长的会归顺于路径短的。

  • 交换机数目多会面临隔离问题,可以通过 VLAN 形成虚拟局域网,从而解决广播问题和安全问题。

如果我们买的交换机是支持 VLAN 的,当这个交换机把二层的头取下来的时候,就能够识别这个 VLAN ID。这样只有相同 VLAN 的包,才会互相转发,不同 VLAN 的包,是看不到的。这样广播问题和安全问题就都能够解决了。我们可以设置交换机每个口所属的 VLAN。

6.ICMP与ping

  • ICMP 相当于网络世界的侦察兵。其中主要的两种类型的 ICMP 报文,一种是主动探查的查询报文,一种异常报告的差错报文;

ICMP 报文是封装在 IP 包里面的。因为传输指令的时候,肯定需要源地址和目标地址。它本身非常简单。因为作为侦查兵,要轻装上阵,不能携带大量的包袱。ICMP 报文有很多的类型,不同的类型有不同的代码。最常用的类型是主动请求为 8,主动请求的应答为 0

查询报文类型:常用的**ping 就是查询报文,是一种主动请求,并且获得主动应答的 ICMP 协议。**ping比起原生的 ICMP,这里面多了两个字段,一个是标识符,表示用途,另一个是序号。

差错报文类型:

**终点不可达为 3:**网络不可达代码为 0,主机不可达代码为 1,协议不可达代码为 2,端口不可达代码为 3,需要进行分片但设置了不分片位代码为 4。

源抑制为 4:让源站放慢发送速度

超时为 11:超过网络包的生存时间还是没到。

重定向为 5:让下次发给另一个路由器。

  • ping 使用查询报文,Traceroute 使用差错报文。

ping 这个程序是使用了 ICMP 里面的 ECHO REQUEST 和 ECHO REPLY 类型的。

ping的时候,源主机首先会构建一个 ICMP 请求数据包,ICMP 数据包内包含多个字段。最重要的是两个,第一个是类型字段,对于请求数据包而言该字段为 8;另外一个是顺序号,主要用于区分连续 ping 的时候发出的多个数据包。每发出一个请求数据包,顺序号会自动加 1。为了能够计算往返时间 RTT,它会在报文的数据部分插入发送时间。

tcpdump -i eth0 icmp可以查看包有没有到达某个点,回复的包到达了哪个点,可以更加容易推断出错的位置。

Traceroute 的第一个作用就是故意设置特殊的 TTL,来追踪去往目的地时沿途经过的路由器

它逐个的设置TTL时间,如此反复,直到到达目的主机。这样,Traceroute 就拿到了所有的路由器 IP。Traceroute 程序会发送一份 UDP 数据报给目的主机,但它会选择一个不可能的值作为 UDP 端口号(大于 30000)。当该数据报到达时,将使目的主机的 UDP 模块产生一份“端口不可达”错误 ICMP 报文。如果数据报没有到达,则可能是超时。

**Traceroute 还有一个作用是故意设置不分片,从而确定路径的 MTU。**每次收到 ICMP“不能分片”差错时就减小分组的长度,直到到达目标主机。

7.网关

路由器和网关的关系:路由器是一台设备,它有五个网口或者网卡,相当于有五只手,分别连着五个局域网。每只手的 IP 地址都和局域网的 IP 地址相同的网段,每只手都是它握住的那个局域网的网关。

MAC 地址是一个局域网内才有效的地址。因而,MAC 地址只要过网关,就必定会改变,因为已经换了局域网。两者主要的区别在于 IP 地址是否改变。不改变 IP 地址的网关,我们称为转发网关;改变 IP 地址的网关,我们称为NAT 网关

  • 如果离开本局域网,就需要经过网关,网关是路由器的一个网口;
  • 路由器是一个三层设备,里面有如何寻找下一跳的规则;
  • 经过路由器之后 MAC 头要变,如果 IP 不变,相当于不换护照的欧洲旅游,如果 IP 变,相当于换护照的玄奘西行。

局域网之间没有商量过,各定各的网段,因而 IP 段冲突了。这种情况下,到国际上,也即中间的局域网里面,就需要使用另外的地址。就像出国,不能用咱们自己的身份证,而要改用护照一样,玄奘西游也要拿着专门取经的通关文牒,而不能用自己国家的身份证。首先,目标服务器 B 在国际上要有一个国际的身份,我们给它一个 192.168.56.2。在网关 B 上,我们记下来,国际身份 192.168.56.2 对应国内身份 192.168.1.101。凡是要访问 192.168.56.2,都转成 192.168.1.101。于是,源服务器 A 要访问目标服务器 B,要指定的目标地址为 192.168.56.2。这是它的国际身份。服务器 A 想,192.168.56.2 和我不是一个网段的,因而需要发给网关,网关是谁?已经静态配置好了,网关是 192.168.1.1,网关的 MAC 地址是多少?发送 ARP 获取网关的 MAC 地址,然后发送包。

8.路由表

  • 路由分静态路由和动态路由,静态路由可以配置复杂的策略路由,控制转发策略;

静态路由配置:ip route add

  • 动态路由主流算法有两种,距离矢量算法和链路状态算法。基于两种算法产生两种协议,BGP 协议和 OSPF 协议。

动态路由算法是最短路径算法:

距离矢量路由算法,基于Bellman-Ford,每个路由器都保存一个路由表,包含多行,每行对应网络中的一个路由器,每一行包含两部分信息,一个是要到目标路由器,从那条线出去,另一个是到目标路由器的距离。每过几秒,每个路由器都将自己所知的到达所有的路由器的距离告知邻居,每个路由器也能从邻居那里得到相似的信息。每个路由器根据新收集的信息,计算和其他路由器的距离。这种算法有两个问题,路由器挂了的时候检测不出来,需要等待超时,第二个问题是每次发送都需要发送整个路由表。

链路状态路由算法:基于Dijkstra 算法,当一个路由器启动的时候,首先是发现邻居,向邻居 say hello,邻居都回复。然后计算和邻居的距离,发送一个 echo,要求马上返回,除以二就是距离。然后将自己和邻居之间的链路状态包广播出去,发送到整个网络的每个路由器。这样每个路由器都能够收到它和邻居之间的关系的信息。因而,每个路由器都能在自己本地构建一个完整的图,然后针对这个图使用 Dijkstra 算法,找到两点之间的最短路径。

OSPF:应用在数据中心中的协议,由于主要用在数据中心内部,用于路由决策,因而称为内部网关协议

BGP:外网路由协议Border Gateway Protocol,简称BGP),每个数据中心都设置自己的 Policy,例如,哪些外部的 IP 可以让内部知晓,哪些内部的 IP 可以让外部知晓,哪些可以通过,哪些不能通过。BGP 协议使用的算法是路径矢量路由协议(path-vector protocol)。它是距离矢量路由协议的升级版。在 BGP 里面,除了下一跳 hop 之外,还包括了自治系统 AS 的路径,从而可以避免坏消息传的慢的问题。

9.UDP协议

所谓的建立连接,是为了在客户端和服务端维护连接,而建立一定的数据结构来维护双方交互的状态,用这样的数据结构来保证所谓的面向连接的特性。

TCP 是面向字节流的。发送的时候发的是一个流,没头没尾。IP 包可不是一个流,而是一个个的 IP 包。之所以变成了流,这也是 TCP 自己的状态维护做的事情。而UDP 继承了 IP 的特性,基于数据报的,一个一个地发,一个一个地收。

UDP 虽然简单,但它有简单的用法。它可以用在环境简单、需要多播、应用层自己控制传输的地方。例如 DHCP、VXLAN、QUIC 等。

TCP连接是通过三次握手建立连接,四次挥手释放连接,这里的连接是指彼此可以感知到对方的存在,计算机两端表现为socket,有对应的接受缓存和发送缓存,有相应的拥塞控制策略。

comments powered by Disqus