Linux的网络接口分为网络设备接口、网络接口核心、网络协议族和网络接口套接字层四个部分。
值得借鉴:
3358 lxr.Linux.no/linuxv2.6. 30.4/net /
网络设备接口部分主要负责收发来自物理媒体的数据,实现的文件在linu/driver/net目录下。
网络接口的核心部分是整个网络接口的重要部分,负责为网络协议提供统一的发送接口,屏蔽各种物理介质,同时将下层的数据包发送到合适的协议。 是网络接口的中枢部分。 其主要实现文件位于linux/net/core目录中,其中linux/net/core/dev.c是主要的管理文件。
网络协议族部分是各种具体协议的实现部分。 Linux支持TCP/IP、IPX、X.25、AppleTalk等协议,通过各种具体协议实现的源代码在linux/net/目录中进行了正确的命名。 这里主要讨论TCP/IP(ipv4 )协议,实现的源代码在linux/net/ipv4,其中linux/net/ipv4/af_inet.c是主要的管理文件。
网络接口套接字层为用户提供的网络服务的编程接口。 主要源代码位于linux/net/socket.c
发送:
APP应用程序调用系统调用并将数据发送到套接字
套接字检查数据类型并调用相应的send函数
send函数检查套接字状态、协议类型,并传递给传输层
tcp/udp (传输层协议)生成这些数据的数据结构,添加端口号、检查、下层)、网络层)等协议头部并传递
添加ip (网络层协议) ip地址、检查、检查等ip报头
如果包大小超过mtu (最大包大小),则片化; ip将这些数据包传递到链路层
将链路层写入网卡队列
网卡调用中断驱动程序并将其发送到网络
接收:
数据包从网络到达网卡,网卡接收帧,放入网卡buffer,向系统发送中断请求
cpu调用相应的中断函数,这些中断处理程序位于网卡驱动程序中
中断处理函数从网卡读取存储器,传递给链接层
链路层将数据包放入自己的队列,设置软中断标志
调度程序查看标志位并调度相应的进程
进程将数据包从队列中取出,与对应的协议(通常为ip协议)相匹配,并将数据包传递给其协议接收函数
ip层进行数据包的错误检测、无错误、路由选择
路由的结果是,packet被传输或继续传递到上层
发送到本机后,进入链路层
链路层还进行错误检测,找到适当的端口相关套接字,分组进入适当的套接字接收队列
套接字调用具有该套接字的进程,该进程从读系统调用返回,将数据复制到自己的buffer,然后返回用户状态。
1、PC1需要知道对应的IP地址才能访问www.google.com。
域名只作为助记符,互联网访问通过IP进行。
例如,DNS是公民身份信息库,ip是身份证号码,域名是与该身份证号码对应的人名。
当然,这个实例是不合适的,域名也必须是唯一的,并对应于ip。
2、因此,PC1像DNS请求那样,需要寻找与www.google.com相对应的ip,即发送DNS请求。
PC1找dns,发现不在同一网络上。 不同的网段需要网关转发。
但是,PC1首先需要发送到网关,首先需要知道网关ip。
网关用于连接到不同的网络,并有自己的IP。 PC1需要知道网关IP。 ARP请求使得网关向mac地址发送回消息,如内部网广播网关ip。
PC1取得网关的mac地址,将ip分组封装在以太网帧中,发送到网关。
3、网关需要接收此以太网帧并转发至dns服务器。
类似地,网关可能需要发送ARP请求,并获得dns的mac地址。
4、dns服务器接收到请求,将www.google.com的ip发送至网关,网关基于NAT会话表项,将目的地ip变换为PC1,然后发送至PC1。 该过程也可能需要ARP请求。
5、PC1接收目的地ip,可以按照上述方式发送请求(目的地ip可以直接填写所取得的ip )。
其中:
广播ARP==,目的地主机回复并反馈mac地址。
NAT==在网络中自定义合法的ip地址。 各主机通过内部网进行通信; 通过外联网和NAT变换,成为外联网的合法ip。 这样,我们就可以将内部网和外部网隔离开来,每个网络都有自己的ip,可以通过少量的ip进行通信,虽然存在重叠。 在ip严重短缺的现代,节约了很多。