网络七层协议总结 from 极客时间 - 趣谈网络协议

物理层

电脑和电脑使用网线连接

1-3,2-6交叉接法。

水晶头的第 1、2 和第 3、6 脚, 它们分别起着收、发信号的作用。 将一端的 1 号和 3 号线、2 号和 6 号线互换一下位置, 就能够在物理层实现一端发送的信号, 另一端能收到。

Hub 集线器

采取的是广播模。遗留的几个问题:

  • 这个包是发给谁的?谁应该接收?
  • 大家都在发,会不会产生混乱?有没有谁先发、谁后发的规则?
  • 如果发送的时候出现了错误,怎么办?

数据链路层

MAC

背景: 上述 HUB 遗留的问题,大家都在发,会不会产生混乱?有没有谁先发、谁后发的规则?

Medium Access Control, 媒体访问控制。

控制在往媒体发数据的时候, 谁先发, 谁后发的问题。 防止发生混乱。 (解决上述第2个问题), 学名叫多路访问, 下面是解决多路访问的三种算法方式。

  • 信道划分

    分多个车道。 每个车一个车道, 你走你的, 我走我的。 这在计算机网里叫作信道划分。

  • 轮流协议

    今天单号出行, 明天双号出行, 轮着来。 这在计算机网络里叫作轮流协议。

  • 随机接入协议

    不管三七二十一,有事儿先出门,发现特堵,就回去。错过高峰再出。我们叫作随机接入协议。著名的以太网,用的就是这个方式

链路层地址

解决: 这个包是发给谁的?谁应该接收?

物理地址, 叫做链路层(第一层)地址。 因为第二层主要解决媒体接入控制的问题, 所以它常被称为MAC地址。

NGINX 访问示例

有了这个目标 MAC 地址,,数据包在链路上广播,MAC 的网卡才能发现,这个包是给它的。MAC 的网卡把包收进来,然后打开 IP 包,发现 IP 地址也是自己的,再打开 TCP 包,发现端口是自己,也就是 80,而 nginx 就是监听 80。

于是将请求提交给 nginx,nginx 返回一个网页。然后将网页内容发回请求的机器。然后层层封装,最后到 MAC 层。因为来的时候有源 MAC 地址,返回的时候,源 MAC 就变成了目标 MAC,再返给请求的机器。

CRC

循环冗余检测

解决: 如果发送的时候出现了错误,怎么办?

通过 XOR 异或的算法,来计算整个包是否在发送的过程中出现了错误。

ARP 协议

已知IP地址, 求MAC地址的协议。

询问和应答的报文:

机器本地会进行ARP缓存。 ARPMAC地址缓存过一段时间就会过期。

交换机

一旦机器数目增多, 问题就出现了。 因为 Hub 是广播的,不管某个接口是否需要,所有的Bit都会被发送出去,然后让主机来判断是不是需要。 产生冲突的概率就提高了。

交换机学习

一台MAC1电脑将一个包发送给另一台 MAC2 电脑,当这个包到达交换机的时候,一开始交换机也不知道 MAC2 的电脑在哪个口, 所以没办法, 它只能将包转发给除了来的那个口之外的其他所有的口。但是,这个时候,交换机会干一件非常聪明的事情,就是交换机会记住, MAC1 是来自一个明确的口。以后有包的目的地址是 MAC1 的, 直接发送到这个口就可以了。

转发表

当交换机作为一个关卡一样, 过了一段时间之后, 就有了整个网络的一个结构了, 这个时候, 基本上不用广播了, 全部可以准确转发. 当然, 每个机器的 IP 地址会变, 所在的口也会变,因而交换机上的学习的结果,我们称为转发表, 是有一个过期时间的.

总结

  • MAC层是用来解决多路访问堵车问题的
  • APR是通过吼的方式来寻找目标的MAC地址的,吼完之后记住一段时间,,这个叫做缓存
  • 交换机是有MAC地址学习能力的,,学完了它就知道谁在哪儿了,不用广播了

交换机与 VLAN

多台交换机之间连接起来, 形成一个拓扑结构

环路问题:交换机之间重复发送 ARP 广播

解决方式:STP (最小生成树)

多个交换机之间的广播问题和安全问题

  • 一大堆机器广播, 性能下降
  • 有的需要保密, 所有包都会在一个局域网传输, 如果没有加密会有安全问题.

VLAN虚拟局域网

使用VLAN, 一个交换机会连属于多个局域网的机器,在原来的二层的头上加一个TAG,里面有一个VLAN ID来区分不同的局域网。交换机之间可以通过 Trunk 口互相连接

网络层

也即 IP 层

ICMP 协议的格式

ICMP全称Internet Control Message Protocol,互联网控制报文协议。是封装在IP报文里面的。

ICMP属于网络层(IP)协议。 发送不涉及到传输层, 没有端口的概念。

ping

MAC 头和 IP 头的细节

任何一台机器,当腰访问另一个IP地址的时候, 会先判断, 这个目标 IP 地址,和当前机器的 IP 地址,是否在同一个网段.。(通过CIDR, 子网掩码)

  • 如果是同一个网段:不经过网关直接将源地址和目标地址放入IP头中。然后通过 ARP 获得 MAC 地址, 将源 MAC 和目的 MAC 放入 MAC 头中,发出去就可以了。
  • 如果不是同一个网段:需要发往默认网关GateWay。Gateway 的地址一定是和源 IP 地址是一个网段的。往往不是第一个,就是第二个。例如 192.168.1.0/24 这个网段,Gateway 往往会是192.168.1.1/24 或者 192.168.1.2/24。(通过 ARP 获得网关 MAC 地址, 然后发送)

网关往往是一个路由器,是一个三层转发的设备(网络层)。

  • 一个路由器有多个网口
  • 一台服务器做这个网关则会有多个网卡, 其中一个网卡是和源IP同网段的

路由器

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

任何一个想发往其他局域网的包,都会到达其中一只手,被拿进来,拿下 MAC 头和 IP 头,看看,根据自己的路由算法,选择另一只手,加上 IP 头和 MAC 头,然后扔出去。

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

  • 静态路由

    配置复杂的策略路由, 控制转发策略

  • 动态路由

    • 距离矢量算法BGP
    • 链路状态算法OSPF

路由器是一台网络设备, 有多张网卡. 当一个口的网络包送到路由器时,它会根据一个本地的转发信息库,来决定如何正确地转发流量。这个转发信息库通常被称为路由表

总结

  • 如果离开本局域网,就需要经过网关,网关是路由器的一个网口
  • 路由器是一个三层设备,里面有如何寻找下一跳的规则
  • 转发网关, MAC变 IP不变
  • NAT网关, IP变

传输层

传输层里比较重要的两个协议, TCP 和 UDP

TCP 和 UDP 区别

  • 面向连接

    在互通之前, 面向连接的协议会先建立连接TCP会三次握手,UDP不会

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

  • 可靠性

    • TCP提供可靠交付, 通过TCP连接传输的数据,无差错、不丢失、不重复、并且按序到达
    • IP包没有任何可靠性。UDP继承了IP包的特性, 不保证不丢失, 不保证按顺序到达
  • 传输
    • TCP是面向字节流的。发送的时候发的是一个流,没头没尾。IP 包可不是一个流,而是一个个的IP包。之所以变成了流, 这也是TCP自己的状态维护做的事情
    • UDP继承了IP的特性, 基于数据报的, 一个一个地发, 一个一个地收
  • 拥塞控制
    • TCP是可以拥塞控制的。它意识到包丢弃了或者网络的环境不好了,就会根据情况调整自己的行为,看看是不是发快了,要不要发慢点
    • UDP应用让我发,我就发,管它洪水滔天
  • 有状态服务
    • TCP其实是一个有状态服务。精确地记着发送了没有,接收到没有,发送到哪个了,应该接收哪个了,错一点儿都不行
    • UDP是无状态服务, 发出去就发出去了

小结

MAC层定义了本地局域网的传输行为,IP层定义了整个网络端到端的传输行为,这两层基本定义了这样的基因:

网络传输是以为单位的

  • 二层传输叫
  • 网络层叫
  • 传输层叫

套接字

应用层

Http

Https