《软考网络工程师知识点利用TCPIP优化数据传输计算机网络与通信_计算机-网络与通信.pdf》由会员分享,可在线阅读,更多相关《软考网络工程师知识点利用TCPIP优化数据传输计算机网络与通信_计算机-网络与通信.pdf(3页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、软考网络工程师知识点:利用 TCP/IP优化数据传输 网络工程师的利用 TCP/IP 优化数据传输,减少网络流量当然是非常重要的优化举措之一,不过这种手段也仅仅是实现高性能网络数据传输领域的一个方面。其他 TCP 选项也可能显着提供传输性能同时在某些条件下减少服务器的响应时间延迟。下面就让我们来了解一些此类选项。TCP_DEFER_ACCEPT 我们首先考虑的第 1 个选项是 TCP_DEFER_ACCEPT(这是 Linux 系统上的叫法,其他一些操作系统上也有同样的选项但使用不同的名字)。为了理解 TCP_DEFER_ACCEPT 选项的具体思想,我们有必要大致阐述一下典型的 HTTP 客
2、户/服务器交互过程。请回想下 TCP 是如何与传输数据的目标建立连接的。在网络上,在分离的单元之间传输的信息称为 IP 包(或 IP 数据报)。一个包总有一个携带服务信息的包头,包头用于内部协议的处理,并且它也可以携带数据负载。服务信息的典型例子就是一套所谓的标志,它把包标记代表TCP/IP 协议栈内的特殊含义,例如收到包的成功确认等等。通常,在经过“标记”的包里携带负载是完全可能的,但有时,内部逻辑迫使 TCP/IP 协议栈发出只有包头的 IP 包。这些包经常会引发讨厌的网络延迟而且还增加了系统的负载,结果导致网络性能在整体上降低。现在服务器创建了一个套接字同时等待连接。TCP/IP 式的连
3、接过程就是所谓“3 次握手”。首先,客户程序发送一个设置 SYN 标志而且不带数据负载的 TCP 包(一个 SYN 包)。服务器则以发出带 SYN/ACK 标志的数据包(一个 SYN/ACK 包)作为刚才收到包的确认响应。客户随后发送一个 ACK 包确认收到了第 2 个包从而结束连接过程。在收到客户发来的这个 ACK 包之后,服务器会唤醒一个接收进程等待数据到达。当 3次握手完成后,客户程序即开始把“有用的”的数据发送给服务器。通常,一个 HTTP 请求的量是很小的而且完全可以装到一个包里。但是,在以上的情况下,至少有 4 个包将用来进行双向传输,这样就增加了可观的延迟时间。此外,你还得注意到
4、,在“有用的”数据被发送之前,接收方已经开始在等待信息了。为了减轻这些问题所带来的影响,Linux(以及其他的一些操作系统)在其 TCP 实现中包括了TCP_DEFER_ACCEPT 选项。它们设置在侦听套接字的服务器方,该选项命令内核不等待最后的 ACK 包而且在第 1 个真正有数据的包到达才初始化侦听进程。在发送 SYN/ACK 包之后,服务器就会等待客户程序发送含数据的 IP 包。现在,只需要在网络上传送 3 个包了,而且还显着降低了连接建立的延迟,对 HTTP 通信而言尤其如此。这一选项在好些操作系统上都有相应的对等物。例如,在 FreeBSD 上,同样的行为可以用以下代码实现:/*为
5、明晰起见,此处略去无关代码*/structaccept_filter_argaf=“dataready”,“”;setsockopt(s,SOL_SOCKET,SO_ACCEPTFILTER,&af,sizeof(af);这个特征在 FreeBSD 上叫做“接受过滤器”,而且具有多种用法。不过,在几乎所有的情况下其效果与TCP_DEFER_ACCEPT 是一样的:服务器不等待最后的 ACK 包而仅仅等待携带数据负载的包。要了解该选项及其对高性能 Web 服务器的重要意义的更多信息请参考 Apache 文档上的有关内容。就 HTTP 客户/服务器交互而言,有可能需要改变客户程序的行为。客户程序为
6、什么要发送这种“无用的”ACK 包呢?这是因为,TCP 协议栈无法知道 ACK 包的状态。如果采用 FTP 而非 HTTP,那么客户程序直到接收了 FTP 服务器提示的数据包之后才发送数据。在这种情况下,延迟的 ACK 将导致客户/服务器交互出现延迟。为了确定 ACK 是否必要,客户程序必须知道应用程序协议及其当前状态。这样,修改客户行为就成为必要了。对 Linux 客户程序来说,我们还可以采用另一个选项,它也被叫做 TCP_DEFER_ACCEPT。我们知道,套接字分成两种类型,侦听套接字和连接套接字,所以它们也各自具有相应的 TCP 选项集合。因此,经常同时采用的这两类选项却具有同样的名字
7、也是完全可能的。在连接套接字上设置该选项以后,客户在收到一个 SYN/ACK 包之后就不再发送 ACK 包,而是等待用户程序的下一个发送数据请求;因此,服务器发送的包也就相应减少了。TCP_QUICKACK 阻止因发送无用包而引发延迟的另一个方法是使用 TCP_QUICKACK选项。这一选项与CP_DEFER_ACCEPT 不同,它不但能用作管理连接建立过程而且在正常数据传输过程期间也可以使用。另外,它能在客户/服务器连接的任何一方设置。如果知道数据不久即将发送,那么推迟 ACK 包的发送就会派上用场,而且最好在那个携带数据的数据包上设置 ACK 标志以便把网络负载减到最小。当发送方肯定数据将
8、被立即发送(多个包)时,TCP_QUICKACK选项可以设置为 0。对处于“连接”状态下的套接字该选项的缺省值是 1,首次使用以后内核将把该选项立即复位为 1(这是个一次性的选项)。在某些情形下,发出 ACK 包则非常有用。ACK 包将确认数据块的接收,而且,当下一块被处理时不至于引入延迟。这种数据传输模式对交互过程是相当典型的,因为此类情况下用户的输入时刻无法预测。在 Linux 系统上这就是缺省的套接字行为。在上述情况下,客户程序在向服务器发送 HTTP 请求,而预先就知道请求包很短所以在连接建立之后就应该立即发送,这可谓 HTTP 的典型工作方式。既然没有必要发送一个纯粹的 ACK 包,
9、所以设置 TCP_QUICKACK 为 0 以提高性能是完全可能的。在服务器方,这两种选项都只能在侦听套接字上设置一次。所有的套接字,也就是被接受呼叫间接创建的套接字则会继承原有套接字的所有选项。通过 TCP_CORK、TCP_DEFER_ACCEPT 和 TCP_QUICKACK 选项的组合,参与每一 HTTP 交互的数据包数量将被降低到最小的可接受水平(根据 TCP 协议的要求和安全方面的考虑)。结果不仅是获得更快的数据传输和请求处理速度而且还使客户/服务器双向延迟实现了最小化。小结 网络程序的性能优化显然是一项复杂的任务。优化技术包括:尽可能使用零拷贝、用 TCP_CORK 及其等价选项
10、组装适当的数据包、把传输数据包的数量最小化以及延迟优化等。为了提升网络、系统的性能和措之一不过这种手段也仅仅是实现高性能网络数据传输领域的一个方面其他选项也可能显着提供传输性能同时在某些条件下减少服务器的响应时间延迟下面就让我们来了解一些此类选项我们首先考虑的第个选项是这是系统上的叫法客户服务器交互过程请回想下是如何与传输数据的目标建立接的在网络上在分离的单元之间传输的信息称为包或数据报一个包总有一个携带服务信息的包头包头用于内部协议的处理并且它也可以携带数据负载服务信息的典型例子就载是完全可能的但有时内部逻辑迫使协议栈发出只有包头的包这些包经常会引发讨厌的网络延迟而且还增加了系统的负载结果导
11、致网络性能在整体上降低现在服务器创建了一个套接字同时等待接式的接过程就是所谓次握手首先客户可伸缩性,有必要在程序代码中联合一致地采用以上各种可用方法。当然,清楚了解 TCP/IP 协议栈和操作系统的内部工作原理也是必要的。措之一不过这种手段也仅仅是实现高性能网络数据传输领域的一个方面其他选项也可能显着提供传输性能同时在某些条件下减少服务器的响应时间延迟下面就让我们来了解一些此类选项我们首先考虑的第个选项是这是系统上的叫法客户服务器交互过程请回想下是如何与传输数据的目标建立接的在网络上在分离的单元之间传输的信息称为包或数据报一个包总有一个携带服务信息的包头包头用于内部协议的处理并且它也可以携带数据负载服务信息的典型例子就载是完全可能的但有时内部逻辑迫使协议栈发出只有包头的包这些包经常会引发讨厌的网络延迟而且还增加了系统的负载结果导致网络性能在整体上降低现在服务器创建了一个套接字同时等待接式的接过程就是所谓次握手首先客户