首先要明确,这是一个非常复杂的问题,从不同的角度(前端,后端,网络通信...)来看待这个问题,得到的结果也是不一样的.本文主要具体从网络传输的基本原理这个角度来分析这个事情,其他各种角度简单了解即可.
目录
一.从网络传输角度来看(主要)
<1>客户端发送之前的准备工作
<2>数据传输路途中间的转发过程
<3>数据到达接收方
二.站在后端工程师的角度(简单了解)
三.前端的角度来看(简单了解)
四.总结
这里我们分为三个步骤
1.当我们输入一个URL,首先浏览器会根据这里的域名,查询对应的IP地址. 这里查询IP地址具体过程 (1)先查浏览器自身的缓存. (2)再查hosts文件. (3)查DNS服务器.
2.浏览器会构造出一个HTTP请求. 这个HTTP请求中就包含了刚才的这个域名信息(用户输入的URL信息).
3.浏览器调用操作系统的 socket api,把构造出的HTTP数据交给 TCP 来进一步处理. 这里TCP协议就需要构造一个TCP数据报.
此时 : (1)在发送TCP数据报之前,要先进行"三次握手",与对端服务器建立连接. 三次握手涉及到的 SYN/ACK 也是同样要经过网络层,数据链路层,物理层依次封装,到达对端服务器之后再依次分用.
(2)建立连接之后再进行数据传输. 发送方就会把这个TCP数据进一步的交给IP协议再一次封装.
4.网络层把TCP数据报封装成一个IP数据报(也可能是多个IP数据报,IP协议会自动进行分包的过程),进一步的进行封装,然后把数据交给数据链路层.
5.数据链路层会把这个数据再封装成以 太网数据帧.再把这个数据交给物理层传输. 在构造帧头的时候就需要根据IP映射到 mac地址,这个构造的过程就依赖了 ARP协议.
6.物理层把数据转换成电信号进行传输.
这里客户端才将数据封装完成,通过网线/光纤/无线网络等 进行传输.
7.电信号沿着网线,到达了下一个设备(路由器),路由器就会针对收到的数据进行分用.物理层把数据交给数据链路层,数据链路层交给网络层,路由器拿到了网络层中的IP数据报,取出其中的目的ip,查询路由表,找到下一个传输的目标和下一个要传输目标的mac地址,再重新进行封装(把数据交给数据链路层,数据链路层再交给物理层).
这里我们就用一个路由器来举例,实际中会涉及到很多设备.
8.数据到达接收方,开始进行"分用".
物理层把光电信号转化成以 太网数据帧交给数据链路层,数据链路层解析出IP数据报,交给网络层 .(这些过程都涉及到crc校验,如果发现校验和不对,说明数据是错的,就直接丢弃了).
IP协议再进行解析,解析出一个TCP数据报(IP报头里包含着协议类型). 这个解析的过程还可能涉及到组包的过程,由IP报头中的三个报头(16位标识,3位标志,13位分片偏移)辅助进行实现.
再根据TCP数据报中的端口号找到对应的进程,把数据放入到对应socket的接收缓冲区里.
9.应用程序调用对应的socket api,从TCP接收缓冲区中读取数据. 应用程序把这个数据按照HTTP协议解析,获取到其中的URL. 根据URL中指定的路径,知道了是要获取到/这个根路径.
10.服务器里面会对/这个路径进行配置,映射到一个具体的index.html(也可能是其他名字)这样的一个html文件.服务器就会读取的这个文件,把这个文件的内容构造成一个HTTP响应数据(这个响应数据要发送回客户端),然后再调用socket api进行发送.
11.服务器发送的响应数据也会进行层层封装(与上面客户端数据封装过程类似),最终变成物理层上传输的光电信号.
12.这个光电信号到达下一个路由器,重复上面路由器的分用过程,解析到网路层,取出其中的目的IP,查路由表,找到下一个要经过的设备在哪.再重新对数据进行封装.
13.数据到达了用户的主机.用户主机重复上面分用的过程,依次把数据读取出来,最终交给应用程序.
14.浏览器得到了HTTP响应报文,解析这个报文,获取到其中的html内容,根据html进行渲染......由于html中可能会包含一些,,