Linux网络管理

2021/01/06 Linux

Linux网络管理

Linux 具有强大的网络功能,完美地支持 TCP/IP 协议。Linux 提供了很多完善的网络管理工具,可以帮助用户轻松完成各种复杂的网络配置,实现任何所需要的网络服务。

网络基础知识介绍

IP 地址

在网络中,IP地址是主机的唯一标识。例如A主机向B主机发送数据包,A主机必须要知道B主机的地址。IP地址通常用“.”隔开的4个十进制数表示,称为点分十进制表示,如IP地址0x81124c15(16进制)通常写成129.18.76.21。

IP 地址由两部分组成:网络(network)地址和主机(host)地址。网络地址由IP地址的高位组成,主机地址由低位组成,这两部分的大小取决于网络的类型。

IP地址根据网络地址的不同,主要分为A类、B类、C类、D类、E类。

  • A类IP地址。 一个A类IP地址由1字节网络地址和3字节主机地址组成,网络地址的最高位必须是“0”,地址范围从1.0.0.0到126.0.0.0。可用的A类网络有126个,每个网络能容纳1亿多个主机。
  • B类IP地址。 一个B类IP地址由2个字节的网络地址和2个字节的主机地址组成,网络地址的最高位必须是“10”,地址范围从128.0.0.0到191.255.255.255。可用的B类网络有16382个,每个网络能容纳6万多个主机。
  • C类IP地址。 一个C类IP地址由3字节的网络地址和1字节的主机地址组成,网络地址的最高位必须是“110”。范围从192.0.0.0到223.255.255.255。C类网络可达209万余个,每个网络能容纳254个主机。
  • D类地址用于组播。 D类IP地址第一个字节以“1110”开始,它是一个专门保留的地址。它并不指向特定的网络,目前这一类地址被用在组播中。组播地址用来一次寻址一组计算机,它标识共享同一协议的一组计算机。
  • E类IP地址。 以“1110”开始,为将来使用保留。

子网掩码

子网掩码(subnet mask)又叫网络掩码,一般构成是网络地址部分全是“1”,主机地址全是“0”。例如C类IP地址192.168.1.134,用三个字节标识网络地址,一个字节标识主机地址,所以其子网掩码为255.255.255.0(默认子网掩码)。

子网掩码的一个主要作用就是判别主机发送的数据包是要向外网发送,还是向内网发送。例如主机A向主机B发送数据包,主机A先将自己的子网络掩码和目标主机的IP地址做与操作。由于子网掩码的网络地址部分全是“1”,主机地址全是“0”,这样与操作结果就是网络地址。

例如,IP地址为192.168.0.115,主机的子网掩码是255.255.255.0,拿IP地址和子网掩码做与操作的结果是192.168.0.0,此即IP地址所在的网络地址。

A主机得到网络地址后,就拿得到网络地址和B所在网络地址做对比,如果网络地址相同,就说明B主机和A主机在同一个网络,数据包向内网发送;如果不相同,则向外网发送,即发送到网关。

网关

网关(Gateway)又称网间连接器、协议转换器。网关主要用在传输层上以实现网络连接,是最复杂的网络互联设备,仅用于两个高层协议不同的网络互联。网关既可以用于广域网互联,也可以用于局域网互联。网关是一种充当转换重任的计算机系统或设备。在使用不同的通信协议、数据格式或语言,甚至体系结构完全不同的两种系统之间,网关是一个翻译器。

下面我们举个例子来说明一下网关。例如在同一个教室里面的同学,他们之间可以相互交流,但是如果想和其他同学也(当面)聊天,就必须出教室的门。这个“门”就是我们所谓的网关。同样在网络中传输数据,如果想向外网传输数据,就必须经过网关。

那么网关到底是什么呢?网关实质上是一个网络通向其他网络的IP地址。比如有网络A和网络B,网络A的IP地址范围为“192.168.1.1~192. 168.1.254”,子网掩码为255.255.255.0;网络B的IP地址范围为“192.168.2.1~192.168.2.254”,子网掩码为255.255.255.0。在没有路由器的情况下,两个网络之间是不能进行TCP/IP通信的,即使两个网络连接在同一台交换机(或集线器)上,TCP/IP协议也会根据子网掩码(255.255.255.0)判定两个网络中的主机处在不同的网络里。而要实现这两个网络之间的通信,则必须通过网关。如果网络A中的主机发现数据包的目的主机不在本地网络中,就把数据包转发给它自己的网关,再由网关转发给网络B的网关,网络B的网关再转发给网络B的某个主机。

所以说,只有设置好网关的 IP地址,TCP/IP协议才能实现不同网络之间的相互通信。那么这个IP地址是哪台机器的IP地址呢?网关的IP地址是具有路由功能的设备的IP地址,具有路由功能的设备有路由器、启用了路由协议的服务器(实质上相当于一台路由器)、代理服务器(也相当于一台路由器)。

DNS服务器

DNS服务器是计算机域名系统(Domain Name System或Domain Name Service)的缩写,它是由解析器和域名服务器组成的。域名服务器是指保存有该网络中所有主机的域名和对应 IP 地址,并且可将域名转换为IP地址功能的服务器。其中域名必须对应一个IP地址,而IP地址不一定有域名。域名系统采用类似目录树的等级结构。域名服务器为客户机/服务器模式中的服务器方,它主要有两种形式:主服务器和转发服务器。将域名映射为IP地址的过程称为“域名解析”。

例如我们经常输入“www.baidu.com”,这里的“www.baidu.com”就是域名。如果想自己的电脑能成功地进入百度主页,那就必须设置好DNS服务器。主机在和百度服务器进行连接之前,必须通过域名服务器的解析,得到百度服务器实际的IP地址。

Linux 系统网络配置

如果想一台电脑能接入Internet,必须配置好IP地址、子网掩码、网关、DNS服务器。在Linux 系统中,这些信息都可以通过修改对应的配置文件来进行配置。

ifconfig 命令

ifconfig是GNU/Linux中配置网卡的基本命令,包含在net-tools软件包中。它可用于显示或设置网卡的配置,如IP地址、子网掩码、最大分组传输数、IO端口等,还可以启动或禁用网卡。

ifconfig命令有以下两种格式:

ifconfig [interface]

ifconfig interface [aftype] option | address …

第一种格式主要用于查看当前系统的网络配置情况;第二种格式则可用于配置网卡,包括添加、删除网卡,以及绑定多个IP地址等。 例如在Shell终端上输入ifconfig。

root@ubuntu:~$ ifconfig
eth0 Link encap:以太网 硬件地址 00:0c:29:42:f5:e8
inet 地址:192.168.0.100 广播:192.168.0.255 掩码:255.255.255.0
inet6 地址: fe80::20c:29ff:fe42:f5e8/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 跃点数:1
接收数据包:216354 错误:0 丢弃:0 过载:0 帧数:0
发送数据包:23306 错误:0 丢弃:0 过载:0 载波:0
碰撞:0 发送队列长度:1000
接收字节:19100956 (19.1 MB) 发送字节:7114800 (7.1 MB)
中断:19 基本地址:0x2000

lo  Link encap:本地环回
inet 地址:127.0.0.1 掩码:255.0.0.0
inet6 地址: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 跃点数:1
接收

从上面的运行结果可以看出,主机有两个接口 eth0、lo。

  • lo 代表主机本身,也称回送接口(Loopback),其 IP 地址约定为 127.0.0.1。
  • eth0 代表主机的第一个以太网卡,网卡的物理地址(HWaddr)为 00:0c:29:42:f5:e8,也称为MAC地址;IP地址(inet addr)为192.168.0.100;广播地址(Bcast)为192.168.0.255;子网掩码(Mask)为255.255.255.0。

下面我们就通过ifconfig命令来修改一些网络配置参数。

  • 网卡配置一个临时的IP地址
    格式: sudo ifconfig eth0 ip
    

    这里的ip表示你想配置的IP地址。

例如,要配置网卡的IP地址为192.168.0.101,可以在Shell终端上输入:

sudo ifconfig eth0 192.168.0.101

这里的“sudo”表示临时获得超级用户权限。ifconfig命令在进行修改网络参数的时候必须要有超级用户权限。

  • 配置网卡的物理地址
    格式:ifconfig eth0 hw ether xx:xx:xx:xx:xx:xx
    

    例如,配置网卡的物理地址为00:11:22:33:44:55,可以在Shell终端上输入:

    sudo ifconfig eth0 hw ether 00:11:22:33:44:55
    

    在这里需要注意的是,当网卡没有被禁用的时候,是不能修改网卡的物理地址的,在修改之前必须先将网卡设备禁用。

  • 在Linux 下将一个网卡设备禁用和开启可以在终端上输入如下命令:
    sudo ifconfig eth0 down
    sudo ifconfig eth0 up
    

    第一条命令的功能是将网卡禁用,第二条命令的功能是将网卡启用。

ifconfig 命令的功能很强大,还可以设置网卡的MTU、混杂模式等。 需要注意的是用 ifconfig 命令配置的网卡信息,在网卡或机器重启后,将不复存在。要想将上述的配置信息永远存到电脑里,那就要修改网卡的配置文件了。

dhclient命令

在大型网络中,通常存在许多的移动计算机系统,它们随时都可能进出网络,如果为它们每个都分配一固定 IP 地址,容易造成资源浪费。而且这些系统每次更换网络时,又不得不重新配置网络信息。如果计算机在网络里能够自动获取IP地址、子网掩码、路由表、DNS服务器地址等网络信息,具有动态配置IP的能力,就可以大大简化客户端的网络配置难度。动态主机配置协议(Dynamic Host Configuration Protocol,DHCPD)就是为此而生的,它可以实现动态分配IP资源。

只要在局域网中架设有DHCP 服务器,在Ubuntu Linux 中为主机配置DHCP 客户端是非常容易的。需要说明的是,通常普通以态网卡和无线网卡可以配置动态IP,而调制解调器等网络设备不能配置动态IP。

在Linux下我们可以通过“dhclient”命令,来动态配置网络。

root@ubuntu:~$ sudo dhclient
[sudo] password for cyg:
There is already a pid file /var/run/dhclient.pid with pid 1459
killed old client process, removed PID file
Internet Systems Consortium DHCP Client V3.1.3
Copyright 2004-2009 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/
Listening on LPF/eth0/00:0c:29:42:f5:e8
Sending on LPF/eth0/00:0c:29:42:f5:e8
Sending on Socket/fallback
DHCPREQUEST of 192.168.1.11 on eth0 to 255.255.255.255 port 67
DHCPNAK from 192.168.16.1
DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 3
DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 5
DHCPOFFER of 192.168.16.186 from 192.168.16.1
DHCPREQUEST of 192.168.16.186 on eth0 to 255.255.255.255 port 67
DHCPACK of 192.168.16.186 from 192.168.16.1
Rather than invoking init scripts through /etc/init.d, use the service(8)
utility, e.g. service smbd reload
Since the script you are attempting to invoke has been converted to an
Upstart job, you may also use the reload(8) utility, e.g. reload smbd
bound to 192.168.16.186 -- renewal in 1783 seconds.

执行过程中包括以下5个阶段。

  • 客户端寻找DHCP服务器(DHCPDISCOVER):客户端广播申请动态IP的请求。
  • 服务器提供可分配的IP地址(DHCPOFFER):所有接收到请求的DHCP服务器都将向客户端提供一个IP地址。
  • 客户端接受 IP 地址租借(DHCPREQUEST):客户端从多个 IP 选择中挑选一个,通知DHCP服务器,并标识出所选中的服务器。
  • 服务器确认租借 IP(DHCPACK):被选中的 DHCP 服务器最后发出一个确认信息,包含IP地址、子网掩码、默认网关、DNS服务器和租借期(客户端使用这个IP的这段时间,称为租借期)。
  • 最终客户端临时“租借”的IP地址为192.168.16.186。

修改配置文件来配置IP地址、网关、子网掩码

要使配置永久有效,必须通过修改配置文件。无论是配置静态IP还是动态IP,Ubuntu系统都将配置信息存放在“/etc/network/interfaces”。在 Ubuntu 系统启动时就能获得 IP 地址的配置信息。若是配置静态 IP,就从配置文件中读取 IP 地址参数,直接配置网络接口设备;如果配置动态IP,就通知主机通过DHCP协议获取网络配置。

以下分别为动态配置IP和静态配置IP时,修改“/etc/network/interfaces”的实例。

配置的时候请注意两点,第一点是在打开/etc/network/interfaces文件时,必须以超级用户权限打开,不然在修改完后是无法保存的;第二点是静态配置的时候,IP地址、子网掩码和网关应该参考主机所在的实际网络环境。 动态配置。

root@ubuntu:~$ vi /etc/network/interfaces
#The loopback network interface
auto lo
iface lo inet loopback
#The primary network interface
auto eth0
iface eth0 inet dhcp

静态配置。

root@ubuntu:~$ vi /etc/network/interfaces
#The loopback network interface
auto lo
iface lo inet loopback
#The primary network interface
auto eth0
iface eth0 inet static
address 192.168.1.100
netmask 255.255.255.0
gateway 192.168.1.1

刚修改完配置文件后,配置的参数并没有立即生效。需要手动在终端上输入“sudo /etc/init.d/networking restart”命令来生效配置。

Linux@ubuntu:~$ sudo /etc/init.d/networking restart
[sudo] password for Linux:
* Running /etc/init.d/networking restart is deprecated because it may notenable again some interfaces
*   Reconfiguring   network   interfaces...WARNING: ifup -a is disabled in favour of NetworkManager.
Set ifupdown:managed=false in /etc/NetworkManager/NetworkManager.conf.
[ OK ]

虽然配置好这些信息,但只能说明我们的主机已经成功加入局域网,即和局域网内的其他主机可以直接通信了。要想进行像浏览网页这样的操作还是不行的,因为我们通常在浏览器上是输入域名而不是实际的IP地址来登录网站,而域名需要 DNS服务器来解析。只有正确配置好DNS服务器才可以正常地上网浏览网页。

配置DNS服务器

DNS域名解析可以在更大范围的计算机网络,提供域名到 IP地址的转换。网络中的每台计算机都是一个 DNS 客户端,向DNS 服务器提交域名解析的请求;DNS 服务器完成域名到IP 地址的映射。因此DNS客户端至少有一个DNS服务器地址,作为命名解析的开端。

如果想了解哪个候选DNS服务器提供了服务,可以使用nslookup命令,查看当前系统所使用的DNS服务的IP地址。

root@ubuntu:~$ nslookup www.baidu.com
Server: 192.168.91.2
Address:192.168.91.2#53
Non-authoritative answer:
www.baidu.com canonical name = www.a.shifen.com.
Name: www.a.shifen.com
Address: 115.239.210.27
Name: www.a.shifen.com
Address: 115.239.210.26

从执行结果可以看出,主机在访问前两个DNS服务器(172.16.28.1和202.204.58.2)失败后,由第三个服务器(192.168. 91.2)完成域名解析。Server 表示提供服务的 DNS 服务器,Address中的#53表示TCP/UDP命名服务的端口号。

若所有的DNS服务器都访问失败,则出现如下的执行结果。

root@ubuntu:~$ sudo nslookup www.google.com
;; connection timed out; no servers could be reached

Linux 将 DNS 服务器地址保存在配置文件/etc/resolv.conf 中。在改配置文件时,应该按照如下格式添加DNS服务器地址:

nameserver dns服务器地址

依然延续上面的例子,添加DNS服务器IP地址后,查看配置文件/etc/resolv.conf,如下所示。

cyg@ubuntu:~$ cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 172.16.28.1
nameserver 202.204.58.2
nameserver 192.168.91.2
search localdomain

在局域网中,一般DNS服务器的地址直接写成路由器的IP地址就可以了。

Linux 系统常用网络服务配置

Linux 系统支持很多网络服务,例如通过NFS实现远程挂载,通过TFTP实现文件传输,通过SSH实现远程登录,通过SAMBA实现文件共享功能。但是这些服务默认情况下Linux系统都没有开启,需要我们手动配置。配置好这些服务,能大大提高实际的Linux开发过程效率。

TFTP 服务

SSH服务

Samba服务


在性能分析中网络子系统是另一个重要的子系统。除了Linux,网络操作还与很多组件相互影响,比如交换机、路由器、网关、PC客户端,等等。虽然这些组件可能在Linux控制之外,但它们对整体性能有很多影响。请记住,在网络系统中,你要与网络工作人员紧密合作。

这里重点了解Linux如何处理网络操作。

1.5.1 网络化的实现 TCP/IP协议有一个类似于OSI分层模型的分层结构。Linux网络化的实现采用类似的方法。图1-23显示了分层的Linux TCP/IP协议栈,并给出了TCP/IP通信的大致图示。

图1-23 网络分层结构和网络操作概述

如同许多UNIX系统那样,Linux进行TCP/IP网络操作使用socket接口。socket为用户应用程序提供一个接口。下面我们看看在网络数据传输期间发生的基本操作:

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

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

③socket缓冲区被用来处理传输的数据。socket缓冲区引用数据,并向下穿过各层。

④在每一层中,执行适当的操作,比如,解析报头,添加和修改报头,校验和,路由操作,分片,等等。当socket缓冲区向下穿过各层时,在各层之间的数据自身是不能够复制的。因为在不同层之间复制实际数据是无效的,内核仅通过改变在socket缓冲区中的引用来避免不必要的开销并传递到下一层。

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

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

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

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

⑨CPU之后处理数据包,并使其向上穿过各层,直到它到达一个应用程序的TCP端口,比如Apache。

1.socket buffer 正如之前指出的,内核使用缓冲区发送和接收数据。图1-24显示了可用于网络缓冲区的配置,它们可以通过/proc/sys/net中的文件进行调整。

图1-24 socket缓冲区的内存分配

/proc/sys/net/core/rmem_max /proc/sys/net/core/rmem_default /proc/sys/net/core/wmem_max /proc/sys/net/core/wmem_default /proc/sys/net/ipv4/tcp_mem /proc/sys/net/ipv4/tcp_rmem /proc/sys/net/ipv4/tcp_wmem 有时它可能对网络性能产生影响。我们将在5.7.4节中讨论细节。

2.Network API (NAPI) 网络子系统经历了一些改变,引入了新网络API(NAPI)。在Linux网络堆栈的标准实现中,可靠性和低延迟要比低开销和高吞吐量更重要。当创建一个防火墙时这些特征是有利的,大多数企业级应用程序,比如文件打印或者数据库,要比安装在Windows下执行得慢。

使用传统的方法处理网络数据包,网络接口卡最终将数据包移动到操作系统内核的一个网络缓冲区,并向CPU发出一个硬中断。

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

正因为如此,引入了NAPI,来计算处理网络流量的相关开销。对于第一个数据包,NAPI的工作就像传统的实现一样,为第一个数据包发出一个中断。但是在第一个数据包之后,接口进入一种轮询(polling)模式。只要有数据包就放入网络接口的DMA环形缓冲区,这不会引起新的中断,从而有效地减少了上下文切换的次数和相关的开销。最后一个数据包处理完后,环形缓冲区被清空,接口卡将再次退回到中断模式。NAPI也具有提高多处理器扩展性的优点,它可创建软中断并由多个处理器来处理。对于大多数企业级多处理器系统,NAPI是一个巨大的改进,它需要NAPI-enabled驱动程序。

3.Netfilter Linux有先进的防火墙功能,其是作为内核的一部分存在的。这种能力是由Netfilter模块提供的。可以使用iptables工具操作和配置Netfilter。

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

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

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

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

可以通过以下属性来定义匹配过滤器:

□ 网络接口

□ IP地址、IP地址范围、子网

□ 协议

□ ICMP类型

□ 端口

□ TCP标志

□ 状态(参考下文“连接跟踪”)

图1-25给出了数据包是如何穿过Netfilter链的图示,以及在序列中每个点应用的规则列表。

图1-25 防火墙的工作图

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

□ ACCEPT。 接受数据包,并让它通过。

□ DROP。 默默地丢弃该数据包。

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

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

□ MASQUERADE、SNAT、DNAT、REDIRECT。 地址转换。

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

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

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

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

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

此外,通过分析协议具体属性和操作,Netfilter可以使用单独的模块执行更详细的连接跟踪。例如,连接跟踪模块ftp、tftp、snmp,等等。

1.5.2 TCP/IP TCP/IP作为默认的网络协议已经使用很多年了。Linux TCP/IP的实现相当符合其标准。为了得到更好的性能,你应该熟悉基本的TCP/IP网络。

更多详情,参考TCP/IP教程和技术概述。

1.建立连接 在应用程序被传输之前,在客户端和服务器之间的连接已经建立。连接建立的过程被称为TCP/IP 3次握手。图1-26列出了基本的连接建立和终止过程。

图1-26 TCP三次握手

①客户端向它的对等服务器发送一个SYN数据包(有一个SYN标记位的数据包)请求连接。

②服务器接收到数据包,发送回一个SYN+ACK数据包。

③然后客户端向它对等的主机发送一个ACK数据包,建立连接。

连接一旦建立,应用程序的数据可以通过连接传输。当所有数据被传输完成,开始连接关闭过程。

①客户端向服务器发送一个FIN数据包,开始连接终止过程。

②服务器发送ACK回应客户端的FIN,之后如果服务器也不再有数据发送到客户端,那么服务器也向客户端发送FIN数据包。

③客户端向服务器发送一个ACK数据包,终止连接。

图1-27显示了在会话期间连接状态的改变。

图1-27 TCP连接状态图

使用netstat命令可以看到每个TCP/IP会话的连接状态。有关更多详情,可参考2.3.8节的内容。

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

3.TCP/IP传输窗口 在有关Linux操作系统性能影响因素中,TCP/IP的传输窗口大小有着重要的影响。如图1-28所示,TCP传输窗口是连接的另一边,在请求一个确认之前,一个给定主机能发送和接收的最大数据量。窗口的大小是接收主机提供的,且使用在TCP头部中的窗口大小字段告知发送方。使用传输窗口,主机可以更有效地发送数据包,因为发送主机不需要针对每个发送的数据包等待确认。这使网络利用率更高。延迟确认也提高了效率。TCP窗口开始很小,并且从连接的另一端每一个成功的确认开始慢慢增加。如何优化窗口大小,参考5.7.4节的内容。

图1-28 滑动窗口和延迟ACK

作为一个选择,高速网络可以使用一个被称为窗口缩放(window scaling)的技术,这样甚至可以更大地增加最大传输窗口大小。后续章节将会更详细地分析这些实现的影响。

4.重传 在连接建立、终止、数据传输中,由于各种原因(网络接口故障、低速路由、网络拥塞、奇怪的网络实现,等等)可以引起超时和数据重传。TCP/IP通过排序数据包并试图多次重新发送数据包来处理这种情况。

可以通过配置参数来改变内核的一些行为。在一个高丢包率的网络上,我们可能希望增加TCP尝试SYN连接建立数据包的数量。也可以通过/proc/sys/net下的一些文件改变超时阀值。更多信息,参考5.7.10节的内容。

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

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

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

1.5.4 Bonding模块 有时我们需要比单块网卡所能提供的带宽更多的带宽。升级到更快的网络设备并不总是一个最好的选择。Linux双网卡绑定的实现就是使用两块网卡作为一块网卡使用,这个绑定起来的设备看起来就是一个单独的以太网接口设备,通俗一点讲就是两块网卡具有相同的IP地址,它们被并行链接聚合成一个逻辑链路工作。其实这项技术在Sun和Cisco中早已存在,被称为Trunking和Etherchannel技术。在Linux的2.4.x的内核中也采用这种技术,被称为Bonding。Bonding技术最早应用在集群中,是为了提高集群节点间的数据传输而设计的(参见5.7.1节的内容)。

Search

    微信好友

    博士的沙漏

    Table of Contents