﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-一江春水向东流-文章分类-应用技巧</title><link>http://www.blogjava.net/huyi2006/category/36110.html</link><description>                            做一个有思想的人,期待与每一位热爱思考的人交流,您的关注是对我最大的支持。</description><language>zh-cn</language><lastBuildDate>Tue, 12 Jun 2012 22:54:06 GMT</lastBuildDate><pubDate>Tue, 12 Jun 2012 22:54:06 GMT</pubDate><ttl>60</ttl><item><title>TCP长连接VS短连接 </title><link>http://www.blogjava.net/huyi2006/articles/380611.html</link><dc:creator>allic</dc:creator><author>allic</author><pubDate>Tue, 12 Jun 2012 07:38:00 GMT</pubDate><guid>http://www.blogjava.net/huyi2006/articles/380611.html</guid><wfw:comment>http://www.blogjava.net/huyi2006/comments/380611.html</wfw:comment><comments>http://www.blogjava.net/huyi2006/articles/380611.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huyi2006/comments/commentRss/380611.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huyi2006/services/trackbacks/380611.html</trackback:ping><description><![CDATA[1. TCP连接

当网络通信时采用TCP协议时，在真正的读写操作之前，server与client之间必须建立一个连接，当读写操作完成后，双方不再需要这个连接时它们可以释放这个连接，连接的建立是需要三次握手的，而释放则需要4次握手，所以说每个连接的建立都是需要资源消耗和时间消耗的

经典的三次握手示意图：



经典的四次握手关闭图：



2. TCP短连接

我们模拟一下TCP短连接的情况，client向server发起连接请求，server接到请求，然后双方建立连接。client向server发送消息，server回应client，然后一次读写就完成了，这时候双方任何一个都可以发起close操作，不过一般都是client先发起close操作。为什么呢，一般的server不会回复完client后立即关闭连接的，当然不排除有特殊的情况。从上面的描述看，短连接一般只会在client/server间传递一次读写操作

短连接的优点是：管理起来比较简单，存在的连接都是有用的连接，不需要额外的控制手段

3.TCP长连接

接下来我们再模拟一下长连接的情况，client向server发起连接，server接受client连接，双方建立连接。Client与server完成一次读写之后，它们之间的连接并不会主动关闭，后续的读写操作会继续使用这个连接。

首先说一下TCP/IP详解上讲到的TCP保活功能，保活功能主要为服务器应用提供，服务器应用希望知道客户主机是否崩溃，从而可以代表客户使用资源。如果客户已经消失，使得服务器上保留一个半开放的连接，而服务器又在等待来自客户端的数据，则服务器将应远等待客户端的数据，保活功能就是试图在服务器端检测到这种半开放的连接。

如果一个给定的连接在两小时内没有任何的动作，则服务器就向客户发一个探测报文段，客户主机必须处于以下4个状态之一：

客户主机依然正常运行，并从服务器可达。客户的TCP响应正常，而服务器也知道对方是正常的，服务器在两小时后将保活定时器复位。 
客户主机已经崩溃，并且关闭或者正在重新启动。在任何一种情况下，客户的TCP都没有响应。服务端将不能收到对探测的响应，并在75秒后超时。服务器总共发送10个这样的探测 ，每个间隔75秒。如果服务器没有收到一个响应，它就认为客户主机已经关闭并终止连接。 
客户主机崩溃并已经重新启动。服务器将收到一个对其保活探测的响应，这个响应是一个复位，使得服务器终止这个连接。 
客户机正常运行，但是服务器不可达，这种情况与2类似，TCP能发现的就是没有收到探查的响应。 
从上面可以看出，TCP保活功能主要为探测长连接的存活状况，不过这里存在一个问题，存活功能的探测周期太长，还有就是它只是探测TCP连接的存活，属于比较斯文的做法，遇到恶意的连接时，保活功能就不够使了。

在长连接的应用场景下，client端一般不会主动关闭它们之间的连接，Client与server之间的连接如果一直不关闭的话，会存在一个问题，随着客户端连接越来越多，server早晚有扛不住的时候，这时候server端需要采取一些策略，如关闭一些长时间没有读写事件发生的连接，这样可以避免一些恶意连接导致server端服务受损；如果条件再允许就可以以客户端机器为颗粒度，限制每个客户端的最大长连接数，这样可以完全避免某个蛋疼的客户端连累后端服务。

长连接和短连接的产生在于client和server采取的关闭策略，具体的应用场景采用具体的策略，没有十全十美的选择，只有合适的选择。

<img src ="http://www.blogjava.net/huyi2006/aggbug/380611.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huyi2006/" target="_blank">allic</a> 2012-06-12 15:38 <a href="http://www.blogjava.net/huyi2006/articles/380611.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>wget 使用技巧集锦</title><link>http://www.blogjava.net/huyi2006/articles/241634.html</link><dc:creator>allic</dc:creator><author>allic</author><pubDate>Thu, 20 Nov 2008 06:12:00 GMT</pubDate><guid>http://www.blogjava.net/huyi2006/articles/241634.html</guid><wfw:comment>http://www.blogjava.net/huyi2006/comments/241634.html</wfw:comment><comments>http://www.blogjava.net/huyi2006/articles/241634.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huyi2006/comments/commentRss/241634.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huyi2006/services/trackbacks/241634.html</trackback:ping><description><![CDATA[
		<p>下载整个网站一般命令（例如）：<br />wget -r -p -np -k http://www.google.com<br /><br />　　$ wget --help<br /><br />　　GNU Wget 1.9.1，非交互式的网络文件下载工具。<br />　　用法： wget [选项]... [URL]...<br /><br />　　长选项必须用的参数在使用短选项时也是必须的。<br /><br />启动：<br /><br />　　-V, --version 显示 Wget 的版本并且退出。<br />　　-h, --help 打印此帮助。<br />　　-b, -background 启动后进入后台操作。<br />　　-e, -execute=COMMAND 运行‘.wgetrc’形式的命令。<br /><br />日志记录及输入文件：<br /><br />　　-o, --output-file=文件 将日志消息写入到指定文件中。<br />　　-a, --append-output=文件 将日志消息追加到指定文件的末端。<br />　　-d, --debug 打印调试输出。<br />　　-q, --quiet 安静模式(不输出信息)。<br />　　-v, --verbose 详细输出模式(默认)。<br />　　-nv, --non-verbose 关闭详细输出模式，但不进入安静模式。<br />　　-i, --input-file=文件 下载从指定文件中找到的 URL。<br />　　-F, --force-html 以 HTML 方式处理输入文件。<br />　　-B, --base=URL 使用 -F -i 文件选项时，在相对链接前添加指定的 URL。<br /><br />下载：<br /><br />　　-t, --tries=次数 配置重试次数（0 表示无限）。<br />　　--retry-connrefused 即使拒绝连接也重试。<br />　　-O --output-document=文件 将数据写入此文件中。<br />　　-nc, --no-clobber 不更改已经存在的文件，也不使用在文件名后<br />　　添加 .#（# 为数字）的方法写入新的文件。<br />　　-c, --continue 继续接收已下载了一部分的文件。<br />　　--progress=方式 选择下载进度的表示方式。<br />　　-N, --timestamping 除非远程文件较新，否则不再取回。<br />　　-S, --server-response 显示服务器回应消息。<br />　　--spider 不下载任何数据。<br />　　-T, --timeout=秒数 配置读取数据的超时时间 (秒数)。<br />　　-w, --wait=秒数 接收不同文件之间等待的秒数。<br />　　--waitretry=秒数 在每次重试之间稍等一段时间 (由 1 秒至指定的 秒数不等)。<br />　　--random-wait 接收不同文件之间稍等一段时间(由 0 秒至 2*WAIT 秒不等)。<br />　　-Y, --proxy=on/off 打开或关闭代理服务器。<br />　　-Q, --quota=大小 配置接收数据的限额大小。<br />　　--bind-address=地址 使用本机的指定地址 (主机名称或 IP) 进行连接。<br />　　--limit-rate=速率 限制下载的速率。<br />　　--dns-cache=off 禁止查找存于高速缓存中的 DNS。<br />　　--restrict-file-names=OS 限制文件名中的字符为指定的 OS (操作系统) 所允许的字符。<br /><br />目录：<br /><br />　　-nd --no-directories 不创建目录。<br />　　-x, --force-directories 强制创建目录。<br />　　-nH, --no-host-directories 不创建含有远程主机名称的目录。<br />　　-P, --directory-prefix=名称 保存文件前先创建指定名称的目录。<br />　　--cut-dirs=数目 忽略远程目录中指定数目的目录层。<br /><br />HTTP 选项：<br /><br />　　--http-user=用户 配置 http 用户名。<br />　　--http-passwd=密码 配置 http 用户密码。<br />　　-C, --cache=on/off (不)使用服务器中的高速缓存中的数据 (默认是使用的)。<br />　　-E, --html-extension 将所有 MIME 类型为 text/html 的文件都加上 .html 扩展文件名。<br />　　--ignore-length 忽略“Content-Length”文件头字段。<br />　　--header=字符串 在文件头中添加指定字符串。<br />　　--proxy-user=用户 配置代理服务器用户名。<br />　　--proxy-passwd=密码 配置代理服务器用户密码。<br />　　--referer=URL 在 HTTP 请求中包含“Referer：URL”头。<br />　　-s, --save-headers 将 HTTP 头存入文件。<br />　　-U, --user-agent=AGENT 标志为 AGENT 而不是 Wget/VERSION。<br />　　--no-http-keep-alive 禁用 HTTP keep-alive（持久性连接）。<br />　　--cookies=off 禁用 cookie。<br />　　--load-cookies=文件 会话开始前由指定文件载入 cookie。<br />　　--save-cookies=文件 会话结束后将 cookie 保存至指定文件。<br />　　--post-data=字符串 使用 POST 方法，发送指定字符串。<br />　　--post-file=文件 使用 POST 方法，发送指定文件中的内容。<br /><br />HTTPS (SSL) 选项：<br /><br />　　--sslcertfile=文件 可选的客户段端证书。<br />　　--sslcertkey=密钥文件 对此证书可选的“密钥文件”。<br />　　--egd-file=文件 EGD socket 文件名。<br />　　--sslcadir=目录 CA 散列表所在的目录。<br />　　--sslcafile=文件 包含 CA 的文件。<br />　　--sslcerttype=0/1 Client-Cert 类型 0=PEM (默认) / 1=ASN1 (DER)<br />　　--sslcheckcert=0/1 根据提供的 CA 检查服务器的证书<br />　　--sslprotocol=0-3 选择 SSL 协议；0=自动选择，<br />　　1=SSLv2 2=SSLv3 3=TLSv1<br /><br />FTP 选项：<br /><br />　　-nr, --dont-remove-listing 不删除“.listing”文件。<br />　　-g, --glob=on/off 设置是否展开有通配符的文件名。<br />　　--passive-ftp 使用“被动”传输模式。<br />　　--retr-symlinks 在递归模式中，下载链接所指示的文件(连至目录则例外）。<br /><br />递归下载：<br /><br />　　-r, --recursive 递归下载。<br />　　-l, --level=数字 最大递归深度(inf 或 0 表示无限)。<br />　　--delete-after 删除下载后的文件。<br />　　-k, --convert-links 将绝对链接转换为相对链接。<br />　　-K, --backup-converted 转换文件 X 前先将其备份为 X.orig。<br />　　-m, --mirror 等效于 -r -N -l inf -nr 的选项。<br />　　-p, --page-requisites 下载所有显示完整网页所需的文件，例如图像。<br />　　--strict-comments 打开对 HTML 备注的严格(SGML)处理选项。<br /><br />递归下载时有关接受/拒绝的选项：<br /><br />　　-A, --accept=列表 接受的文件样式列表，以逗号分隔。<br />　　-R, --reject=列表 排除的文件样式列表，以逗号分隔。<br />　　-D, --domains=列表 接受的域列表，以逗号分隔。<br />　　--exclude-domains=列表 排除的域列表，以逗号分隔。<br />　　--follow-ftp 跟随 HTML 文件中的 FTP 链接。<br />　　--follow-tags=列表 要跟随的 HTML 标记，以逗号分隔。<br />　　-G, --ignore-tags=列表 要忽略的 HTML 标记，以逗号分隔。<br />　　-H, --span-hosts 递归时可进入其它主机。<br />　　-L, --relative 只跟随相对链接。<br />　　-I, --include-directories=列表 要下载的目录列表。<br />　　-X, --exclude-directories=列表 要排除的目录列表。<br />　　-np, --no-parent 不搜索上层目录。 </p>
<img src ="http://www.blogjava.net/huyi2006/aggbug/241634.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huyi2006/" target="_blank">allic</a> 2008-11-20 14:12 <a href="http://www.blogjava.net/huyi2006/articles/241634.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>