linux内核协议栈
来源:互联网 发布:软件源码 编辑:程序博客网 时间:2024/05/22 06:26
tcp是全双工的协议,因此每一端都会有流控。一个tcp段有可能是一个数据段,也有可能只是一个ack,异或者即包含数据,也包含ack。如果是数据段,那么有可能是in-sequence的段,也有可能是out-of-order的段。如果是in-sequence的段,则马上加入到socket的receive队列中,如果是out-of-order的段,则会加入到socket的ofo队列。一旦当我们接收到数据,要么立即发送ack到对端,要么延迟等待和后面的数据一起将ack发送出去。
当发送ack之前,我们需要检测一些我们已经从对端得到的信息。也就是说我们需要通过对端的信息来执行ack的生成。详细的去看tcp 协议的相关部分。一般来说就是tcp option和tcp flag的一些东西。
这里就不介绍协议相关的东西了。随便一本tcp协议的书上都将的很详细。
这次我们主要就来看内核协议栈的核心的数据交互是如何进行的。
由于发送段的执行比较简单,因此我们主要来看接收端的处理。
我们知道tcp的处理输入段的函数是tcp_rcv_established。在linux内核中有两种方法来执行输入段,分别是slow 和fast path。在网络设备里面区分不同的路径是一个很自然的选择,因为网络设备的首要任务是转发网络包,不同的网络包,在设备里面的处理路径不同。fast path就是那些可以依据已有状态转发的路径,在这些路径上,网关,二层地址等都已经准备好了,不需要缓存数据包,而是可以直接转发。slow path是那些需要额外信息的包,比如查找路由,解析MAC地址等。
first path是设备收到流上第一个包所走过的路径,比如tcp里面的syn包,有些实现把三次握手都放到first path里面处理,而有些只需处理syn包,其他包就进入fast path的处理路径。
在NP或者ASIC里面也需要区分slow path和fast path,fast path上的包都放在SRAM里面,而slow path的包放在DRAM里面。不过这也非绝对。决定处理路径的是对于速度的考虑。处理器的速度,内存的速度等。访问内存的速度由速度和带宽两个因素决定。因此,把SRAM放到fast path上,也是很自然的选择。
系统的性能要从两方面考虑,硬件的设计和软件的设计,这两个方面的配合或者是分工,决定着系统的性能。在fast path中,我们要做的事情非常少,只是处理输入数据(一般都是放到socket的receive队列),发送ack,存储时间戳等。而在slow path中,我们需要处理out-of-order段,PAWS,urgent数据等等。而在内核中通过实现一个伪的flag来区分是slow 还是fast path,这个伪flag是tcp头中的第12个字节组成的。分别是头长度,flag以及advertised windows。
然后来看这个flag的相关结构以及tcp头的结构
当发送ack之前,我们需要检测一些我们已经从对端得到的信息。也就是说我们需要通过对端的信息来执行ack的生成。详细的去看tcp 协议的相关部分。一般来说就是tcp option和tcp flag的一些东西。
这里就不介绍协议相关的东西了。随便一本tcp协议的书上都将的很详细。
这次我们主要就来看内核协议栈的核心的数据交互是如何进行的。
由于发送段的执行比较简单,因此我们主要来看接收端的处理。
我们知道tcp的处理输入段的函数是tcp_rcv_established。在linux内核中有两种方法来执行输入段,分别是slow 和fast path。在网络设备里面区分不同的路径是一个很自然的选择,因为网络设备的首要任务是转发网络包,不同的网络包,在设备里面的处理路径不同。fast path就是那些可以依据已有状态转发的路径,在这些路径上,网关,二层地址等都已经准备好了,不需要缓存数据包,而是可以直接转发。slow path是那些需要额外信息的包,比如查找路由,解析MAC地址等。
first path是设备收到流上第一个包所走过的路径,比如tcp里面的syn包,有些实现把三次握手都放到first path里面处理,而有些只需处理syn包,其他包就进入fast path的处理路径。
在NP或者ASIC里面也需要区分slow path和fast path,fast path上的包都放在SRAM里面,而slow path的包放在DRAM里面。不过这也非绝对。决定处理路径的是对于速度的考虑。处理器的速度,内存的速度等。访问内存的速度由速度和带宽两个因素决定。因此,把SRAM放到fast path上,也是很自然的选择。
系统的性能要从两方面考虑,硬件的设计和软件的设计,这两个方面的配合或者是分工,决定着系统的性能。在fast path中,我们要做的事情非常少,只是处理输入数据(一般都是放到socket的receive队列),发送ack,存储时间戳等。而在slow path中,我们需要处理out-of-order段,PAWS,urgent数据等等。而在内核中通过实现一个伪的flag来区分是slow 还是fast path,这个伪flag是tcp头中的第12个字节组成的。分别是头长度,flag以及advertised windows。
然后来看这个flag的相关结构以及tcp头的结构
0 0
- linux 内核协议栈
- linux内核协议栈
- Linux内核网络协议栈
- linux 内核网络协议栈
- Linux内核协议栈简介
- linux内核网络协议栈
- Linux内核网络协议栈代码分析
- Linux内核网络协议栈笔记
- Linux内核网络协议栈笔记
- 改造Linux 内核协议栈代码
- tcp/ip协议栈 -- linux内核
- Linux内核网络协议栈代码分析
- Linux内核网络协议栈代码分析
- Linux内核-协议栈-初始化流程分析
- Linux内核网络协议栈代码分析
- Linux内核协议栈(1) 前言
- linux网络协议栈内核分析
- linux网络协议栈内核分析
- jquery 实现 点击按钮后倒计时效果
- 一款Android拼图游戏
- 尚硅谷·网上书城项目(二)
- 开发笔记:从ioctl到linux v4l2驱动的调用
- 膨胀与腐蚀
- linux内核协议栈
- url参数中有+、空格、=、%、&、#等特殊符号的问题解决
- Java四种线程池的使用
- 1009. Product of Polynomials (25)
- MySQL脚本insert中文失败
- 第76课:Spark SQL基于网站Log的综合案例实战之Hive数据导入、Spark SQL对数据操作每天晚上20:00YY频道现场授课频道68917580
- opencv-matlab-multi view geo-双目-相机参数-转置与不转置与转置与不转置-指南
- YTU 3006: 迷宫问题(栈与队列)
- LinearLayout代码实现分行