系列回顾
- 网络基础知识(一) TCP/IP五层模型
- 网络基础知识(二) Data Link层详解
- 网络基础知识(三) Network层详解
- 网络基础知识(四) 子网与路由
- 网络基础知识(五) Transport层详解
Application Layer 应用层
应用层是整个网络模型中最靠近用户, 常用的协议有 HTTP
, FTP/SFTP
, SMTP
等等. 比如说浏览器, 市面上有很多很多浏览器, 常见的有 Chrome, Firefox, Safari, Edge等等, 服务器有 nginx, apache, tomcat 等等, 但是无论一个网站的后端使用什么样的服务器, 用户使用什么样的浏览器, 数据都能被正确解读, 这是为什么呢? 那是因为服务器和浏览器都采用了同一个协议, 叫 HTTP 协议.
对于应用层来说, 它的数据也需要被封装到底层. 对于不同的协议, 数据包的格式/字段可能会不一样, 但是对于底层的协议来说, 并不care. 它们要做的就是把应用层的数据包封装到data payload里面, 然后传输到相应的网络节点.
OSI 七层模型
OSI是 Open System Interconnection 的缩写. 与之前介绍的5层模型不一样的地方是, 在之前的5层模型的基础上额外增加了两层, 它们分别是 Session 层和 Presentation 层. 这两层位于Transport Layer (传输层) 和 Application Layer (应用层) 之间.
Session 层
session层主要负责连接应用层和传输层的对话. 换句话说, 就是session 层负责构建传输层和应用层沟通的通道.
Presentation 层
当Session层把数据包传递给presentation层之后, presentation层需要做的是确认数据包能够被应用程序成功处理. 也就是说,它要确保应用程序能”看懂”这个数据包的内容. 日常使用方面就是传输中的加密/解密都在这一层完成.
网络工作原理
在这一小节中, 我将假设一个场景来解释5成模型是如何协同工作的.
现在有三个网络:
- 网络A: 地址是
10.1.1.0/24
- 网络B: 地址是
192.168.1.0/24
- 网络C: 地址是
172.16.1.0/24
两个路由器:
- 路由A: 连接网络A和网络B; 接口ip地址分别是
10.1.1.1
和192.168.1.254
- 路由B: 连接网络B和网络C; 接口ip地址分别是
192.168.1.1
和172.16.1.1
两台电脑:
- 电脑A: 客户端, 存在于网络A中; ip地址是
10.1.1.100
- 电脑B: 服务端, 存在于网络C中; ip地址是
172.16.1.100
. 因为这个是服务器, 所有个服务器软件在监听80
端口.
现在, 一个用户打开了 电脑A 的浏览器, 并输入了一个172.16.1.100
. 在他敲击回车后会发生什么呢?
- 浏览器知道, 它需要向
172.16.1.100
这个地址请求网页.- 它需要和
172.16.1.100
端口80
建立 TCP 连接.
- 它需要和
- 网络A检查后发现
172.16.1.100
不是一个本地的ip地址. - 电脑A知道它需要向它的本地网关发送数据包.
- 网关地址是
10.1.1.1
- 网关地址是
- 电脑A搜索 ARP表 来确定
10.1.1.1
的MAC地址.- 不幸的是, ARP表中没有
10.1.1.1
的MAC地址.
- 不幸的是, ARP表中没有
- 电脑A发送了ARP广播, 请求
10.1.1.1
的MAC地址. - 路由器A接收到广播后发现,
10.1.1.1
是自己的地址, 所以它回应了自己的的MAC地址. - 电脑A收到路由器A的MAC地址后, 开始准备数据包.
- 因为这是一个TCP数据包, 所以准备一个TCP端口
- 操作系统判定端口
50000
是空闲的, 所以将浏览器连接到此端口
- 准备好的TCP数据包现在被传递到 网络层.
- 网络层将构建一个IP Header
- 关键参数
- 目标ip
172.16.1.100
- 源头ip
10.1.1.100
- TTL: 64
- 目标ip
- TCP 数据包被封装到pay load字段
- 有了IP数据包之后, 电脑A需要把这个数据包发送到路由A的MAC的地址.
- 连接层 构建一个Etherframe Datagram
- 关键参数
- 目标MAC地址 (路由A的MAC地址)
- 源头MAC地址 (电脑A的MAC地址)
- IP数据包被封装到 Ethernetframe datagram里面
- 数据包经过Physical Layer, 被发送到路由A
- 路由器A对数据包进行检查.
- 目标MAC是否和自己的MAC一致
- checksum是否一致
- 路由A将 Ethernetframe的payload取出, 也就是IP Datagram
- 路由A将检查IP Datagram的checksum
- 将 目标IP 字段取出
- 路由A发现, 如果要到达
172.16.100
, 最短路径是经过路由B- 路由A将IP Datagram的TTL字段减1
- 计算新的checksum
- 检查Rounting Table, 获取路由B的MAC地址
- 构造新的Ethernetframe Datagram
- 封装TCP
- 数据包送到路由B
- 重复上面的步骤…
- 数据包被送到电脑B
- 取出TCP数据包
- 获取目标端口
- 操作系统判定
80
端口打开了
上面就是一次传输过程, 如果要完成一次TCP三次握手, 这个过程将被重复三次.