学习了OSI七层模型之后,对网络消息是如何传输的还是有些疑惑。于是找到了一本书《网络是怎样连接的》—作者:户根勤。这本书详细讲述了网络消息发送和接收的过程。有兴趣的可以看一看,真的很受益!
下面我就自己的理解,以“从浏览器输入网址到浏览器页面出现内容的过程”为例,简单的介绍一下网络的传输过程。
消息发送阶段:
第一步: 输入目标网址URL(URL:统一资源定位器)。浏览器(应用程序)对URL解析,进行拆分。
第二步: 浏览器调用操作系统的Socket库(以固定的格式消息)并委托系统协议栈,通过网卡向DNS(域名解析器)发送请求消息,查询目标网址的IP。然后DNS返回消息(包含IP),通过协议栈写到内存(内存地址形式)中。然后浏览器(应用程序)从内存中找到相应的<内存地址>,也就获得了网址对应的IP。
第三步:对 URL 进行解析之后, 浏览器确定了 Web 服务器和文件名, 接下来就是根据这些信息来生成 HTTP 消息体。
第四步:HTTP消息体经过TCP协议栈的封装,变成固定格式的包含TCP头部的包。
第五步:TCP处理的包经IP模块处理,变成包含MAC头部和IP头部的包。
第六步:信息包经过网卡驱动和网卡,给包再添加三个控制数据。同时这里用到了ARP(地址解析协议)协议。
第七步:包(数字信息)被网卡变为电信号,进入网线,经集线器,交换机,路由器,然后经过调制解调器(猫)转换信号(或是电信号或是光信号)进入网络。
消息接收阶段:可以看作是消息发送的逆过程
第一步:电信号或者光信号从网线进入调制解调器(猫),转换为电信号。
第二步:网卡的MAC模块将网络包从信号还原为数字信息,校验FCS并存入缓存区。
第三步:网卡驱动会根据MAC头部判断协议类型,并交包交给相应的协议栈。
第四步: 协议栈的IP模块会检查IP头部:(1)判断是不是发给自己的;(2)判断网络包是否经过拆分;(3)将包转交给TCP模块或者UDP模块。
第五步:收到数据包时,TCP模块会(1)根据收到的包的发送方的IP地址、发送方端口号、接收方IP地址、接收方端口号找到相对应的套接字;(2)将数据块拼接起来并保存在接收缓存区中;(3)向客户端返回ACK。
第六步:web服务器程序解释请求消息并做出响应。
第七步:浏览器(应用程序)接收消息并解析,显示网页内容。
下面的图片介绍的很详细: