网址访问页面中间发生了哪些过程
URL解析
URL组成信息
URL实际上就是访问 Web服务器里面的文件资源。
组装HTTP报文
根据 URL 解析得到的内容,进行报文组装。
HTTP 作为应用层规范的协议,规定了发往应用层的报文格式。
DNS域名解析
解析URL时,如果web服务器是域名,需要走DNS服务器进行域名解析,得到真实访问的IP地址。
域名组成
www.server.com.
类似树状结构,越右等级越高。
域名组成都代表了DNS服务器,里面保存了域名和IP的对应关系。
域名服务器就像是一个树状结构。
- 根 DNS 服务器(.)
- 顶级域 DNS 服务器(.com)
- 权威 DNS 服务器(server.com)
域名解析的流程
域名解析的过程就是 只指路不带路,从顶级域一直向下找。
www.server.com. 最后的 . 代表着根域。
根域的服务器信息在所有的 DNS 服务器都存在,只要找到任意一台 DNS 服务器,都能找到根域,然后一路向下找。
本地DNS域名服务器
协议栈
获取真实IP地址之后,应用层通过调用Socket库,来委托协议栈工作。
协议栈包含传输层的 TCP 和 UDP 协议,还包含网络层的 IP 协议。
传输协议TCP
像HTTP协议就是基于TCP协议进行传输的。
通过 TCP 的三次握手,服务端和客户端进行连接。
应用层的 HTTP报文和 TCP头部封装在一起,形成网络包发给网络层进行网络传输。
TCP的功能
- 确认客户端和服务端的收发能力,确认收消息的服务端。
- 组装网络包,交给网络层发送数据。
远程定位IP
IP协议位于网络层,传输层的 TCP协议发送的数据,都需要委托给网络层的 IP 模块将数据包封装,并进行进一步处理传输。
IP报文头部
IP报文头部需要有源地址 IP 和目标地址 IP。
源地址IP
目标地址IP
DNS域名解析得到的IP地址。
协议
由于HTTP是基于TCP的,IP报文头部的协议需要填
06
(16进制),表示 TCP。
源地址IP确认
假如客户端有多个网卡,就会有多个 IP 地址,那么如何选择源地址IP?
可以根据路由表来确认由哪一个网卡发送请求,使用网卡IP地址作为源地址 IP。
查看路由表
Plain Text route -n
通过路由表可以看到网卡的信息。
比如 eth0 和 eth1。
eth0 的网段是 192.168.3.0 , 子网掩码是 255.255.255.0。
其中第三条是默认网卡,网段 0.0.0.0,Gateway 对应 192.168.3.1,是路由器的地址。
在匹配不到网卡的时候,使用默认网卡,此时源地址IP 就是路由器地址。
匹配过程
- 遍历路由表。
- 将目的端地址与子网掩码进行与运算(求网段)。
- 如果网段与网卡的网段一致,则源地址IP 使用该网卡的 IP。如果不匹配接着找下一个网卡。
- 如果目的端地址没有匹配到网卡,使用默认网卡,源地址IP 就是路由器IP。
查看网卡的IP地址
Plain Text ifconfig
网络层报文格式
在传输层发给网络层的 TCP 段基础上,加上 IP 头部。
保证确认目的端的IP地址。
以太网传输MAC
数据通过网络层的 IP协议封装之后,确保了目的端地址。
通过网络层的 IP 寻址功能,能在互联网中找到对应的网络,但是访问的目标是属于一个局域网(以太网) ,而在以太网中要用 MAC 地址来标识机器。
有了IP地址为什么还需要MAC地址
IP地址在网络架构里面的网络层,主要是为了定位目的端所在位置。
IP 地址是会变动的,比如上网选择自动获取 IP地址,那么 IP地址就会发生变化。
MAC地址在网络接口层,每台设备都有自己的 MAC地址,是固定不变的。
两个设备之间需要通过 MAC 地址来确认身份。
MAC头部
- 接收方和发送方MAC地址,保证两点传输。
- 协议类型
- 0800:IP协议
- 0806:ARP协议
如何确认MAC地址
发送方
MAC地址在网卡生产时就设置好了,发送方只需要读取出来,写入MAC头部就好。
接收方
在以太网中,只要告诉以太网对方的MAC地址,以太网就会帮我们把数据包发送过去。
搞清楚要把包发给谁,通过查询路由表,找到匹配的路由。将包发给 Gateway 对应地址。
ARP协议 - 广播形式
ARP协议在以太网中,以广播的形式获取 接收方对应的 MAC地址。
ARP协议不需要每次都缓存获取,查询结果放到了 ARP 缓存中,不过缓存时间就几分钟。
在发包时,查询 ARP 缓存:
- 包含 IP 对应的 MAC地址,使用缓存信息。
- 缓存不包含,使用 ARP 协议广播查询。
查看 ARP 缓存内容
Plain Text arp -a
网络接口层报文格式
出口-网卡
浏览器的 URL 经过HTTP、TCP、IP、MAC层层封装,形成网络包格式。
但是还只是存放在内存的二进制信息,要通过网络访问的远程主机,要走网线就要转换为电信号。
负责执行电信号转换传输的部分是网卡,控制网卡还需要网卡驱动。
操作流程
网卡拿到网络包之后,会将复制到网卡缓冲区,并且在开头和结尾进行封装。
最后将包转换为电信号,通过网线传输出去。
报头和起始帧分隔符
标识包起始位置的标记。
FCS - 帧校验序列
检查包传输过程是否损坏。
送别者-交换机
交换机的设计目的是将网络包转发到目的地。交换机在MAC层(数据链路层)工作.
在七层网络模型中,数据链路层是第二层,所以交换机称为二层网络设备。
交换机的包接受操作
网络包通过网卡发送电信号后,电信号通过网线接口,经交换机的模块进行接收。
然后交换机将电信号转换为数字信号。
通过网络包的 FSC 校验错误,如果没问题放入缓冲区。
交换机和网卡的区别
- 交换机的端口没有MAC地址,而网卡有MAC地址.
- 网卡收到网络包时, 根据网络包对应的接收方 MAC地址,来判断网络包是不是自己的.
- 交换机不会识别网络包,而是将所有网络包放到缓冲区.
包转发
交换机通过接收模块将以太网下所有网络包都放到了缓冲区.
在以太网中,每个设备有自己的MAC地址,连接在交换机上的时候,有自己的端口.
接下来要判断网络包发往哪里.
通过判断接收方MAC地址和端口的匹配关系,也就是交换机-MAC地址表:
- 设备的MAC地址.
- 设备连接在交换机哪个端口上.
对于网络包,交换机根据接收方MAC地址,从MAC地址表里面查,查到对应的端口,然后将信号发送到对应的端口上。
当MAC地址表找不到MAC地址?
当找不到对应的MAC地址时,交换即就会将网络包发给每个端口.
虽然每个设备都会收到网络包,但是只有真正的接收者才会接收,其它都会忽略.
而且只要接收方成功接收网络包,向交换机返回响应包后,交换机就会将接收方的MAC地址写入MAC地址表.
接收方广播
如果接收方的MAC地址是一个广播地址,就会向除了源端口以外的所有端口转发网络包.
以下两个属于广播地址:
- MAC 地址中的
FF:FF:FF:FF:FF:FF
- IP 地址中的
255.255.255.255
一个HTTP请求,经过计算机的层层封装,经过网卡转换电信号,发给交换机.目前整个过程都是在局域网中. 主要通过MAC地址进行寻址. 交换机再转发给路由器,路由器就会进入互联网,通过IP寻址.
路由器
网络包经过交换机转发,到达路由器.并由路由器在互联网中转发,转发到下一个路由器或者目标设备.
路由器和交换机的区别
- 交换机基于以太网(局域网)设计的,称为二层网络设备.交换机的端口不具有MAC地址.
- 路由器基于IP设计的,称为三层网络设备,路由器的各个端口都具有MAC地址和IP地址.
路由器原理
路由器的端口都具有MAC地址,这就表示它能够作为以太网的接收方和发送方.因为以太网就是基于MAC地址进行信息交互的.
而同时路由器还有iIP地址,保证在互联网中能通过IP地址进行交互.
网络包交互
路由器端口会接受发给自己的以太网包,然后根据路由表查询转发目标,再经相应的端口作为发送方将以太网包发送出去.
网络包接收过程
电信号到达网线接口后,路由器的模块会将电信号转换为数字信号.通过末尾的FCS进行错误校验.
校验MAC地址
- 检查网络包中接收方的MAC地址,如果是发给自己的包,则放到缓冲区,否则就会丢弃.
- 路由器的端口都具有MAC地址,只接受与自身匹配的包.
去掉MAC头部
完成接收操作之后,去掉MAC头部.因为MAC头部的作用就是将包送到路由器,网络包中的MAC头部地址对应路由器端口的MAC地址.
接下来就不需要MAC头部了,需要的是MAC头部后方的IP头部,在互联网中进行包的转发操作.
查询路由表确认输出端口
根据路由表判断转发目标
转发流程和网卡转发一致
判断接收方地址是否属于某个路由的网段,如果属于,则该路由就属于转发目标.
如果找不到路由,则使用默认路由,默认路由就作为转发目标
路由器的发送操作
- 根据路由表确认转发目标的路由.
- 根据路由确认归属路由器.
如果路由的网关是一个IP地址,说明还没到达终点,还需要经过路由器继续转发到下一个网关路由器.
此时会将该路由网关地址作为接收方地址继续转发.
如果网关为空,则接收方的IP地址就是目标地址,说明找到了该网络包归属的路由器.
- 找到路由器之后,通过ARP协议根据IP地址查询MAC地址,将查询结果作为接收方MAC地址.
路由器的层层转发
发送的网络包通过交换机到达下一个路由器.由于接收方的MAC地址就是下一个路由器的地址,经过层层转发,网络包最终到达目的地.
在整个转发的过程中,源IP和目的IP始终不会变,一直变化的是MAC地址.
在发送数据包时,如果目标主机不是本地局域网,填入的 MAC 地址是路由器,也就是把数据包转发给路由器,路由器一直转发下一个路由器,直到转发到目标主机的路由器,发现目标 IP 地址是自己局域网内的主机,就会 ARP 请求获取目标主机的 MAC 地址,从而转发到这个服务器主机。
比如在路由器查找路由时,有可能转发的还是路由器,此时接收方MAC地址为转发路由器的MAC地址.
在层层转发过程中,基本属于以下流程:
- 通过路由器查找IP对应的路由.
- 路由网关不为空,说明有下层路由,将网关ip作为接收者ip,和该路由对应的MAC地址.作为接收者MAC地址,经路由器端口转发给交换机.
- 最终路由网关为空时,说明找到最终路由了.在该路由上根据ARP协议,找到IP地址对应的MAC地址.在通过交换机根据MAC地址转发网络包到对应设备.
服务端的数据处理
在发送端,计算机会将HTTP请求层层封装.
而在接收端则要层层拆开,获取最初的网络报文.
识别网络包内容
- 拆开MAC头部,判断是否和服务器MAC地址符合.
- 拆IP头部,确认IP地址是否符合,并且判断协议项,知道上层协议是TCP协议.
- 拆开TCP协议.
- 根据TCP头部的序列号,判断是否是需要的网络包,如果是的话放入缓存,并且返回ACK确认标识.如果不是丢弃.
- 根据TCP头部的端口号,能找到对应的进程,将包发给HTTP进程.
- 进程获取网络包后,根据HTTP数据发现访问的是一个页面,于是将网络页面封装在HTTP响应报文里面.
发送响应内容
- HTTP进程将结果封装到HTTP响应报文.
- 依次封装TCP头部,不过这次源地址是服务端的IP地址,目的地址是客户端的IP地址.
- 封装IP头部.
- 封装MAC头部.
- 服务端将封装好的网络包从网卡转发给交换机,交换机转发给路由器,路由器层层转发到目的路由器.
- 目的路由器转发给交换机.交换机转发给客户端.
- 客户端收到服务端的响应网络包后,层层拆解.
- 最终获取到HTTP响应报文.
- 最后,客户端要断开连接,向服务端发起TCP四次挥手,至此双方连接断开.