美文网首页linux系统
Linux网络子系统

Linux网络子系统

作者: robot_test_boy | 来源:发表于2021-02-14 22:54 被阅读0次
    网络分层
    OSI模型

    类似于OSI模型,Linux网络协议栈分层:

    网络分层结构和网络操作概述

    网络数据传输期间发生的基本操作

    1) 当一个应用程序发送数据到对等主机的时候,应用程序创建数据。

    2) 应用程序打开socket,并通过socket接口写入数据。

    3) socket缓冲区被用来处理传输的数据。当socket缓冲区向下穿过各层时,内核仅改变socket缓冲区中的引用,以避免不必要的开销。

    4) 每一层执行适当的操作,比如解析报头,添加和修改报头,校验和,路由操作,分片等等。

    5) 网络接口卡向线缆发送数据,当传输时增加一个中断。

    6) 以太网帧到达对等主机的网络接口卡。

    7) 如果MAC地址匹配接口卡的MAC地址,将帧移动到网络接口卡的缓冲区。

    8) 网络接口卡最终将数据包移动到一个socket缓冲区,并发出一个硬件中断给CPU。

    9) CPU处理完数据包,并使其向上穿过各层,到达一个应用程序的TCP端口。

    1.socket buffer收发数据的区域:内核使用缓冲区发送和接收数据。网络缓冲区的配置可以通过/proc/sys/net中的文件进行调整。

    socket缓冲区的内存分配

    2.Network API(NAPI)解决网络硬中断造成的开销:网络子系统经历了一些改变,引入了新网络API(NAPI)。在Linux网络堆栈的标准实现中,可靠性和低延迟要比低开销和高吞吐量更重要

    使用传统的方法处理网络数据包,网络接口卡将数据包移动到操作系统内核的一个网络缓冲区,并向CPU发出一个硬中断。这个方法的缺点之一是每次匹配MAC地址的以太网帧到达接口,都会产生一个硬件中断。CPU每处理一个硬中断,就要停止当前处理中的工作,从而导致上下文切换,并刷新相关的处理器缓存。如果仅有少量数据包到达接口,你可能认为这不是一个问题,但是千兆以太网和现代的应用程序每秒能创建数千个数据包,这将导致发生大量的中断和上下文切换。

    怎么解决这个问题呢?引入了NAPI,计算处理网络流量的相关开销。对于第一个数据包,NAPI以传统实现的方式为第一个数据包发出一个中断,但是在第一个数据包之后,接口进入一种轮询(polling)模式。只要有数据包就放入网络接口的DMA环形缓冲区,这不会引起新的中断,从而有效地减少了上下文切换的次数和相关的开销。最后一个数据包处理完后,环形缓冲区被清空,接口卡将再次退回到中断模式。

    3. Netfilter:先进的防火墙功能,内核的一部分。使用iptables操作和Netfilter配置。

    一般来说,Netfilter 提供以下功能:

    3.1) 数据包过滤(fiIter)。如果一个数据包与一条规则匹配,则Netfilter接受或拒绝该数据包,或基于定义的规则采取适当行动。

    3.2) 地址转换(nat)。如果一个数据包与一条规则匹配,Netfilter将更改数据包,以满足地址转换(ip和目的端口)的需求。

    3.3) 改变数据包(mangIe)。如果一个数据包与一条规则匹配,Netfilter将按照规则对数据包进行改变(ttl、tos、mark)。

    防火墙的工作图

    数据包是如何穿过Netfilter链,以及在序列中每个点应用的规则列表。

    如果数据包与规则匹配,Netfilter将采取相应的行动,这个行动称为目标(target)行动。可能的目标行动有:

    a) ACCEPT接收数据包,并让它通过。

    b) DROP默默地丢弃该数据包。

    c) REJECT通过发送回一个错误数据包来响应匹配的数据包,比如,icmp-net-unreachable、icmp-host-unreachable、icmp-port-unreachable及tcp-reset等。

    d) LOG开启内核日志记录匹配到的数据包。

    e) MASQUERADE、SNAT、DNAT、REDIRECT地址转换。

    4.连接跟踪:为了实现较复杂的防火墙功能,Netfilter使用连接跟踪机制对所有网络流量的状态进行跟踪。使用TCP连接状态和其他网络属性(比如IP地址、端口号、协议、序列号、确认号、ICMP类型等),Netfilter根据下面4种状态对每个数据包进行分类:

    a) NEW该数据包开启一个新的连接。

    b) ESTABLISHED该数据包关联一个已经建立的连接。

    c) RELATED该数据包要开启一个新的连接,但是与一个已经存在的连接相关。比如FTP数据传输和ICMP错误。

    d) INVALID该数据包与已知连接不相关。不能确定是由于一些什么原因,它不对应任何已知的连接,包括格式不正确或无效、数据包是未知状态、耗尽内存及ICMP错误等。

    TCP/IP

    1.建立连接和断开连接:在客户端和服务器之间,经过TCP3次握手后建立连接。连接建立后,应用程序的数据就可以传输了。当所有数据被传输完成,经过TCP4次挥手开始断开连接。

    netstat命令可以看到每个TCP/IP会话的连接状态,TCP连接状态图如下。

    TCP连接状态图

    2.流量控制:TCP/IP实现是一种即使在恶劣的网络传输质量和网络拥塞也能确保有效的数据传输和保证数据投递的机制。

    3.TCP/IP传输窗口:TCP传输窗口是连接的另一边在请求一个确认前一个给定主机能发送和接收的最大数据量。窗口的大小是接收主机提供的,且使用在TCP头部中的窗口大小字段告知发送方。使用传输窗口,主机可以更有效地发送数据包,因为发送主机不需要针对每个发送的数据包等待确认。这使网络利用率更高,延迟确认也提高了效率。

    4. 重传:在连接建立、终止、数据传输中,由于各种原因(网络接口故障、低速路由、网络拥塞、奇怪的网络实现等等)可能引起超时和数据重传。TCP/IP通过排序数据包并试图多次重新发送数据包来处理这种情况。在一个高丢包率的网络上,我们可能希望增加TCP尝试 SYN连接建立数据包的数量

    Offload

    如果系统上的网络适配器支持硬件Offload功能,则内核可以分出一部分任务给网络适配器,这样可以降低CPU使用率。

    Checksum offIoad(校验和offIoad)。通过比较IP/TCP /UDP协议头部中的checksum字段的值和计算数据包中数据的值,确保数据包被正确传输。

    TCP segmentation offIoad(TSO TCP 分段 offIoad)。当大于支持的最大传输单元(MTU)数据发送到网络适配器时,数据应该被分成MTU大小的数据包。

    参考

    读书笔记来自赵永刚老师的《Linux性能优化大师》,如有侵权,请通知删除。

    相关文章

      网友评论

        本文标题:Linux网络子系统

        本文链接:https://www.haomeiwen.com/subject/oajyxltx.html