网络模型

  为了解决网络互联中异构设备的兼容性问题,并解耦复杂的网络包处理流程,国际标准化组织制定的开放式系统互联通信参考模型(Open System Interconnection Reference Model),简称为 OSI 网络模型。OSI 模型把网络互联的框架分为应用层、表示层、会话层、传输层、网络层、数据链路层以及物理层等七层,每个层负责不同的功能。其中,

  1. 应用层,负责为应用程序提供统一的接口。
  2. 表示层,负责把数据转换成兼容接收系统的格式。
  3. 会话层,负责维护计算机之间的通信连接。
  4. 传输层,负责为数据加上传输表头,形成数据包。
  5. 网络层,负责数据的路由和转发。
  6. 数据链路层,负责 MAC 寻址、错误侦测和改错。
  7. 物理层,负责在物理网络中传输数据帧。

  但是 OSI 模型还是太复杂了,也没能提供一个可实现的方法。所以,在 Linux 中,我们实际上使用的是另一个更实用的四层模型,即 TCP/IP 网络模型。TCP/IP 模型,把网络互联的框架分为应用层、传输层、网络层、网络接口层等四层,其中,

  1. 应用层,负责向用户提供一组应用程序,比如 HTTP、FTP、DNS 等。
  2. 传输层,负责端到端的通信,比如 TCP、UDP 等。
  3. 网络层,负责网络包的封装、寻址和路由,比如 IP、ICMP 等。
  4. 网络接口层,负责网络包在物理网络中的传输,比如 MAC 寻址、错误侦测以及通过网卡传输网络帧等。

Linux网络收发流程

  

接收流程

  当一个网络帧到达网卡后:

  网卡会通过 DMA 方式,把这个网络包放到收包队列中;然后通过硬中断,告诉中断处理程序已经收到了网络包。

  网卡中断处理程序会为网络帧分配内核数据结构(sk_buff),并将其拷贝到 sk_buff 缓冲区中;然后再通过软中断,通知内核收到了新的网络帧。

  接下来,内核协议栈从缓冲区中取出网络帧,并通过网络协议栈,从下到上逐层处理这个网络帧。比如,

  • 在链路层检查报文的合法性,找出上层协议的类型(比如 IPv4 还是 IPv6),再去掉帧头、帧尾,然后交给网络层。
  • 网络层取出 IP 头,判断网络包下一步的走向,比如是交给上层处理还是转发。当网络层确认这个包是要发送到本机后,就会取出上层协议的类型(比如 TCP 还是 UDP),去掉 IP 头,再交给传输层处理。
  • 传输层取出 TCP 头或者 UDP 头后,根据 < 源 IP、源端口、目的 IP、目的端口 > 四元组作为标识,找出对应的 Socket,并把数据拷贝到 Socket 的接收缓存中。

  最后,应用程序就可以使用 Socket 接口,读取到新接收到的数据了。为了更清晰表示这个流程,我画了一张图,这张图的左半部分表示接收流程,而图中的粉色箭头则表示网络包的处理路径。

发送流程

  当应用程序要发送数据包时:  

  首先,应用程序调用 Socket API(比如 sendmsg)发送网络包。由于这是一个系统调用,所以会陷入到内核态的套接字层中。套接字层会把数据包放到 Socket 发送缓冲区中。

  接下来,网络协议栈从 Socket 发送缓冲区中,取出数据包;再按照 TCP/IP 栈,从上到下逐层处理。比如,

  • 传输层和网络层,分别为其增加 TCP 头和 IP 头,执行路由查找确认下一跳的 IP,并按照 MTU 大小进行分片。
  • 分片后的网络包,再送到网络接口层,进行物理地址寻址,以找到下一跳的 MAC 地址。然后添加帧头和帧尾,放到发包队列中。
  • 这一切完成后,会有软中断通知驱动程序:发包队列中有新的网络帧需要发送。

  最后,驱动程序通过 DMA ,从发包队列中读出网络帧,并通过物理网卡把它发送出去。

最新文章

  1. 通过三个DEMO学会SignalR的三种实现方式
  2. ARM概论(Advanced RISC Machines)
  3. HDU 3966 Aragorn&#39;s Story 树链剖分+树状数组 或 树链剖分+线段树
  4. 高性能JavaScript 循环语句和流程控制
  5. C#回顾 - 2.NET的IO:Path、File、FileInfo、Directory、DirectoryInfo、DriveInfo、FileSystemWatcher
  6. CSS3:transform translate transition 这些都是什么?
  7. TEZ安装试用
  8. BZOJ1816 [Cqoi2010]扑克牌
  9. PC端使用opencv获取webcam,通过socket把Mat图像传输到android手机端
  10. AJax跨域请求百度音乐接口数据展示页面
  11. Qt入门(18)——使用信号和槽连接控件
  12. linux杂记(十二?) 关于账号和密码的二三事
  13. Magnum Kuernetes源码分析(二)
  14. WiMAX协议栈
  15. java基础解析系列(八)---fail-fast机制及CopyOnWriteArrayList的原理
  16. 通过TCP实现显示屏截图请求及回传
  17. 如何在IIS上发布网站 在阿里云服务器windows server2012r iis上部署.net网站
  18. 阿里云ECS服务器无法上传文件的解决方案
  19. SpringJDBC中jdbcTemplate 的使用
  20. onkeydown小练习

热门文章

  1. python doc os 参考
  2. 转:Linux常用命令总结
  3. hdu 5101 Select (二分+单调)
  4. kail入侵xp实例
  5. grpc协议
  6. VSCode Java 开发环境配置 详细教程
  7. mysqld:未被识别的服务(解决方法)
  8. 1. 处理静态资源 2. controller如何接受请求得参数 3. 如何把controller得数据保存到view. 4. 在controller如何完成重定向到指定路径 5. controller返回json数据
  9. 解决IE6,边框问题
  10. win10开机自启