本文采用知识共享 署名-相同方式共享 4.0 国际 许可协议进行许可。
访问 https://creativecommons.org/licenses/by-sa/4.0/ 查看该许可协议。
1) OSI 七层参考模型
- 应用层
- 表示层
- 会话层
- 传输控制层
- 网络层
- 链路层
- 物理层
2) TCP/IP 四层精简模型
2.1) 应用层 (用户界面)
2.2) 传输层 (Port)
三次握手 -> 数据传输 -> 四次分手
2.3) 网络层 (IP)
基于路由表实现,Linux 查看路由表 route -n
,基础路由表来源是 OS 中的网卡配置。
网络层就是找到下一跳,从上往下基于路由表每一条做匹配:目标 IP 与一条路由的掩码做与运算,与该条目 Destination 匹配则找了下一跳。
2.4) 链路层 (MAC)
链路层基于 MAC 地址,将含有目标 IP 的数据包再套上一层,链路层也有一张路由表,Linux 查看路由表 `arp -a
arp 会解释 IP 和网卡 MAC 地址的映射,受限与局域网,将数据包丢给下一个节点(下一跳、下一个 MAC 地址)
2.4.1) ARP 路由表来源
当机器刚开机时,ARP 表是空的,只有下一跳的 IP,那么数据包应该怎么发出去呢?即本机 ARP 缓存表中没有目标地址的缓存,将会经历一个 ARP 解析流程:
- 打包一个包含(源 IP、源 MAC、目标 IP、目标MAC 为 FF:FF:FF:FF:FF:FF) 的包,交换机收到 MAC 地址为 FF:FF:FF:FF:FF:FF 的包时会将此包广播给其他所有 Port
- 的目标机器收到包,若机器 IP 不匹配下一跳 IP,此包将被丢弃
- 若 IP 匹配,则向源 MAC 回包,包含匹配目标机器的 MAC
- 源机器将此记录添入 ARP 表
2.4.1.1) ARP 欺骗
这里会引入一个 ARP 欺骗的问题,若同时有两台机器向源机器回 ARP Response,源机器最终会记录最后一个收到的 ARP Response,这就引发了 ARP 欺骗
2.5) TCP/IP 总结
从物理层开始,每一层都向上层提供服务访问点。
在连接因特网的普通微机上:
- 物理层:服务访问点就是网卡接口 (RJ45接口或BNC接口)
- 数据链路层:服务访问点是 MAC 地址
- 网络层的服务访问点是 IP 地址
- 传输层的服务访问点是 Port 端口号
- 应用层提供的服务访问点是用户界面
3) Linux 命令行打开网站(不使用 CURL)
# 进入当前进程的文件描述符目录,0(stdin),1(stdout)和2(stderr)
cd /proc/$$/fd
# 创建一个 TCP Socket 输入输出链接文件 8,链接到百度
exec 8<> /dev/tcp/www.baidu.com/80
# 管道加 & 的意思代表 8 时文件描述符非文件
echo -e 'GET / HTTP/1.0\n' >& 8
# 将 8 的输出管道到 stdin
cat 0 <& 8
9) 参见
- 知乎:链路层地址和 MAC 地址有何不同?
- 知乎:交换机mac表的获取?
- CSDN:Arp工作原理及欺骗原理
- Wikipedia:Address_Resolution_Protocol
- [Java高级互联网架构师【马士兵教育】]()