Akawa

ETY001的博客

  1. 建立连接协议(三次握手)

    (1)客户端发送一个带SYN标志的TCP报文到服务器。这是三次握手过程中的报文1。
    (2) 服务器端回应客户端的,这是三次握手中的第2个报文,这个报文同时带ACK标志和SYN标志。因此它表示对刚才客户端SYN报文的回应;同时又标志SYN给客户端,询问客户端是否准备好进行数据通讯。
    (3) 客户必须再次回应服务段一个ACK报文,这是报文段3。

  2. 连接终止协议(四次挥手)

由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。

(1) TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送(报文段4)。
(2) 服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1(报文段5)。和SYN一样,一个FIN将占用一个序号。
(3) 服务器关闭客户端的连接,发送一个FIN给客户端(报文段6)。
(4) 客户段发回ACK报文确认,并将确认序号设置为收到序号加1(报文段7)。

CLOSED: 这个没什么好说的了,表示初始状态。

LISTEN: 这个也是非常容易理解的一个状态,表示服务器端的某个SOCKET处于监听状态,可以接受连接了。

SYN_RCVD: 这个状态表示接受到了SYN报文,在正常情况下,这个状态是服务器端的SOCKET在建立TCP连接时的三次握手会话过程中的一个中间状态,很短暂,基本上用netstat你是很难看到这种状态的,除非你特意写了一个客户端测试程序,故意将三次TCP握手过程中最后一个ACK报文不予发送。因此这种状态时,当收到客户端的ACK报文后,它会进入到ESTABLISHED状态。

SYN_SENT: 这个状态与SYN_RCVD遥想呼应,当客户端SOCKET执行CONNECT连接时,它首先发送SYN报文,因此也随即它会进入到了SYN_SENT状态,并等待服务端的发送三次握手中的第2个报文。SYN_SENT状态表示客户端已发送SYN报文。

ESTABLISHED:这个容易理解了,表示连接已经建立了。

FIN_WAIT_1: 这个状态要好好解释一下,其实FIN_WAIT_1和FIN_WAIT_2状态的真正含义都是表示等待对方的FIN报文。而这两种状态的区别是:FIN_WAIT_1状态实际上是当SOCKET在ESTABLISHED状态时,它想主动关闭连接,向对方发送了FIN报文,此时该SOCKET即进入到FIN_WAIT_1状态。而当对方回应ACK报文后,则进入到FIN_WAIT_2状态,当然在实际的正常情况下,无论对方何种情况下,都应该马上回应ACK报文,所以FIN_WAIT_1状态一般是比较难见到的,而FIN_WAIT_2状态还有时常常可以用netstat看到。

FIN_WAIT_2:上面已经详细解释了这种状态,实际上FIN_WAIT_2状态下的SOCKET,表示半连接,也即有一方要求close连接,但另外还告诉对方,我暂时还有点数据需要传送给你,稍后再关闭连接。

阅读全文 »

最近刚刚搭建起属于自己的博客,心情无比激动,可是一直博客不被各个搜索引擎所索引,甚是头疼。想想在网易、百度这样的网站下面建立个自己的博客,虽然限制很多,但是也是有好处的,好处就是你发表的博文会很快被人搜索到,我想这也跟他们的网站热度有关吧,尽管用户获得的是2级或者3级域名。

于是乎,开始转入SEO的学习。我对这个活现在的理解是,这就是一个细致活,非常考验思考细节的能力和你的耐心。就现在接触的这点内容,我稍作了总结,总结如下:

1. 加强关键字工作,最初级的工作就是如何利用meta标签来开始宣传。以WordPress为例,安装All in one SEO插件就可以很好的解决这个问题。在该插件的设置中,可以对<title>、keyword、description等进行设置,这样就非常的方便了。
2. 加强网站内网页之间的必要联系。这个主要是通过把在文章中的本站标签做成超链接,连接到以该标签分类的页面上的功能,以及边栏或低栏中的最热文章、最新评论等功能,还有文章最后的相关链接来增加网站访问者在该网站的逗留时间,也提高了网站的访问深度。如果你是用的WordPress,你可以尝试安装Keyword Link Plugin插件。
3. 合理的安排布局一些广告或者友情链接,通过他人来提升网站。
4. 最后一条,也是最重要的一条,心无SEO胜似有SEO。什么意思呢?这就是说,作为站长,你的精力应该更多的放在如何增强用户访问你网站的体验上,以及你的网站有多少内容对于大多数人来说有价值,而不是每天总想着应该采取什么措施来提高网站人气。有料才是提升网站人气的关键,SEO只是辅助工作,他只是让用户更容易从你这里找到自己需要的东西。

以上就是我想和大家分享的一点点SEO心得,还请路过的高人能指点一二。

转自:http://blog.chinaunix.net/u1/39544/showart_308078.html

可能玩Linux的朋友都知道fstab这个文件,如果要用好linux,熟悉linux的一些核心配置文件是必要的,而fstab则是其中之一。这个文件描述系统中各种文件系统的信息,应用程序读取这个文件,然后根据其内容进行自动挂载的工作。因此,我们需要理解其中的内容,了解它如何与mount命令配合工作,并能够针对自己的情况进行修改。

作为系统配置文件,fstab通常都位于/etc目录下,它包括了所有分区和存储设备的信息,以及它们应该挂载到哪里,以什么样子的方式挂载。如果遇到一些类似于无法挂载你的windows分区阿,无法使用你的光驱阿,无法对某个分区进行写入操作阿什么的,那么基本上可以断定,你的fstab内容有问题了。也就是说,你可以通过修改它来搞定这些问题,而不用去论坛冰天雪地裸体跪求答案了。

说了半天,/etc/fstab其实就是一个文本文件,用gedit或者vi都可以打开,当然,前提是root权限。在这个文件中,每个文件系统(包括分区或者设备)用一行来描述,在每一行中,用空格或TAB符号来分隔各个字段,文件中以*开头的行是注释信息。Fstab文件中的纪录的排序十分重要。因为 fsck,mount或umount等程序在做它们的工作时会按此顺序进行本。下面进行详细的讲解,本文假设读者已经有挂载文件系统和分区的基础知识。

Table of Contents

1. 第一、二列:设备和默认挂载点
2. 第三列:文件系统类型
3. 第四列:挂载选项
4. 第五、六列:dump和fsck选项

在讲解之前要说一下,每个人所使用的系统情况都是不同的,包括硬件种类,所用系统等,因此fstab文件肯定是有所差异的。但是其基本结构,如上所述,都不会变。所以我们先以一个fstab内容作为模板进行讲解。

首先请看下面这个例子:

/dev/hda2	/	ext2	defaults	1 1
/dev/hdb1	/home	ext2	defaults	1 2
/dev/cdrom	/media/cdrom	auto	ro,noauto,user,exec	0 0
/dev/fd0	/media/floppy	auto	rw,noauto,user,sync	0 0
proc	/proc	proc	defaults	0 0
/dev/hda1	swap	swap	pri=42	0 0

这些看起来毫无意义的字符代表了什么?在对应相应分区或者存储设备信息的每一行中,每一列又是什么意思?先大体讲一下,第一列表示设备的名称,第二列表示该设备的挂载点,第三列是文件系统,第四列是挂载选项,第五列是dump选项(用一个数字表示),第六列(接下来的数字)表示文件系统检查选项。好了,接下来,就要详细介绍这些参数的具体含义了。

阅读全文 »

很多时候可能是IE与FireFox对于同一个元素的初定义不同造成的成兼容性问题。

解决方案:把元素的margin和padding都设为0。

到目前为止,我所发现出现这种问题的元素有:ul、标题元素(h1、h2等)。

今天终于研究出来了编码问题的解决方案了。

网上多数地方只说了要在UTF-8的文件头加上

1
<%@LANGUAGE="VBSCRIPT"   CODEPAGE="65001%>

在GB2312的文件头加上

1
<%@LANGUAGE="VBSCRIPT"   CODEPAGE="936"%>

以上两种针对ASP页面,其实还有一点都忽略了,就是文件内容本身。

也就是说,如果你一开始是按照UTF-8 来进行的文件编写,那么如果想换成GB2312的话,
只是加上<%@LANGUAGE="VBSCRIPT"   CODEPAGE="936"%> 是不够的,还需要彻底的把已经编过的文档转换编码才行。
如果你仔细观察的话,在DW的源码区中,UTF-8状态下编写的注释符是英文半角状态的单撇,而在GB2312状态下编写的注释符
是一个类似中文状态的逗号,并且还有一点,在UTF-8状态中,你会发现源代码中的汉字与英文状态的半角标点的相对位置看上去
很别扭,不像是平时书写的样子,比如说逗号都在文字的中间线上,而在GB2312状态下就能正常显示。

另外,转换的方法就是用记事本打开待转化的文件,选择另存为,在最下面选择编码,ANSI是GB2312,UTF-8就不用说了。

如何准确判断conn1里面有没有名为name1的表? 
 
—————————————————————  

1
2
3
4
5
6
7
8
变通办法  
on  error  resume  next  
rs.open  "name1",conn1  
 
if  not  err.number=0  then  
 Err.Clear      '清除该错误  
‘这里添加表不存在的处理  
end  if

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
<%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%>
<!--Asp读取access数据库生成XML文件(gb2312 总穆修正版) 程序修改自网络 仅帮助新手入门 Zongmu-->
<%
dim conn,connstr,rs,sql
    connstr="provider=Microsoft.Jet.OLEDB.4.0;data source="&Server.MapPath("zongmu_db/zongmu_km.mdb")&";"
set conn=Server.CreateObject("ADODB.Connection")
set rs=Server.CreateObject("ADODB.RecordSet")
    conn.open connstr
%>

<!-- more -->
<%
if request("action")="zongmu_shengcheng" then

set conn=Server.CreateObject("ADODB.Connection")
set rs=Server.CreateObject("ADODB.RecordSet")
    conn.open connstr
sql="select * from content order by id desc"
    rs.open sql,conn,1,1
xmlfile=Server.MapPath("test.xml")
Set fso = CreateObject("Scripting.FileSystemObject")
Set MyFile = fso.CreateTextFile(xmlfile,True)

MyFile.WriteLine("<?xml version=""1.0"" encoding=""gb2312""?>")
MyFile.WriteLine("<config>")

do while not rs.eof
MyFile.WriteLine"<item>"
MyFile.WriteLine"<Id>"&rs("title")&"</Id>"
MyFile.WriteLine"<name>"&rs("name")&"</name>"
MyFile.WriteLine"<client>"&rs("client")&"</client>"
MyFile.WriteLine"<url>"&rs("url")&"</url>"
MyFile.WriteLine"<markUp1 href=""#"">"&rs("markUp1")&"</markUp1>"
MyFile.WriteLine"<markUp2 href=""#"">"&rs("markUp2")&"</markUp2>"
MyFile.WriteLine"<markUp3 href=""#"">"&rs("markUp3")&"</markUp3>"
MyFile.WriteLine"<markUp4 href=""#"">"&rs("markUp4")&"</markUp4>"
MyFile.WriteLine"<image>"&rs("image")&"</image>"
MyFile.WriteLine"<imgAlt>"&rs("imgAlt")&"</imgAlt>"
MyFile.WriteLine"<content>"&rs("content")&"</content>"
MyFile.WriteLine"<className>"&rs("className")&"</className>"
MyFile.WriteLine("</item>")

rs.movenext
loop

MyFile.WriteLine("</config>")

MyFile.Close

rs.close
conn.close
set rs=nothing
set conn=nothing
end if
%>

<!--网页显示部分 并显示XML文件的链接-->
<p> </p>
<script language="javascript">
<!--

function ConfirmDel()
{
   if(confirm("确定要更新XML数据吗? 一旦更新将不能恢复!"))
     return true;
   else
     return false;�
}

-->
</script>
<form name="zongmu" method="post" action="?action=zongmu_shengcheng"><input type="submit" name="Submit" value="更新XML数据为最新" onClick="return ConfirmDel();"></form>
<p> </p>
<p><a href="test.xml">查看XML文件内容</a></p>

本人这是第一次花钱买空间买域名建立自己的小窝,中间走了太多弯路,现在拿出来和各位分享一下。

起初是在百度上搜索了很多虚拟服务器和域名的信息,最后锁定了红网(www.red.cc)的空间,但是由于我自己的一时疏忽,导致了在买空间的时候,买成了国内空间(杯具,当我登录到控制面板时,看到上海服务器时,我满脸黑线啊……),这意味着我如果想绑定我自己买的一级域名就需要去备那个狗屁案。

思考良久,决定再找一个便宜的美国空间,于是乎,在花了280大洋后,又出了100大洋去购买了一个美国空间,可杯具又发生了,空间实际情况和注册的时候是有区别的,简单的说就是我被骗了,这个空间不提供MySql数据库空间,除非自己另外购买(继续黑线)。心想:要不就把博客建设在国内空间里,然后在美国的那个空间里放一个index.html文件,里面用一个

又是一番折腾,弄好了。一切貌似挺顺利,安安稳稳的过了一个星期。说安稳也不算是太安稳,因为在这一个星期的填充博客的过程中发现seo方面的事情几乎都没法进行(虽然我刚开始接触seo,懂得很少,但是动不动就要一级域名确实是很拿人的事情)。另外,在这一个星期中,偶尔美国空间会访问不了(看来便宜没好货,好货不便宜啊)。

就在前天导火索出现了,美国空间彻底登不上去了,联系客服,客服说是因为服务器遭受攻击所以停止了,需要一天左右的时间进行调整。我靠!这是受不鸟了。客服还说,你可以再补个差价升级成高级用户就没事了。我合计了半天,心想既然事已至此,都已经上了贼船了,就再付200升级吧,反正就用这一年,麻烦就麻烦吧,谁让这都是自己找的呢。

这次升级后分配了一个100M的MySql数据库空间。我心想,既然这样我现在就转移个人博客吧。遂在百度上先看看怎么转移WordPress。整个流程还是很简单的,只要把网站备份一下,下载下备份包,然后再进后台,修改设置里的那个域名为新的域名,然后,进入虚拟机控制面板的数据库管理,把数据库打包下载(设置里的那个域名设置存储在数据库的wp_options表中)。从下载下来的网站文件包中把配置文件wp-config.php抠出来,打开,修改里面的数据库信息为新服务器的信息,然后再覆盖进刚才的压缩包。一切准备就绪后,上传网站文件压缩包到服务器解压缩,然后恢复sql文件到数据库,基本上就顺利搞定了。

理论上讲就是这么个顺序,很简单,但是在昨天12个小时的操作中可谓是一波三折,弄得我是心力憔悴啊,最可恶的是还没有成功!下面就细细的讲一讲。

备份文件修改文件都不是问题,很快就搞定了,红网的虚拟机控制面板还是非常好用的。出现的第一个问题就是美国的那个服务器速度超慢,用ftp几乎就上传不动(我的备份压缩包40M左右),上传到1%就出错了。尝试了n种方法后,未果。于是就先看看怎么回复数据库吧。结果跌破眼镜的事情是居然不提供数据库管理!我狂晕!!!联系技术客服,技术客服说自己安装phpMyAdmin或者用Navicat。我下载了一个Navicat,界面感觉上还不错,但是由于服务器速度太慢,导致总是连接不上,就是连上了,也运行sql导入不成功。。。。。。3个多小时过去后,还是不成功,绝望中……突然想到可以用分卷压缩的方式,于是把网站文件重新打包成500KB每个的小包,重新上传。功夫不负有心人,终于开始了上传旅程,每秒不到20kb的速度(黑线啊)……又是很长时间的等待,终于搞定了,用控制面板解压,终于先搞定了网站文件,这个时候,貌似老天终于开眼了(我估计是时差的问题,因为我这里和那个美国服务器大约差14个时区,当时我下午2点左右操作的时候估计美国那边是0点左右,网站流量应该还是比较大的,最主要的问题还是服务器限制速度啊……),数据库终于可以顺利打开并且导入原来的数据了。就在一切看似美好的气氛下,偶激动地输入了www.domyself.me,结果一片空白,状态栏提示完成,查看源文件,显示。我又尝试后台,这个倒是能顺利进来。结果进入一看,原来安装的插件和外观主题全部没有了,在ftp下看了看,存放插件和主题的文件夹都只有默认安装时的那些文件,迷茫,不知为何?不过这一点说明了为什么主页打不开了,因为我使用的主题不存在。于是,用ftp上传那两个文件夹,可是怎么上传总是有几个文件不成功,此时北京时间已经0:30了,估计是服务器访问量升上去了(时区问题在服务器很烂的情况下反应的很明显啊5555……),睡觉的zzzzzzzz

今天晚饭后,重新开始昨天的工作,结果杯具又一次降临。FTP上不去了,网站也上不去了,结果一问客服,人家说IP地址换了,我无语……重新对域名的解析进行了设置,ftp的信息也修改了一下,剩下的终于很顺利的都搞定了(发现今天改了IP后,貌似上传速度有所提高)。现在终于搞定everything,不过空间的访问速度还是比较慢的,只能忍了,明年一定要买个好空间。

罗里罗嗦写了这么多,希望能对各位新手和菜鸟有帮助~~~如果哪位大仙有好的美国空间,也可以留个言,大家分享一下啊~(^__^) 嘻嘻……

阅读全文 »

对于已建立的链表,通过头指针可访问整个链表,输出链表中所有结点,统计链表结点个数及插入、删除结点。

下面以刚才建立的单链表为例进行分析,给出相应操作的实现函数。

注意两点:
(1)将链表传递进函数,只需将链表头指针传递进函数。函数的形参对应实参头指针。
(2)对链表的访问用条件循环控制,循环的条件是结点的指针域非空。

1.输出链表中所有结点

1
2
3
4
5
6
7
8
9
10
void print(struct linklist*head)/*输出链表所有结点*/
{
struct linklist*P;
p=head;/*P指向链表第一个结点*/
while(p!=NULL)
{
printf("%d", p-->data);
p=p->next
}/*P指向下一个结点*/
}

2.统计链表中结点个数

只需将上述输出结点改成计数即可。

1
2
3
4
5
6
7
8
9
10
11
12
int count(struct linklist*head)/*统计链表中结点个数*/
{
int n=0;
struct linklist*P;
p=head;
while(p!=NULL)
{
n++;
P=P->nextl;
}
return(n);
}

3.插入操作

仅讨论将X插入到第i个结点之后的情况,其它情形请读者分析。

阅读全文 »
0%