键入网址到网页显示期间发生了什么
解析URL
生产HTTP请求消息
真实地址查询--DNS
协议栈
通过DNS获取到IP后,就可以把HTTP的传输工作交给操作系统中的协议栈。
可靠传输——TCP
远程定位——IP
我们假设Web服务器的目标地址是 192.168.10.200
条目3表示默认网关。 若其他条目都无法匹配,则自动匹配这一行。 后续由网卡 eth0 把包发给路由器 192.168.3.1;
- 0.0.0.0 :本机IP地址。
两点传输——MAC
发送方MAC:读取网卡中ROM里的值
接收方MAC:
先在路由表中找到相匹配的条目,然后把包发给Gateway列中的IP地址。
- 先查询ARP缓存;
- 再发送ARP广播查询;
出口——网卡
- FCS:帧校验序列
交换机
交换机工作在MAC层。
交换机的端口不具有MAC地址;而是直接接收所有的包存放在缓存区中。
若找不到指定的MAC地址,则转发到除源端口外的所有端口上; 收到相应包后,将其写入MAC地址包中。
若接收方MAC地址是一个广播地址,也会发送到除了源端口外的所有端口上。
路由器
- 路由器是基于IP设计的,俗称三层网络设备,路由器各端口都具有MAC地址和IP地址;
- 交换机是基于以太网设计的,俗称二层网络设备,端口不具有MAC地址。
路由器的包接收操作
检验MAC头部的接收方MAC地址; 若是发给自己的包则放入接收缓冲区中; 否则直接丢弃。
查询路由表确定输出端口
去掉MAC头部;根据IP头部进行包的转发操作。
路由器的发送操作
根据路由表的 网关列 判断:
- 若网关为IP地址,则该IP地址就是我们要转发到的目标地址;还未抵达终点;还需要继续由路由器转发;
- 若网关为空,说明已抵达IP包头里的目标地址。
知道IP地址后,通过ARP查询MAC地址,并发送;
通过交换机到达下一个路由器(接收方MAC地址即下一个路由器地址)。
源IP和目标IP始终不变; 一直变化的是MAC地址。
互相扒皮——服务端与客户端
Linux系统如何收发网络包
Linux接收网络包的流程
NAPI机制: 中断+轮询
- 当有网络包到达时,网卡发起硬件中断,执行中断处理函数(通过DMA技术,将网络包放入Ring Buffer);
- 函数处理完要 暂时屏蔽中断 ,然后唤醒软中断轮询处理数据(从Ring Buffer中拷贝数据到内核struct sk_buff缓冲区中);直到没有新数据时才恢复中断。(这样一次中断处理多个网络包,降低网卡中断开销)
- 网络包交给网络协议栈逐层处理;
Linux发送网络包的流程
- 调用Socket发送数据包的接口(系统调用),从用户态陷入到内核态;Socket层将应用层数据拷贝到Socket发送缓冲区中;
- 网络协议栈从Socket发送缓冲区中取出数据包,逐层处理。
- 触发软中断,告诉网卡驱动程序有新的网络包要发送;驱动程序通过DMA,从Ring Buffer中读取网络包,放入到硬件网卡的队列中。