网络综合

110 阅读3分钟

键入网址到网页显示期间发生了什么

解析URL

image.png

生产HTTP请求消息

image.png

真实地址查询--DNS

image.png

协议栈

通过DNS获取到IP后,就可以把HTTP的传输工作交给操作系统中的协议栈。

image.png

可靠传输——TCP

image.png

image.png

远程定位——IP

image.png

我们假设Web服务器的目标地址是 192.168.10.200

image.png

条目3表示默认网关。 若其他条目都无法匹配,则自动匹配这一行。 后续由网卡 eth0 把包发给路由器 192.168.3.1

  • 0.0.0.0 :本机IP地址。

两点传输——MAC

image.png

发送方MAC:读取网卡中ROM里的值

接收方MAC

先在路由表中找到相匹配的条目,然后把包发给Gateway列中的IP地址。

  • 先查询ARP缓存;
  • 再发送ARP广播查询;

image.png

出口——网卡

image.png

  • FCS:帧校验序列

交换机

交换机工作在MAC层。

交换机的端口不具有MAC地址;而是直接接收所有的包存放在缓存区中。

image.png

若找不到指定的MAC地址,则转发到除源端口外的所有端口上; 收到相应包后,将其写入MAC地址包中。

若接收方MAC地址是一个广播地址,也会发送到除了源端口外的所有端口上。

路由器

  • 路由器是基于IP设计的,俗称三层网络设备,路由器各端口都具有MAC地址和IP地址;
  • 交换机是基于以太网设计的,俗称二层网络设备,端口不具有MAC地址。

路由器的包接收操作

检验MAC头部的接收方MAC地址; 若是发给自己的包则放入接收缓冲区中; 否则直接丢弃。

查询路由表确定输出端口

去掉MAC头部;根据IP头部进行包的转发操作。

image.png

路由器的发送操作

根据路由表的 网关列 判断:

  • 若网关为IP地址,则该IP地址就是我们要转发到的目标地址;还未抵达终点;还需要继续由路由器转发;
  • 若网关为空,说明已抵达IP包头里的目标地址。

知道IP地址后,通过ARP查询MAC地址,并发送;

通过交换机到达下一个路由器(接收方MAC地址即下一个路由器地址)。

源IP和目标IP始终不变; 一直变化的是MAC地址。

互相扒皮——服务端与客户端

image.png

Linux系统如何收发网络包

image.png

Linux接收网络包的流程

NAPI机制: 中断+轮询

  1. 当有网络包到达时,网卡发起硬件中断,执行中断处理函数(通过DMA技术,将网络包放入Ring Buffer);
  2. 函数处理完要 暂时屏蔽中断 ,然后唤醒软中断轮询处理数据(从Ring Buffer中拷贝数据到内核struct sk_buff缓冲区中);直到没有新数据时才恢复中断。(这样一次中断处理多个网络包,降低网卡中断开销)
  3. 网络包交给网络协议栈逐层处理;

Linux发送网络包的流程

  1. 调用Socket发送数据包的接口(系统调用),从用户态陷入到内核态;Socket层将应用层数据拷贝到Socket发送缓冲区中;
  2. 网络协议栈从Socket发送缓冲区中取出数据包,逐层处理。
  3. 触发软中断,告诉网卡驱动程序有新的网络包要发送;驱动程序通过DMA,从Ring Buffer中读取网络包,放入到硬件网卡的队列中。