Notes On Network Protocol 7 layers
网络七层协议总结 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缓存。 ARP的MAC地址缓存过一段时间就会过期。
交换机
一旦机器数目增多, 问题就出现了。 因为 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提供可靠交付, 通过
- 传输
TCP是面向字节流的。发送的时候发的是一个流,没头没尾。IP 包可不是一个流,而是一个个的IP包。之所以变成了流, 这也是TCP自己的状态维护做的事情UDP继承了IP的特性, 基于数据报的, 一个一个地发, 一个一个地收
- 拥塞控制
TCP是可以拥塞控制的。它意识到包丢弃了或者网络的环境不好了,就会根据情况调整自己的行为,看看是不是发快了,要不要发慢点UDP应用让我发,我就发,管它洪水滔天
- 有状态服务
TCP其实是一个有状态服务。精确地记着发送了没有,接收到没有,发送到哪个了,应该接收哪个了,错一点儿都不行UDP是无状态服务, 发出去就发出去了
小结
MAC层定义了本地局域网的传输行为,IP层定义了整个网络端到端的传输行为,这两层基本定义了这样的基因:
网络传输是以包为单位的
- 二层传输叫帧
- 网络层叫包
- 传输层叫段