Zhang_Jiawen
4 Beryllium

Re: 网络基本功系列:细说网络那些事儿(10月13日更新)

汗,我怎么会犯这个错误啊。。。谢谢,好细心~

0 项奖励
Highlighted
Zhang_Jiawen
4 Beryllium

Re: 网络基本功系列:细说网络那些事儿(10月13日更新)

网络基本功(十一):TCP窗口调整与流控

转载请在文首保留原文出处:EMC中文支持论坛https://community.emc.com/go/chinese image001.gif

介绍

前文已经介绍过了TCP滑动窗口大小的重要性。在客户端与服务器的连接中,客户端告知服务器它一次希望从服务器接收多少字节数据,这是客户端的接收窗口,即服务器的发送窗口。类似地,服务器告知客户端一次希望从客户端接收多少字节数据,也就是服务器的接收窗口和客户端的发送窗口。

要理解为什么窗口大小会产生波动,首先需要理解它的含义。最简单的方式是它代表了设备对于特定连接的接收缓存大小。即,窗口大小代表一个设备一次能够从对端处理多少数据,之后再传递给应用层处理。


更多信息

当服务器从客户端接收数据,它就将数据放在缓存中,服务器必须对数据做以下两步操作:

确认:服务器必须将确认信息发回客户端以表明数据接收。

传输:服务器必须处理数据,将它传递给目标应用程序处理。


区分开这两件事情是非常重要的。关键在于基本的滑动窗口机制中,数据于接收时确认,但并不一定立即从缓存中传输出去。也就意味着当接收数据速度快于接收TCP处理速度时,缓存有可能被填满。当这一情况发生时,接收设备需要调整窗口大小已防止缓存过载。


由于窗口大小能够以这种方式管理连接两端设备数据流的速率,TCP就是以这种方式实现流控这一传输层非常典型的任务。流控对于TCP来说是很重要的,因为它是设备间互通状态的方式。通过增加或缩小窗口大小,服务器和客户端能够确保对端发送数据的速度等同于处理速度。

减小窗口大小以降低发送速率:

首先看一下客户端到服务器的数据传输,如下图所示。

image002.jpg

客户端传输140字节数据至服务器。之后,客户端的可用窗口还剩下220字节:发送窗口的360字节减去发送的140字节。


一段时间过后,服务器接收到140字节并将它们放在缓存中。现在,理想的情况下,140字节进入缓存,确认之后立刻从缓存移出。也就是说,缓存有足够的大小来容纳客户端发送的所有数据。缓存的空闲空间维持在360字节,因此告知客户端窗口大小保持不变。


只要服务器处理速度和数据进入速度相同,窗口大小就会保持在360字节。客户端在接收到140字节的确认信息以及窗口大小保持不变的信息之后,将360字节窗口向右移动140字节。由于现在未确认字节数为0,因此客户端又可以发送360字节数据。对应于之前可用窗口的220字节,加上刚刚确认的140字节数据。


然而,现实中服务器可能需要处理数十,数百乃至数千个TCP连接。TCP可能无法立刻处理数据,或应用应用程序本身无法接收140字节数据。任何一种情况下,服务器TCP都无法立刻将140字节从缓存中移出。这时,除了发回确认信息给客户端以外,服务器会想要告知客户端更改窗口大小,以表示缓存已经被部分写入了。


假设我们接收到140字节,但只能发送40字节给应用程序,缓存中剩下100字节。当发送140字节的确认信息,服务器将发送窗口缩小100字节,至260字节。当客户端从服务器接收到这一片段,它将会看到140字节的确认信息并将窗口向右滑动140字节。在滑动过程中,将大小缩减至260字节。可以认为将窗口左端滑动140字节,但右端仅滑动40字节。新的稍小一些的窗口保证服务器从客户端接收最多260字节数据,以适应接收缓存中的剩余空间,如下图的1-3步所示。

image003.jpg

缩减发送窗口以停止发送新数据:

如果服务器无法接收任何新数据会怎么样呢?假设客户端下一次传输180字节,但是服务器太忙碌而无法对其进行处理。这种情况下,服务器将这180字节缓存下来,并且在确认信息中,将窗口大小从260字节缩减为80字节。当客户端接收到180字节的确认信息,它也会看到窗口缩减了180字节,它会滑动与缩减同样的大小,告知服务器:我确认接收180字节数据,但不允许你再发送新的数据。也可以看作窗口左端滑动180字节,但右端维持不动。只要右端不移动,客户端就无法发送更多数据。这一过程显示在上图的4-6中。

关闭发送窗口:

窗口调整可以通过双方设备来完成。如果服务器从客户端接收的数据持续快于推送给应用的速率,则服务器将会继续减小接收窗口。假设发送窗口减小至80字节,客户端发送第三个请求,长度为80字节,但服务器仍处于繁忙状态。之后服务器将窗口减小为0,也称为关闭窗口。这一信息告知客户端服务器已经过载,它需要彻底停止发送数据,如上图最后一步所示。之后,当服务器负载减轻时,可以再次增加这一连接的窗口,允许更多数据传输。

             

xidianlz
1 Nickel

Re: 网络基本功系列:细说网络那些事儿(10月13日更新)

你貌似把最新一章只回复给我一个人了

0 项奖励
Zhang_Jiawen
4 Beryllium

Re: 网络基本功系列:细说网络那些事儿(10月16日更新)

网络基本功(十二):细说Linux网络配置(上)

转载请在文首保留原文出处:EMC中文支持论坛https://community.emc.com/go/chinese image001.gif

介绍

将一台设备添加到本地网络的基本步骤包括:

  • 指定唯一的IP地址与主机名。
  • 确保启动时正确配置网络接口。
  • 创建默认路由。
  • 指定DNS域名服务器以使设备能够连接到网络其他部分。


更多信息

指定主机名与IP地址:

使用/etc/hosts文件是将设备名映射到IP地址的最简单的方式,每一行以IP地址开始,跟随识别到的各种符号名:

image002.jpg

由于/etc/hosts仅包括本地映射而且必须维护在每一台客户端设备,所以最好保存那些需要在启动时映射的信息(即:主机本身,默认网关,以及域名服务器)。

可使用hostname命令为设备指定主机名。该命令通常在启动脚本中运行,脚本中包含从配置文件读取的主机名。

ifconfig:配置网络接口:

ifconfig打开或关闭网络接口,设置IP地址与子网掩码,以及其他选项和参数。通常在启动时通过命令行从配置文件中读取参数来运行,但也可以手动运行以做修改。

ifconfig命令格式如下:

ifconfig interface [family] address options…

例如:

ifconfig eth0 192.168.1.13 netmask 255.255.255.0 up

eth0设置IPv4地址与子网掩码,并将该接口准备好供使用。大多数系统中 ifconfig –a列出系统的网络接口以及当前设置。

family参数告诉ifconfig配置的是哪一种网络协议。用户可以对一个接口设置多个协议并同时使用,但必须分开配置。IPv4选项为inetIPv6选项为inet6缺省为inet

address参数指定接口的IP地址。也可以使用主机名,但该主机名必须能在启动时解析为IP地址。对于设备的主接口来说,这意味着主机名必须出现在本地hosts文件中,因为其他解析方式依赖于已被初始化的网络。

关键字up将接口打开,down将其关闭

netmask选项为接口设置子网掩码。

broadcast选项为接口指定IP广播地址。

route:配置静态路由:

route命令指定静态路由,指明该路由表项永远不会更改,即使运行路由进程。当在本地网络中添加新的设备时,通常仅需要指定默认路由。

这里有两种情况:一,当报文目的地址是直连网络上的某台主机时,路由表中的 “next-hop gateway”是本地主机自己的一个接口,报文直接发送到目的地,这时可在配置接口时用ifconfig命令将路由添加到路由表中。 二,可能没有与目的地址相匹配的路由,这时,启用默认路由,否则,返回ICMP“network unreachable” “host unreachable” 信息给发送方。很多本地网络只有一个出口,所以只需配置指向出口的默认路由。

每一条route命令添加或删除一条路由。如下route命令原型几乎适用于每一Linux版本:

# route add -net 192.168.45.128/25 zulu-gw.atrust.net

该命令通过网关路由器zulu-gw.atrust.net添加一条到192.168.45.128/25网络的路由。通常,网关路由器是相邻主机或本地主机的一个接口(Linux要求在网关地址前加上gw选项名)。route命令必须能够将zulu-gw.atrust.net解析成IP地址。

Ubuntu网络配置:

如下图所示,Ubuntu/etc/hostname以及/etc/network/interfaces,以及/etc/network/options中配置网络信息。

image003.jpg

主机名在 /etc/hostname中设置。很多场景都要用到这一文件中配置的名字,某些情况下对命名是有限制要求的。

IP地址,网络掩码,默认网关在 /etc/network/interfaces中设置。以iface关键字开头的一行介绍了各个接口。iface之后的缩进行指明附加参数。例如:

image004.jpg

ifupifdown命令会读取该文件并通过调用下层命令(诸如ifconfig)并配以合适的参数将接口连通或断开。auto语句指定启动时默认或ifup –a运行时的连通接口。

iface行中的inet关键字是ifconfig中使用的地址。关键字static表示一种“方式”,指eth0IP地址和网络掩码是直接指定的。地址和网络掩码行要求静态配置,gateway行指明默认网关,用于安装默认路由。

SUSE网络配置:

SUSE用户可以选择NetworkManager或是传统的配置方法,用户可以在YaST中做出选择。也可以使用YaST GUI来配置传统系统。这里,我们介绍传统方式。除了配置网络接口以外,YaST也提供 /etc/hosts文件,静态路由,DNS配置的直接UI。下图显示了底层的配置文件。

image005.jpg

除了DNS参数以及系统主机名之外,SUSE将大多数网络选项配置在 /etc/sysconfig/network目录下的ifcfg-interface文件。每一个接口呈现一个文件。

除了指定接口的IP地址,网关,以及广播信息,ifcfg-*文件可以配置很多其他网络选项。ifcfg.template文件对很多参数有清楚的注释。以下图为例:

image006.jpg

SUSE系统中全局静态路由信息(包括默认路由)存储在routes文件中。文件中的各行就好象route命令省略了选项名,内容包含目标地址,网关,掩码,接口以及可选参数存储在路由表中,供路由进程查询。对于上述仅有默认路由的主机来说,路由文件包含以下内容:

default 192.168.1.254 - -

针对不同接口的路由保存在ifroute-interface文件中,接口部件的命名方法与ifcfg-*文件一致。其内容格式与routes文件相同。

Red Hat网络配置:

Red Hat网络配置GUI名为system-config-network,也可以通过Network名下面的System->Administration菜单下访问。该工具为配置网络接口与静态路由提供了一个简单的UI,也提供建立IPsec通道,配置DNS,添加/etc/hosts的面板。

下表列出了GUI编辑的底层文件。可在/etc/sysconfig/network中设置机器的主机名,也包括DNS域名以及默认网关。

image007.jpg

例如,以下是某个以太网接口的network文件:

image008.jpg

接口相关的数据存储在 /etc/sysconfig/network-scripts/ifcfg-ifnameifname是网络接口的名字,该文件为每个接口设置IP地址,掩码,网络,以及广播地址。也包含指明接口是否要在启动时开启。

常规机器有配置以太网接口以及回环接口的文件,例如

image009.jpg

以及

image010.jpg

基于DHCPecho文件更加简单:

image011.jpg

/etc/sysconfig文件中更改配置信息之后,对相应端口运行 ifdown ifname ifup ifname。如果一次配置多个端口,使用命令service network restart重置整个网络。这其实是运行/etc/rc.d/init.d/network的一个快速的方法,每次启动时被调用,加上start参数。

也可以通过启动脚本来配置静态路由,添加到/etc/sysconfig/static-routes 文件的路由信息在启动时被存入路由表。这些表项为route add命令指定参数:

image012.jpg

首先列出的是接口,但它实际上是在route命令行的最后执行,将路由与指定接口相关联。(也可以在GUI中看到该架构,路由作为部分设置内容配给各个接口)。命令剩下的内容包含route参数。上文静态路由的例子会产生如下命令:

image013.jpg

             

0 项奖励
kinolucky163
1 Nickel

Re: 网络基本功系列:细说网络那些事儿(9月22日更新)

Hi, 想问一下针对“网络基本功(十一):TCP窗口调整与流控”最后一段,“发送窗口”关闭后,当服务端消费了缓存的数据后,会发送一个什么样的报文,通知客户端调整“发送窗口”大小,从而重新开启“发送窗口”。

0 项奖励
Zhang_Jiawen
4 Beryllium

Re: 网络基本功系列:细说网络那些事儿(9月22日更新)

这种情况下,当客户端再发送传输数据请求时,服务器端返回增加窗口大小的acknowledgment。

0 项奖励
kinolucky163
1 Nickel

Re: 网络基本功系列:细说网络那些事儿(10月29日更新)

谢谢解答!但还是有点不理解,客户端的“发送窗口”已经为0,关闭了,怎么还会发送传输数据请求? 请求里有什么?

还有一个问题想问一下,最开始的时候,双方是如何协商确定最初“发送窗口”的大小的?

0 项奖励
Zhang_Jiawen
4 Beryllium

Re: 网络基本功系列:细说网络那些事儿(10月29日更新)

即使服务器端接收窗口关闭了,客户端还是会定期发送探测信息(含有0或1字节数据)至服务器端,以促使服务器端发回当前的窗口大小值,一直保持发送直到服务器接收窗口reopen为止。

TCP的发送窗口大小由接收方来决定,连接建立初始的接收窗口启动门限值应当是一个固定值,比如10或12个报文段单位。

0 项奖励
kinolucky163
1 Nickel

Re: 网络基本功系列:细说网络那些事儿(10月29日更新)

谢谢!明白了!

0 项奖励
Zhang_Jiawen
4 Beryllium

Re: 网络基本功系列:细说网络那些事儿(10月29日更新)

不客气。如有问题欢迎继续来讨论。

0 项奖励