组成
原始的冯诺依曼架构:
网络
总体模型:
-OSI-------TCP/IP-
应用层
表示层
会话层 应用层
-----------------
传输层 传输层
网络层 网络层
链路层 链路层
物理层
mac addr
每个网络硬件设备的物理地址,有48位,用以区分局域网内的设备.
mac addr
是可修改的,下面以 archlinux 为例:
ip link # 来自包 iproute2 查看网卡设备, 其中 link/ether 后跟的就是 mac 地址
ip link set dev interface down
ip link set dev interface address XX:XX:XX:XX:XX:XX
ip link set dev interface up
注意,因为 MAC 地址是与硬件绑定的,这种修改 mac 地址的方式是临时的.
想要让类似的变更永久生效,需要在系统重启时执行相应的命令或者修改对应的网卡配置文件.
HUB 双绞线 CSMA/CD 协议
HUB 集线器所在为物理层
SW 交换机 维护 mac 地址,使用网线,内有八根线,数据全双工
交换机所在层为数据链路层,其中数据如下:
数据头(起点->终点 mac 地址)| 数据
桥接:多个交换机相连
消息洪泛:找不到对应目标mac的SW会全体广播等待回应
SW 交换机可以在小范围内实现高效传输(内部 mac 表最大只有千条数据)
为解决这个问题,我们在交换机间设立路由器(网关)
IP 地址:
- 标识网络
- 标识设备
路由器通过一系列经过高度优化的算法,建立路由表.(网络层)
Q: 有 IP 还需要 mac 吗
A: IP 是抽象地址,不能直接用来通信,最终的通信还是需要用 mac 通信
内网通信流程:
- 通过 ARP 协议通过目标 IP 地址查询 mac 地址.
- mac 层传输
子网 ID 截断(按照binary的位)掩码位的 IP,以表示来自哪个子网.
IP: 192.168.1.1 子网掩码:255.255.255.0
此时包是这样的:
[数据头(起点->终点 mac 地址)| [IP 数据头(起点->终点 IP 地址) | IP 数据包的数据] ]
在上述包的传输过程中, IP 地址不变,而 mac 源目地址在不同阶段是会发生变化的.
NAT协议:共用 公网 IP 地址
特例:NAT 时,源地址的 IP 也会变化
TODO
事实上,我们以后还会继续这个套娃过程:
[mac 包头 | [IP 包头| [TCP 包头 | [HTTP 包头 | DATA... ] ] ] ]
路由器的连接成网
OSPF 协议:自动维护下一跳,哪些子网属于哪个路由器
BPG 协议辅助
端口:单台计算机的多应用
UDP 协议
不同的应用使用不同的端口
UDP 简单粗暴但是不稳定,TCP稳定(纠错机制)
如:
- 数据分段发送
- 每段数据接受后需要收到,不然重新发送
著名的“三次握手”:
- 一次握手:客户端发送带有 SYN(SEQ=x) 标志的数据包 -> 服务端,然后客户端进入 SYN_SEND 状态,等待服务端的确认;
- 二次握手:服务端发送带有 SYN+ACK(SEQ=y,ACK=x+1) 标志的数据包 –> 客户端,然后服务端进入 SYN_RECV 状态;
- 三次握手:客户端发送带有 ACK(ACK=y+1) 标志的数据包 –> 服务端,然后客户端和服务端都进入ESTABLISHED 状态,完成 TCP 三次握手。
四次挥手:
- 第一次挥手:A 说“我没啥要说的了”
- 第二次挥手:B 回答“我知道了”,但是 B 可能还会有要说的话,A 不能要求 B 跟着自己的节奏结束通话
- 第三次挥手:于是 B 可能又巴拉巴拉说了一通,最后 B 说“我说完了”
- 第四次挥手:A 回答“知道了”,这样通话才算结束。
参考原文
UDP 和 TCP 是传输层,所有的应用层协议都建立在它们之上
TCP:
- HTTP(S)
- TELNET
- FTP
- POP3 UDP:
- NFS
- TFTP
- SNMP
- DHCP
- NTP
现在让我们来重新介绍 TCP/IP 模型下的计算机网络:
应用层:上层应用所处理的内容
传输层:错误检测、流量控制、数据分段
网络层:处理数据包的路由和转发
链路层:负责在物理链路上可靠地传输数据帧
下三层在 OS 内部实现.
层与层之间:
- 下一层对上一层透明
- 传输在每层对等