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
层定义了整个网络端到端的传输行为,这两层基本定义了这样的基因:
网络传输是以包为单位的
- 二层传输叫帧
- 网络层叫包
- 传输层叫段