输入网址到网页显示的过程
输入网址到网页显示的过程
- 1. 浏览器解析 URL
- 2. 域名解析
- 解析的流程
- 3. TCP通过三次握手建立连接
- 4. 生成TCP段:在数据的前面加上 TCP 头部,生成TCP段
- TCP 头部
- 5. 生成IP数据报:在TCP段的前面加上 IP包头,生成IP数据报
- IP包头
- 6. 在IP 数据报的前面加上 MAC头部
- MAC 头部
- ARP查询MAC地址的过程
- 7. 封装成帧,网卡发送数据
- 8. 交换机
- 9. 路由器转发
- 10. 交换机
- 11. 网卡接收数据
- 12. 服务器处理请求进行数据回传
- 13. 断开连接
1. 浏览器解析 URL
输入网址后,浏览器做的第一步工作是解析 URL,根据解析的信息,生成 HTTP 消息,发送请求给 Web 服务器
如果说输入的网址是https://www.baidu.com/s?wd=4399,最后解析结果是GET请求,Web 服务器www.baidu.com,参数wd=“4399”
2. 域名解析
发送给Web 服务器之前需要查询服务器域名对应的 IP 地址,因为实际发送请求是需要 IP 地址,而我们目前只知道域名www.baidu.com,因此需要进行DNS域名解析。
解析的流程
1.客户端发送DNS请求给DNS服务器,问 www.baidu.com 的 IP 是啥
2. DNS服务器查表,看是否有 www.baidu.com 对应的IP地址,如果有直接返回IP地址,没有则向根域名服务器发送DNS请求,根域名服务器 返回 顶级域名服务器地址 给本地 DNS服务器
3. 向顶级域名服务器发送DNS请求,顶级域名服务器 返回 权威域名服务器地址 给本地 DNS服务器。
4. 向权威域名服务器发送DNS请求,权威域名服务器查到之后将IP地址返回给本地 DNS 。
5. 本地DNS将该域名和对应的IP地址写入自身缓存,再将 IP 地址返回客户端。
一般来说很少到根域名服务器去寻找,因为浏览器,操作系统,本地DNS都可能会有对这个域名的缓存。
3. TCP通过三次握手建立连接
4. 生成TCP段:在数据的前面加上 TCP 头部,生成TCP段
TCP分段的原因:如果数据太大不太容易传输,并且数据丢失不需要重新传所有数据,只需要传丢失的TCP段。
如果 HTTP 请求消息比较长,超过了 MSS(Maximum Segment Size,最大报文段长度)的长度,这时 TCP 就需要把 HTTP 的数据拆解成一块块的数据发送,而不是一次性发送所有数据。
TCP 头部
源端口号和目标端口号,为了区分哪一个应用或服务的。
序号,这个是为了解决包乱序的问题,防止数据分段之后无法按照正确顺序合并。
确认号,目的是确认发出去对方是否有收到。如果没有收到就应该重新发送,直到送达,这个是为了解决丢包的问题。
状态位,通过状态位的变更来建立和断开连接以及接收和发送消息等。
窗口大小,能够进行流量控制和拥塞控制。
5. 生成IP数据报:在TCP段的前面加上 IP包头,生成IP数据报
IP包头
源地址IP,即是客户端输出的 IP 地址;
目标地址,即通过 DNS 域名解析得到的 Web 服务器 IP。
因为 HTTP 是经过 TCP 传输的,所以在 IP 包头的协议号,要填写为 06(十六进制),表示协议为 TCP。
标志,DF(dongt fragment),意思是“不能分片”。当DF=0时才允许分片。MF(more fragment)。MF=1即表示后面“还有分片”的数据报。MF=0表示这是若干数据报片中的最后一个。
片偏移,较长的IP报文在分片后,某片在原分组中的相对位置。
IP数据报切片的原因:以太网规定MTU为1500字节。MTU是数据链路层所规定的,用于限制链路层数据部分的长度。网络层是链路层的数据部分。所以如果所传送的数据报长度超过链路层的MTU值,就必须把过长的数据进行分片处理。
例如:一数据报的总长度为3820字节,数据部分为3800字节(IP首部为固定20字节),需要分片传输。假设每片IP报文长度不超过1420字节。去掉固定首部长度20字节,每片报文数据部分长度不超过1400。于是分成3个数据报片,其数据部分长度分别为1400、1400、100字节。原始数据报首部被复制为各数据报片的首部。
参考文章:IP数据报格式
6. 在IP 数据报的前面加上 MAC头部
发送方的 MAC 地址在发送方电脑上存储,可以直接读取,那接收方的 MAC 地址如何获取呢,此时就需要 ARP 协议帮我们找到接收方的 MAC 地址。
MAC 头部
ARP查询MAC地址的过程
- 先查询 ARP 缓存,如果已经保存了对方的 MAC 地址,就不需要发送 ARP 查询,直接使用 ARP 缓存中的地址。
- 当 ARP 缓存中不存在对方 MAC 地址时,ARP 协议会在以太网中以广播的形式,对以太网所有的设备喊出:“这个 IP 地址是谁的?请把你的 MAC 地址告诉我”。然后就会有人回答:“这个 IP 地址是我的,我的 MAC 地址是 XXXX”。
7. 封装成帧,网卡发送数据
网卡会将包转为电信号,通过网线发送出去。要控制网卡还需要靠网卡驱动程序。
网卡驱动获取网络包之后,会将其复制到网卡内的缓存区中,接着会在其开头加上报头和起始帧分界符,在末尾加上用于检测错误的帧校验序列( FCS)进而封装成帧。
8. 交换机
- 电信号到达网线接口,交换机里的模块进行接收
- 交换机里的模块将电信号转换为数字信号,然后通过包末尾的 帧校验序列( FCS) 校验错误,如果没问题则放到缓冲区
- 查找这个包的接收方的 MAC 地址是否在 MAC 地址表中
- 如果在将信号发送到相应的端口
- 如果不在将包转发到除了源端口以外的所有端口上,只有相应的接收者才接收包,而其他设备则会忽略这个包,当接收者接收包的时候,交换机就会更新MAC地址表,记录新发现的MAC地址和对应的端口。
9. 路由器转发
- 电信号到达网线接口部分,路由器中的模块进行接收
- 路由器里的模块会将电信号转成数字信号,然后通过包末尾的 帧校验序列( FCS) 校验错误。如果没问题则检查 MAC 头部中的接收方 MAC 地址,看看是不是发给自己的包,如果是就放到接收缓冲区中,否则就丢弃这个包。
- 路由器根据 MAC 头部后方的 IP 头部中的内容进行包的转发操作
- 经过层层转发之后,网络包到达最终的目的地
10. 交换机
- 交换机接收来自路由器的数据包,并检查其源MAC和目的MAC地址。
- 根据数据包的目的MAC地址查找其内部的MAC地址表,以确定数据包应该转发到哪个端口。
- 确定了目的端口,交换机将数据包转发到连接到目的设备的端口。
11. 网卡接收数据
- 数据包抵达服务器后,服务器先扒开数据包的 MAC 头部,查看是否和自己的 MAC 地址符合,符合就将包收起来,如果不符合就丢弃。
- 接着扒开数据包的 IP 头,发现 IP 地址符合,根据 IP 头中协议项,知道自己上层是 TCP 协议。
- 于是扒开 TCP 的头,里面有序列号,需要看一看这个序列包是不是我想要的,如果是就放入缓存中然后返回一个 ACK,如果不是就丢弃。TCP头部里面还有端口号, HTTP 的服务器正在监听这个端口号。
- 于是服务器就知道是 HTTP 进程想要这个包,于是就将包发给 HTTP 进程。
12. 服务器处理请求进行数据回传
- 服务器的 HTTP 进程看到,原来这个请求是要访问一个页面,于是就把这个网页封装在 HTTP 响应报文里。
- HTTP 响应报文加上 TCP、IP、MAC 头部,源地址是服务器 IP 地址,目的地址是客户端 IP 地址。
- 接着网卡发送响应数据包,由交换机转发到路由器,路由器就把响应数据包发到了下一个路由器,就这样跳啊跳。最后跳到了客户端的路由器,路由器扒开 IP 头部发现是要找城内的人,于是又把包发给了城内的交换机,再由交换机转发到客户端。
- 客户端收到了服务器的响应数据包后,开始扒皮,把收到的数据包的皮扒到只剩 HTTP 响应报文后,交给浏览器去渲染页面,数据包就这样显示出来了。
13. 断开连接
客户端向服务器发起了 TCP 四次挥手,双方连接断开。