输入网址到显示,期间经历哪些过程?
- HTTP:URL解析
- DNS:域名解析
- 操作系统协议栈
- 可靠传输TCP
- 远程定位IP
- 两点传输MAC
- 出口网卡
- 交换机
- 路由器
浏览器第一步工作就是要对输入的URL进行解析,从而确定发送给Web服务器的请求信息。
关于HTTP,可以看以下文章(由于无法给链接,关于以下文章可以私信我获取具体地址):
- HTTP基础知识
- HTTP/1.1优化
- TLS握手
- HTTPS优化
- HTTP/2
在进行完URL解析以后,需要通过DNS域名解析获取服务器的IP。
关于DNS,可以看以下文章:
- IP相关协议
操作系统协议栈
通过DNS获取到IP以后,就可以将传输工作交给操作系统协议栈。
应用程序(浏览器)通过调用Socket库来委托操作系统协议栈工作。协议栈大体分为两部分:
- 上半部分:负责接收和发送数据的TCP和UDP协议
- 下半部分:用于控制网络包收发操作的IP协议
IP协议中还包含ICMP协议(告知网络传输过程中产生的错误和控制信息)和ARP协议(获取MAC地址)。
IP下面的网卡驱动程序负责控制网卡硬件,网卡负责实际的收发操作(对网线中的信号执行收发)。
可靠传输TCP由于HTTP的传输层协议是TCP,因此我们还需要借助TCP的帮助,通信的双方需要建立TCP连接。
关于TCP,可以看以下文章(由于无法给链接,关于以下文章可以私信我获取具体地址):
- TCP三次握手
- TCP四次挥手
- TCP重传
- TCP滑动窗口
- TCP流量控制
- TCP拥塞控制
- 网络显形TCP三次握手
- TCP连接队列
- TCP性能优化
TCP在执行数据传输的时候会委托IP模块将数据封装成网络包发送给通信对象。
通过上图可以看出,IP协议里面需要有源IP地址和目的IP地址,由于HTTP是TCP传输,所以在IP首部中的协议后为0x06(表示TCP)。
客户端有多个网卡,源IP地址如何选择?
如果客户端有多个网卡(多个源IP地址),此时需要根据路由表规则来进行网卡(源IP地址)的选择。
# linux中查看路由表
route -n
具体的选择步骤如下:
- 将目标地址与路由表中的子网掩码进行与运算,算出来的结果如果和路由中的Destination一致,就是该路由对应的网卡的IP地址作为源IP地址
- 在路由表中有一条特殊的路由,目标地址和子网掩码都是0.0.0.0(表示默认网关,Gateway即路由器的IP地址),如果其他路由都无法匹配,就会自动匹配。
在IP头部生成以后,需要在IP头部的前面加上MAC头部。
MAC包头里需要发送方的MAC地址和接收方的MAC地址,在TCP/IP通信中,协议类型只有两种:
- 0800:IP协议
- 0806:ARP协议
关于ARP如何获取接收方MAC地址,可以看以下文章:
- IP相关协议
如何查看MAC地址缓存
arp -a
ARP缓存大体有三部分组成:
- IP地址
- MAC地址
- 网口名称
网络包只是内存中的一串二进制信息,无法直接发送给对方。需要网卡将数字信息转化为电路信号才能在网线上进行传输。
控制网卡需要借助网卡驱动程序,网卡驱动程序从IP层获取到包以后,会将其复制到网卡内的缓冲区,接着会在其开头加上报头和起始帧分界符,在末尾加上用于检测错误的帧校验序列。
数据包封装好以后,网卡会将包转换成电信号通过网线发出去。
交换机交换机是二层网络设备,目的是用来将数据包原样的转发至目的地。
交换机的端口没有MAC地址。
交换机中有MAC地址表,MAC地址表主要包含两个信息:
- 设备的MAC地址
- 设备连接在交换机的哪个端口上
交换机的包接收操作
- 网线中的电信号到达交换机的网线接口,交换机收到电信号以后,会将电信号转换成数字信号
- 通过包尾的FCS校验,如果校验通过则放入缓冲区
- 将包放入缓冲区后,需要查询一下包的接收方的MAC地址是否在交换机中的MAC地址表中
- 如果MAC地址表中有匹配的记录,就通过交换电路将包发送到记录上的端口中。
MAC地址表中没有如何处理?
MAC地址表中如果没有对应的MAC地址,交换机就无法判断将数据包转发至端口,此时交换机会将数据包发送至除源端口以外的所有端口上。端口上的设备收到数据包以后,如果自己的MAC地址与数据包中的相符,就会接收该数据包,并作出响应,只要返回了响应,交换机就可以将它写入MAC地址表,下次就不需要将包发送至所有端口了。
如果接收方是一个广播地址,交换机还是会把包发送至除源端口以外的所有端口。
路由器数据包在经历过交换机以后,顺利抵达了路由器,在路由器上会被转发到下一个路由器或目标设备。
路由器是三层网络设备的各个端口都有MAC地址和IP地址。
路由器的收发流程
- 路由器的端口收到电信号后,会将电信号转发给数字信号
- 路由器对包末尾的FCS进行错误校验
- 校验如果没有问题就检查MAC头部中的接收方MAC地址是否和自己的一致,如果是就放到接收缓冲区,否则就直接丢弃这个包
- 路由器接收到包以后,就会去掉包中的MAC头部
- 路由器会根据IP头部中的内容进行包的转发操作,路由器会根据路由表寻找下一跳的路由
- 找到匹配的路由以后,会根据路由表项中的Gateway列来判断对方的地址
- 如果网关是一个IP地址,则这个IP地址就是我们要转发的目标地址(此时还未到达终点,需要路由器继续转发)
- 如果网关为空,则IP头部中的接收方IP地址就是最终的目标地址
确定完目标IP地址以后,又会通过ARP确定MAC地址,最终将封装数据包(IP层的目标IP不会发生变化)发送出去。在整个数据包转发过程中可以看出源IP和目标IP始终不会变化,但MAC地址一直是在变化的。
,