转载自:http://blog.csdn.net/hilyoo/article/details/4455031

Linux的网络接口分为四部分:网络设备接口,网络接口核心,网络协议族,网络接口socket层。
可参考:
http://lxr.linux.no/linux+v2.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是主要的管理文件。

  网络接口Socket层为用户提供的网络服务的编程接口,主要的源码在linux/net/socket.c

发送:

应用程序调用系统调用,将数据发送给socket
socket检查数据类型,调用相应的send函数
send函数检查socket状态、协议类型,传给传输层
tcp/udp(传输层协议)为这些数据创建数据结构,加入协议头部,比如端口号、检验和,传给下层(网络层)
ip(网络层协议)添加ip头,比如ip地址、检验和
如果数据包大小超过了mtu(最大数据包大小),则分片;ip将这些数据包传给链路层
链路层写到网卡队列
网卡调用响应中断驱动程序,发送到网络

接收:

数据包从网络到达网卡,网卡接收帧,放入网卡buffer,在向系统发送中断请求
cpu调用相应中断函数,这些中断处理程序在网卡驱动中
中断处理函数从网卡读入内存,交给链路层
链路层将包放入自己的队列,置软中断标志位
进程调度器看到了标志位,调度相应进程
该进程将包从队列取出,与相应协议匹配,一般为ip协议,再将包传递给该协议接收函数
ip层对包进行错误检测,无错,路由
路由结果,packet被转发或者继续向上层传递
如果发往本机,进入链路层
链路层再进行错误侦测,查找相应端口关联socket,包被放入相应socket接收队列

socket唤醒拥有该socket的进程,进程从系统调用read中返回,将数据拷贝到自己的buffer,返回用户态。

DNS请求流程

1、PC1要访问www.google.com,需要先知道对应IP地址。
域名只起助记作用,互联网访问通过IP进行。
比方,DNS是公民身份信息库,ip是身份证号,域名是该身份证号对应的人名。
当然,这个比方不是很恰当,域名也必须唯一的,与ip对应。

2、于是,PC1需要像DNS请求,查找www.google.com对应的ip,即发送dns请求:
PC1查找dns,发现不在同一个网络,不同网段需要网关转发。
但是,PC1需要先发送给网关,就需要先知道网关ip。
网关用于连接不同网络,并且有自己的IP,PC1需要知道网关ip。于是,通过ARP请求,像内网广播网关ip,网关回复mac地址。
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==>将ip广播,目的主机响应,反馈mac地址。

NAT==>在一个网络内部,自定义合法的ip地址。内网各主机通过内网通讯;与外网通过NAT转换,变成外网合法ip。这样,将内网与外网隔离,各个网络有自己的ip,既可以重叠,又可以通过少数几个ip与外网通讯,在ip大量缺乏的现代,节省了很多。

网络数据包转发和接收全过程相关推荐

  1. 网络数据包转发过程详解

    本片文章详解了两台终端跨网段通信时数据包转发的过程,包含第一次转发数据包ARP工作的过程以及详细配置,下面是本次实验的拓扑图,在华为ENSP模拟器上实现. 简单介绍一下实验环境,在本次实验中包含两个区 ...

  2. linux接收网络数据并存存储,linux网络数据包数据结构 Socket Buffer

    Linux网络核心数据结构是套接字缓存(socket buffer),简称skb.它代表一个要发送或处理的报文,并贯穿于整个协议栈.1.套接字缓存skb由两部分组成:(1)报文数据:它保存了实际在网络 ...

  3. 看清接收网络数据包的全过程

    接收网络数据包的过程,从数据包到达网卡的物理接口开始,然后由网卡的驱动程序交给网络协议栈,最后经过协议栈的一层层处理之后交给应用程序.大致上是这样的过程,但实际上有更多的细节.本文中主要介绍第一个和第 ...

  4. 5G网络学习(四)——5G网络中数据包转发模型(未完待续)

    3GPP TS 29.244介绍了控制层面和用户层面节点之间的接口 主要介绍了数据包转发模型及其内部一系列操作. 目录 1.定义缩写 2数据包转发模型 2.1数据包检测规则(PDR) 2.2使用报告的 ...

  5. Linux内核中网络数据包的接收-第一部分 概念和框架

    与网络数据包的发送不同,网络收包是异步的的.由于你不确定谁会在什么时候突然发一个网络包给你.因此这个网络收包逻辑事实上包括两件事: 1.数据包到来后的通知 2.收到通知并从数据包中获取数据这两件事发生 ...

  6. Linux网络 - 数据包的接收过程

    Linux网络 - 数据包的接收过程 嵌入式Linux中文站 嵌入式Linux中文站 微信号 emblinux 功能介绍 嵌入式Linux中文站提供专业嵌入式Linux开发技术资讯 Table of ...

  7. Linux内核中网络数据包的接收框架

    与网络数据包的发送不同,网络收包是异步的的,因为你不确定谁会在什么时候突然发一个网络包给你,因此这个网络收包逻辑其实包含两件事: 1.数据包到来后的通知 2.收到通知并从数据包中获取数据 这两件事发生 ...

  8. 路由个数据包转发简介

    第一章: 网络的核心是路由器, 路由器的作用就是将各个网络彼此连接起来.因此,路由器需要负责不同网络之间的数据包传送.网际通信的效率取决于路由器的性能,即取决于路由器是否能以最有效的方式转发数据包. ...

  9. Linux内核网络数据包发送(四)——Linux netdevice 子系统

    Linux内核网络数据包发送(四)--Linux netdevice 子系统 1. 前言 2. `dev_queue_xmit` and `__dev_queue_xmit` 2.1 `netdev_ ...

  10. Scapy 伪造网络数据包

    实验说明 这里说明的数据包伪造只是伪造数据包发送的源地址.网络上有一些有人说可以对数据包内容的伪造(修改)和转发,不过目前还没找到这一点是如何完成的,甚至是在官方提供的文档上也没有看到这一类操作的说明 ...

最新文章

  1. 19.7 主动模式和被动模式 添加监控主机 添加自定义模板 处理图形
  2. 1114. Family Property (25)
  3. Javascript中的Document对象详解
  4. SAP Spartacus里的localStorage用法
  5. linux系统数据落盘之细节
  6. React中BrowserRouter与HashRouter的区别
  7. “智慧灯杆”的应用和解决方案
  8. C# 从Excel中读取时间数据
  9. 上古卷轴5json文件修改_【白夜谈】我做了一款失败的《社长卷轴》Mod
  10. 常用机器学习算法优缺点及其应用领域
  11. @Value取值为NULL的解决方案
  12. Hive map阶段缓慢,优化过程详细分析
  13. Flask开发系列之初体验
  14. golang gin解决跨域:编写一个全局中间件
  15. MATLAB 生成随机数
  16. 笔记本电脑建立Wifi热点多种方法
  17. 输入年份和月份输出该月有多少天python_题目内容:读入一个年份和月份,输出该月有多少天(考虑闰年),用s? 爱问知识人...
  18. 钉钉和mis系统对接调研
  19. python中oct函数_Python内置函数OCT详解
  20. 动画过渡transition

热门文章

  1. 学习方法论---知其所以然(以算法学习为例)
  2. python学习第三天作业
  3. 一个简单的网络推广小方案
  4. TCP/UDP socket编程学习
  5. Deep Learning Resources
  6. vs code使用GitLens — Git supercharged无法使用的解决办法
  7. 【算法实验二】(DFS-回溯)【踩气球】
  8. GSM的PVT Fail
  9. 下周发布视频-无人船测量码头港池
  10. ​愉快地迁移到Python3