网络数据包发送接收全过程
Linux的网络接口分为四部分:网络设备接口,网络接口核心,网络协议族,网络接口socket层。 可参考: 网络设备接口部分主要负责从物理介质接收和发送数据,实现的文件在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是主要的管理文件。 网络接口Socket层为用户提供的网络服务的编程接口,主要的源码在linux/net/socket.c 发送:
应用程序调用系统调用,将数据发送给socket socket检查数据类型,调用相应的send函数 send函数检查socket状态、协议类型,传给传输层 tcp/udp(传输层协议)为这些数据创建数据结构,加入协议头部,比如端口号、检验和,传给下层(网络层) ip(网络层协议)添加ip头,比如ip地址、检验和 如果数据包大小超过了mtu(最大数据包大小),则分片;ip将这些数据包传给链路层 链路层写到网卡队列 网卡调用响应中断驱动程序,发送到网络
接收:
NAT==>在一个网络内部,自定义合法的ip地址。内网各主机通过内网通讯;与外网通过NAT转换,变成外网合法ip。这样,将内网与外网隔离,各个网络有自己的ip,既可以重叠,又可以通过少数几个ip与外网通讯,在ip大量缺乏的现代,节省了很多。
