文章目录
- 1. URL 解析
- 2. DNS 解析
- 3. TCP 连接
- 4. 发送HTTPS请求
- 5. IP 首部和 MAC 首部
- 6. 网卡
- 7. 交换机
- 8. 路由器
- 9. 目标服务器
1. URL 解析
首先浏览器做的第一步操作就是对URL进行解析。
以 https://blog.csdn.net/weixin_48922154 为例:
- 先通过该URL检查是否是合法的URL。通过URL检测使用的协议,请求的服务器以及请求的文件。
- 再检查缓存,如果有该内容的浏览器缓存,那么就不需要请求服务器而直接显示页面。
- 否则,就通过解析这些信息之后,使用这些信息生成HTTP请求消息,包括:
- 请求行:请求的方法,请求URL和HTTP版本号。
- 首部:
- 请求首部:例如 ① Accept:用户代理可处理的媒体类型;② User-Agent:客户端程序信息等。
- 通用首部:例如 ① Cache-Control:控制缓存的行为;Date:创建报文的日期时间等。
- 实体首部:例如 ① Content-Encoding:实体主体适用的编码方式;② Content-Length:实体主体的大小((单位:字节)。
- 之后是一个空行,再之后就是请求的具体请求体数据。
2. DNS 解析
通过浏览器解析URL并生成HTTP报文之后,需要通过委托操作系统将消息发送给相应Web服务器。
DNS解析就是将服务器的域名转化为IP地址的过程,因为所有节点都通过IP进行唯一标识,而IP记忆困难所以使用域名进行转化。
DNS在应用层中已经详细阐述了,具体内容在:
DNS解析过程
为什么DNS使用UDP?:
- 因为TCP握手挥手耗费大量性能,例如查询冷门的网站,则从查询根域名系统到顶级域名系统,再到权威域名系统,每次都要进行一次握手和挥手操作。
- 但是当DNS查询数据包很大的时候,会使用TCP传输。
3. TCP 连接
- 在传输层中,如果HTTP消息也就是TCP的数据字段大于MSS报文最大长度,则会将数据切分成MSS长度的若干段。再给每一段封装上TCP首部。形成一个传输层报文段。
- 通过三次握手和目标进程建立连接之后,将报文段交给网络层进行传输。详细步骤在另一篇博客。
TCP 协议具体内容
4. 发送HTTPS请求
如果选择的协议类型是HTTPS而不是HTTP,那么在建立连接之后会自动跳转到HTTPS网站。
HTTPS是将HTTP和TCP层中间加上了一层TLS安全传输层,每次HTTP报文的发送和接受,会经过安全传输层的加密和解密,以此来达到安全的目的。
因为HTTP和HTTPS的端口不同,所以服务端和客户端之间会建立新的TCP连接,连接建立好之后进行安全传输的TLS四次握手。握手成功之后就可以进行安全的传输。详细内容在下面这两篇博客。
HTTPS
网络安全
5. IP 首部和 MAC 首部
首先需要将传输层传递来的报文段再封装为数据报,加上IP首部字段,
- 如IP版本,首部长度,协议类型是TCP;
- TCP协议已经将报文段切分成MSS大小,所以不需要进行IP分片,所以不需要填入标识符、标志字段和片偏移字段;
- 之后添加上源IP地址和目标IP地址。
- 如果本机有多个网卡,那应该选用哪个?
这时候可以使用路由表来查询:使用route -n命令得到路由表
通过目的地址(Destination) 和子网掩码(Genmask) 进行与操作得到地址和目标地址匹配,如果能匹配的上,则使用该IP,如果不能匹配则使用0.0.0.0的默认路由。
- 如此操作就生成了IP数据报并传递给链路层。
链路层将IP数据报封装为链路层帧,加上MAC首部:
- MAC首部主要包括发送方MAC地址,以及接收方MAC地址和协议字段。
- 在TCP/IP通信中,协议类型只有:
- IP协议:0800
- ARP协议:0806
- 发送方MAC地址是网卡生产的时候写入到ROM里面的,直接读出填入MAC源地址字段即可。
- 对于接收方MAC地址则是通过以下方式获取:
- 先向高速缓存中查询是否有目标IP地址对应的MAC地址,如果没有。
- 向同一链路广播一个ARP请求包,内容包括本机的IP地址以及目标主机的IP地址。
- 如果某个路由器有去往该IP的路由规则,或者某台主机IP地址就是目标IP地址,就会发回一个ARP响应包,内容是需要发送的MAC地址。
- 源主机收到响应包会将MAC地址写入接受方MAC地址字段,并将该MAC地址存入高速缓存。
由次MAC首部也添加完毕,形成一个链路层帧。可以通过物理层设备进行发送。
6. 网卡
真正执行发送任务的还是通过硬件网卡,而操作网卡的是网卡控制器,操作网卡控制器的又是网卡驱动程序(IO设备层次)。
网卡驱动获取到链路层帧之后,将其复制到网卡内的缓冲区,并在开头加上报文头和起始帧分隔符,尾部加上FCS帧校验序列。
都完成之后,再将数据包转换成电信号,通过网线传输出去。
7. 交换机
电信号到达网线接口,由交换机进行接收,并且把其中的电信号转换成数字信号。再通过校验检测是否出错,如果没错,则放入缓冲区。
另外由于交换机自学习的特性,它会将传送来的接口以及MAC地址做一个记录在MAC地址表中。
再通过查询MAC地址表,将收到的分组传递到应该去的接口上。
详细可以看
交换机详细内容
8. 路由器
网络包经过交换机到达路由器,并在此被转发到下一个路由器或者目标设备。路由器是基于IP进行转发器的,是第三层网络交换设备。
路由器检查校验和以及接受方MAC地址和自己是否相同,匹配之后,会将MAC首部去除,从IP首部中提取目标IP地址,通过路由表查询下一条输出链路端口,并把网络包从该端口转发。通过RIP,OSPF以及BGP协议,数据报被路由器一步步转发到目标地址。
9. 目标服务器
当数据报达到目标=服务器之后,服务器就会对数据包进行一层一层的扒皮:
- 检查MAC首部中目的MAC地址和自己的MAC地址是否匹配。然后去除MAC首部。
- 检查IP地址是否匹配然后去除IP首部。
- 检查TCP首部序号是否对应等,再通过TCP首部的端口号,分发到对应进程。
- HTTP进程收到请求之后,将需要返回的数据封装在响应报文中,并返回,返回的过程就是上述过程的逆向,一层一层封装首部,从网卡发出,交到交换机手上并发给路由器,由路由器转发对目标地址对应的交换机,再由交换机转发到客户端。
- 客户端收到响应报文后,浏览器渲染页面。