Akawa

ETY001的博客

    1、第一个原则:位置感原则——每一个场上队员时刻提醒自己不能把自己的位置丢了。清楚认识到“在其位谋其政”,队长安排你打什么位置就要履行该位置的进攻以及防守职责。助攻也好,跑位也罢,在进攻中失误被断球对方反击,应第一时间立即就地反抢,延缓对方进攻时间,给队友回撤的机会。一抢不成不可恋战,可迅速回到自己位置上再歇,除非你抽筋受伤倒地。没有体能,再怎么累至少回追三秒。给自己数数:一,二,三秒!如果不是有伤病,一丢球就泄气原地叉腰,慢慢走回来,这种态度坚决杜绝。
(个人体会:水平可以锻炼,态度决定一切,进球的不是一个人的功劳,丢球也绝对不是一个人的失误)

   2、第二个原则:重心移动原则——球在左边,球队整体重心移到左边;球在右边整体重心移动到右边。防守的时候边前卫和边后卫往内收缩,进攻的时候往边扩散,充分利用球场宽度。只有全队一起移动,才能形成局部的以多打少。整体补位有多个好处,节省体力,易对敌人形成围抢,局域形成多打少的可能。就算对方控球,也是无效控球,没有形成威胁。

 
   3、第三个原则:跑动接应原则——所有队员都需要无球跑动起来。踢球最基本的接应意识就是迎球接应,其实,对于任何一个球员,迎球不等球,其实是一个最基本要求,这是意识问题,不是灵感,所以,是可以培养和积累的。接应的要点就在于跑动,三角进攻,三角接应,一个人拿球,相邻位置的三个人必须跑动起来接应。应轮番有一人回撤接应,做成一个动态三角形结构。必须明白:有时候,我们的接应,扯动未必是要球,而是为了给队友创造空挡和机会。
(个人体会:队友接应了并形成更加合理的机会,但是却没有及时分球,是对队友的不信任,是对队友不惜力跑动的不尊重,也会影响队友对你的信任,也许从此你就少了一个接应点)
 
   4、战术要点之一:三角攻防——不同的进攻或防守的情况下,都要将双三角的站位进转化。一个原则,临近补位,整体移动。这样下来,攻防为整体化变动,千万不要认为,球离我很远,我不用留意它,到了临近队友时我再补位,往往这个时候已经来不及了,因为队友去补位了,而你没有跟上,形成了空位,会导致全军覆没的。

   5、战术要点之二:套边和反插——当边前卫拿球,边后卫从其身后插上,是一个标准的边后卫套边;后腰拿球,前腰回撤接应,前锋前插,边前卫迅速绕到边路前插,也是一个标准的边前卫套边战术。套边和反插是足球比赛里面边路进攻最常用的战术。反插要求配合的球员只有两个人,套边则要求整体的协调跑位,不是一个人的套边,一次成功的套边战术需要队友配合。套边和反插的目的一个是为了插到对方空挡地区接球并借此扯开对方防线,另一个原因是为了纯属战术的扯动要求,目的是为了吸引对方防守人员,为队友拉出空挡。
     
   6、 战术要点之三:局部更多的2打1,2打2,直传斜插,斜传直插。局部的配合可以在任何两个相邻近位置的队员之间使用。局部的小配合+大范围的转移,是每个成熟球队的基本功。
   
   7、 守门员:拿到球,你就是进攻的发起者,立即跑向大禁区角,两边的边后卫第一时间拉边,同时,后腰前腰开始迅速跑位接应。
(个人体会:每个人都应该主动的去做守门员,尝试用门将的眼神看待场上的变化,有利团队,有利个人)    
   8、中后卫:一个盯(顶)人,另一个清道夫。两人要互相配合,有人冲上去阻杀,另一个人负责清扫。盯人中卫不要害怕身体对抗和扑球,看准时机出脚要狠,及时封堵。清道夫要留意场上的形势,一旦出现漏洞第一时间反应做出补位。中后卫防守站位原则:1站在内侧,一防一的时候,应站在对方前锋与球门的直线中间;2距离保持在既能够靠近盯住防守对象,又能够首先从防守对象身后得球;3. 要抢断或者绕前防守所有传球不准和传球速度慢的来球;4.如果不能够抢断球,则要努力封堵逼抢球;5.如果不可能封堵逼抢,则要边退缩边防守延缓对手进攻,回撤并站位于对手与本方球门之间的空当. 6.出脚抢球的最好时机是当进攻者试图转身,即半转身的一刹那.此时进攻者既不能很好地用身体掩护球,同时身体重心又处于不稳定之中。

   9、边后卫:边后卫防守的主要职能是:盯住进入本防区的进攻队员,不让对手个人运球突破或通过配合突破,保护中路防区。当球在异侧活动并且中卫队员靠向异侧时,及时向中路靠拢;当中路被突破时迅速补位,同其他后卫队员保持默契联系;当拖后中卫制造越位时,应同步行动。在对方边路进攻时要站在对方球员和球门的连线,防止对方球员远射。对方突破时要卡住内线的身位,将其迫向角旗区。对方反击时,不要轻易上扑。注意和中后相互补位。
(个人体会:边后卫有很多的机会参与第一波的进攻转化,无论自己的攻击性有多强,自己的本职还是后卫,队伍的荣誉和每个人都是密不可分的,优秀不一定体现在进球)      
   10、单后腰,双后腰:如果是单后腰,防守的时候与前腰平行站位,进攻时主要时固守中间枢纽地带。双后腰时呈左右平行站位,但二者要有分工,可以灵活换位,在边路出现空档的时候及时移动补位,但一定要保证有一个后腰在中间作为中卫前的屏障,避免对方球员直接面对中后卫。后腰要控制整个球队的攻防节奏,不能只会往前传,而要更多的跟后场和边前卫做呼应及配合。
(个人体会:球队的灵魂、屏障,球队攻防的指挥官)    
     
   11、 边前卫:在防守上必须具备以下能力: ①个人抢断和与同伴夹击、围抢的能力。 ②在整体和局部防守意识支配下的保护与补位能力,诸如前卫间的相互补位,与后卫间的保护与补位等。 ③迅速转入防守或进攻的往返奔跑体力和意识。阵地防守中,职责应该是盯防对方边卫压上助攻。并封堵其向心脏地带传球得线路。进攻时,可以区分两个体系: A/反击时,此时对方防守体系空隙大,应迅速前插占领无人空白地带。在对手不及回防时给予其致命一击,强调的是时间差。持球者分球要果断,避免前插者越位。前插人选不要拘泥于前后场之分,任何最接近对方危险地带队员,都可迅速前插跑位以争取时间。
   B/阵地进攻,应尽量利用场地宽度横向扯动,跑出持球队友可以传出球的线路。中锋和边锋不要在一条线路上重叠,应有意识地错位跑动,必要时相互换位。但是三个人的位置不要都急于顶上去,以至于形成一条直线,这样会造成前后脱节。应轮番有一人回撤接应,做成一个动态三角形结构。
 
 
   12、单前锋:单前锋战术里面的前锋的职责不是为了进球,而是起到更多的是做球和牵引对方中后卫的作用,为前腰和别的前插队员制造杀机,通常需要背对球门接球,而防守方只求破坏,且正对来球。因此进攻队员(尤其是策应型中锋)更需要有一个迎球的意识,无论是背对球门还是侧身。所以这个时候他作为一个前锋的回做球再反插就很重要。当由攻转守时,作为第一道防线,中锋应积极干扰破坏对方的进攻。如果对手进攻发动于自身附近,中锋应迅速跟上延缓时方推进速度,防止对方发动快速反击或见机行事,积极干扰和拼抢。一以迫使持球者无法组织进攻。双前锋:不能离得太远。两个前锋经常要做相互间的配合,才能有威胁。双前锋的职责还需要有时候往边路扯动,充当一个边锋的位置。防守的时候卡住对方两个后腰的传球路线。
   
   13、前锋的跑位:优秀的前锋经常会用横向扯动,突然前插的方法来摆脱后防线。接应边路传中,尽量抢前点。接球尽量往中路停球(这个很重要,一个优秀的前锋,他的每一次停球都是有目的的,停球往中路,为了争取更大的射门角度)。

今天用手机在网上闲逛的时候,看了一篇关于介绍Web3.0的文章,感觉很神奇。Web2.0的时代才刚刚开始,就要马上迎来Web2.0?回到电脑前的第一件事就是搜索一下Web3.0的相关内容看看。不过看后,我个人觉得其实Web3.0是基本上可以和Web2.0划等号的。

首先来看看我从网上找到的关于web3.0的一些内容。

什么是Web3.0?

假如说web1.0的本质是联合,那么web2.0的本质就是互动,它让网民更多地参与信息产品的创造、传播和分享,而这个过程是有价值的。web2.0的缺点是没有体现出网民劳动的价值,所以2.0很脆弱,缺乏商业价值。web2.0是脆弱的,纯粹的2.0 会在商业模式上遭遇重大挑战,需要跟具体的产业结合起来才会获得巨大的商业价值和商业成功。web3.0是在web2.0的基础上发展起来的能够更好地体现网民的劳动价值,并且能够实现价值均衡分配的一种互联网方式。

Web3.0到来的前提

web3.0到来的三个前提:1、博客技术为代表,围绕网民互动及个性体验的互联网应用技术的完善和发展。2、虚拟货币的普及和普遍,以及虚拟货币的兑换成为现实。3、大家对网络财富的认同,以及网络财务安全的解决方案。

web3.0跟web2.0一样,仍然不是技术的创新,而是思想的创新,进而指导技术的发展和应用。web3.0之后将催生新的王国,这个王国不再以地域和疆界进行划分,而是以兴趣、语言、主题、职业、专业进行聚集和管理的王国。到时候真可谓是“皇帝轮流做,明年到我家”,你有机会打造出一个新的互联网王国而成为一个国王,也有可能会在互联网王国的民主竞选中成为总统,到时,你将拥有来自地球各个角落的网络公民。

我的想法

就像我开头说的,Web3.0是可以和Web2.0划等号的。Web3.0不过是在思想理念上对Web2.0这个大的框架进行了完善,使Web2.0现有的功能更加方便和强大。可能最不同的一点就是你需要拥有一个更加完美的浏览器来做你想做的事情,因为Web3.0中,程序将会进一步网络化。会有越来越多的程序是运行在网页中的,依托于网路而存在。有的资料中讲到Web3.0的互联网将自身转化为一个泛型数据库,里面将会存有各种各样的信息,比如个人信息,公司企业信息等一系列跟生活工作有关的信息,甚至是刚刚说到的那些网络化的应用程序。

我突然想起来了最近腾迅开始测试的新WebQQ,集成了腾迅众多的服务,在网页中提供了类似桌面的操作环境,这似乎有些Web3.0的感觉。Web3.0给我的感觉是互联网就像是一锅正在熬制的八宝粥,一切提供服务的机构或者个人就像是其中的各种各样的料,综合在一起相互之间既提供自己的味道给别人又把别人的味道揉入自己,最后把成品八宝粥提供给用户。

Web3.0由于比Web2.0更加依赖网络,因此将会具备跨平台、跨硬件的优势,这将更有助于把各个提供服务的个体聚合在一起,为用户提供更加稳定优秀的服务,这将使人们有更加不错的上网冲浪体验。

对于这样一个新奇的概念,我的展望是,个人博客是必不可少的,甚至每个个人博客都将成为那碗八宝粥的一个个米粒,服务商、大的门户网站的信息交互是必不可少的,这种交互将会在Web3.0中更加频繁与重要。

但是细想一下,Web3.0并没有比Web2.0多出什么东西,而仅仅是对Web2.0进行了一定的完善。总之,无论是Web2.0还是Web3.0都很让人憧憬以后的互联网生活的绚丽多彩。

原创博文,转载请附带原文地址,谢谢!

error C2143: 语法错误 : 缺少“;”(在“类型”的前面)

如果习惯了不区分C/C++,那么在VS里面编译C的时候遇到这种问题会感到很棘手。

明明是写好的,为什么就会出现这种情况呢?如果用Cpp扩展名就不会出现问题。

写C时,遵循一下两个原则就可以解决上述问题:

  1. 定义结构体变量时前面要加上struct。

  2. 变量定义要全部放在最前面,不支持在文件中间定义临时变量。

SEO入门书籍推荐

《搜索引擎优化(SEO)知识完全手册》

相对下面一本更系统一些,而且只有50页,字很大,一会就能看完。
介绍页面:http://www.jingzhengli.cn/sixiangku/ebook/2005_hbj_seo.htm
下载地址:http://www.jingzhengli.cn/sixiangku/ebook/2005_hbj_seo.pdf

《GOOGLE排名秘笈》

此书售价1200元,但我感觉没有上面这本好。下面是破解版。
下载地址:http://www.chinaseo.org.cn/down/view_106.html

Kyw强烈建议想SEO入门的朋友,看这2本书,而不是在网上找零散的教程。

更多SEO入门书籍
http://zhidao.baidu.com/question/22985230.html?si=1
http://www.seotest.cn/BLOG/SEO2007-download.html

经常关注网站排名的朋友可能有过这样的经历,突然有一天发现自己网站在GOOGLE上的排名直线下降,甚至于消失——这就有可能是Google Dance。

我们先来了解什么是Google Dance?

Google Dance其实就是指Google重新安排它的搜索结果的排名的过程。通常用于描述Google搜索引擎数据库每月一次的大规模升级,定期更新其索引的活动。
我们把这种现象称为Google幽灵现象,由于Google一般每个月对其搜索数据库进行一次更新,在三到五天的Google Dance时期,Google的搜索结果会有大幅度的波动,几乎每一分钟都会有变化。反应在排名结果上,就是就是关键词排名忽上忽下,忽隐忽现,就像是跳舞一样,因此称之为Google Dance

如何判断是否处于Google Dance期?

我们知道Google有很多服务器(www.google.com,www2.google.com,www3.google.com,这是Google的三个主要服务器),在更新过程中,所有的服务器都要接受新的索引,但是并非一次性全盘接受,毕竟Google拥有8 个数据中心,共享着成千上万个网络服务器。因此在这个期间(Dance一般持续三五天的时间,Google Dance通常在月末的那周开始,新结果在月初几天可以看到,大概是每36天一次或者一年10次。
所以我们如何判断是否处于Google Dance期,一般只要在不同的服务器查询同样的关键词,如果获得不同特别是较大差距的查询结果数量,一般就可以断定Google正在更新中。当搜索结果数量和排名顺序都相同的话,就表明Google的更新过程已经完成。

SEOer 怎么利用 Google Dance?

Google Dance更新期间,可能同时也会有算法的改变或调整。Google一直为反作弊而努力,一直在不断改进自己的算法。在Google Dance 结束后,站长应该针对排名升降结果和竞争对手的排名情况调整自己的优化策略,作弊并不能取得长久效果,只有认真对待网站优化的每个细节,正规合理地优化,才能无惧于Google每次的Dance调整,才能长期从Google那获得较好的排名。
另外,在Google Dance期间,新网站被收录的机会大大增加,SEOer完全可以在此期间提交新的网站以及加大网站的更新力度,为网站能获得更好的排名做准备。

Google Dance查询工具:

http://www.google-dance-tool.com/

中国人太辛苦,拼死拼活也挣不了几个钱,想想一个点击2毛钱还算不错吧,而国外CPC单价普遍比中国高,即使一样的话也是0.2美金,6.7倍的关系,同时以美国为代表的西方国家,网络已经深入百姓家庭,CPA,CPS等广告模式深入人心,很容易推广,我们不妨把眼光放宽一点,在国内网络管理日趋严厉的形式下,可以尝试做一些英文站,在这里,结合我做英文的小小经历,共同探讨一下做英文站特别是站群的赚钱模式。

一、空间和域名选择

做英文站,就千万不要指望国内的IP,国内的IP在英文网站上质量非常低,转化率简直就是零,既然做了英文站,就要把欧美人的IP给吸引过来,那么在选择空间时,尽量选用美国空间,美国空间速度快,价格便宜,IP超多。做英文垃圾站特别是站群时,一定要采用独立IP,有可能的话一个站一个IP,如果做到200个以上的站群时,可以1个IP下放4~5个网站,但这些站千万不能互连。

对于域名,做站群的话,域名的注册信息要不一样,域名注册信息包括所有人名称,邮箱,联系,地址等等,越不一样越好。任何一样的信息都会被搜索引擎知道,也会因此造成域名关联。

阅读全文 »

垃圾站群是近几年发展起来的一 种盈利模式。我接触站群也纯属意外,当初的想法也很单纯,就是为了自己在操作SEO项目的时候能有更多的外链资源。但慢慢了解到个人站长做站群,也不失为一条较好的出路。下面是我做 站群半年来总结出的一些经验:  

一、前期的准备以及注意事项

  1、批量注册域名

   一次性注册好域名,这里推 荐使用Godaddy的7元info或.tk免费域名。(如何注册、申请去百度找找教程)做站群成本一定要控制好,前期最好投入的不要太大,投入太大相对压力越大,很多人往往就坚持不下。如果大家担心info、tk域名影响收录大家可以去百度 site:.info site:.tk 当然如果你资金充裕也可以选择com、org域名,但这大大提高了建站成本。

  2、批量安装好网站程序

   这一步往往很多人执行不起 来,很多人在空间、程序上面要花掉大量的时间。有资金的建议购买服务器或者VPS,不该省的不能省,别相信国外的那些美名其曰的无限空间,速度慢、宕机不说,几乎所有空间商都有文件数量限制,这样的空间不适合站群。另外没条件的可以使用Godaddy注册Info域名送的免费空间,虽然有广告,但成本大大降低。然后就是批量安装好网站程序,推荐使用DEDE、帝国、Z-blog等,程序、模板设置的不要过单一。

  3、选择点站类型

   不要选择一些太热的行业, 网站的定位要精准,别老想把垃圾站建成门户。大家可以去慧聪、阿里巴巴找找,比如烫画机、热风机这类完全可以做成独立站点。小领域,大市场,这句话到哪都受用,我们要清楚认清形势,网站定位一定要精准。  

        4、网站内容

   网上有很多站群类软件、工 具,都能非常好的实现网站内容、内部链接,这里我就不多说了,免AD之嫌。

  5、注意事项

   要清楚的认识到你做的是垃 圾站,别在一个站点上花太多时间,别把时间浪费在找程序、改模板上面。别想着你能做成行业巨头,那不是我们想的事情。如何利用现有的资源做到效率最高、风险最小、利润最大才是我们需要思考的问题。不要太在意单个站点被搜索引擎处罚(采集站都会有被K的一天),同一IP下站点之间不要互相链接,以免K站的时候殃及。新站在百度至少2个月才有点权重,往往很多人都坚持不住,做站群之前最好学习下SEO入门知识。

  二、站群的盈利模式

   6个月时间,通过软件我已 建立了300多个垃圾站,保守的按照一个站100pv,那么100个站也有1万的pv而我选择的都是行业站,adsense的单价也高,按照1%的点击率、0.1美元的单价算,一万pv每天就能为我带来10美元的收入,300个站每天也有30美元的收入。当然实际收入绝不止这些,点击率、流量这些完全可以大幅度提高,另外还可以通过弹窗、淘宝客等把利益最大化。如果有自己产品,通过站群来实现品牌推广、营销也是再好不过了。有人说无图无真相,要看收入截图,我要说的是,是否能成功完全取决个人能力、执行力,同样的事情不同人做就会有不同的结果,如果一味的怀疑别人、依赖于别人能给你多大的帮助,这样的人不管做什么事都不能成功。所以个人能力、执行力跟盈利也是相辅相成的。

  三、发展前景

   这个我不敢断言,本来站群 模式就属于黑帽行为,我们要做的就是如何在搜索引擎大规模处罚之前,最大化的获取利益。最好是利用现在的站群资源,主推自己主站,用心经营,任何站都有出头之日。

  讲到这里基本就说完了.

对于图的深度遍历相信学过数据结构的人都不会陌生吧,有时间,所以写了个图的深度遍历源代码,拿出来给大家分享一下。

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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include <stdio.h>
#include <malloc.h>
#define INFINITY 32767
#define MAX_VEX 20 //最大顶点个数
bool *visited;  //访问标志数组

//图的邻接矩阵存储结构
typedef struct{
  char *vexs; //顶点向量
  int arcs[MAX_VEX][MAX_VEX]; //邻接矩阵
  int vexnum,arcnum; //图的当前顶点数和弧数
}Graph;

//图G中<!-- more -->查找元素c的位置
int Locate(Graph G,char c){
  for(int i=0;i<G.vexnum;i++)
  if(G.vexs[i]==c) return i;
  return -1;
}

//创建无向网

void CreateUDN(Graph &G){
  int i,j,w,s1,s2;
  char a,b,temp;
  printf("输入顶点数和弧数:");
  scanf("%d%d",&G.vexnum,&G.arcnum);
  temp=getchar(); //接收回车
  G.vexs=(char *)malloc(G.vexnum*sizeof(char)); //分配顶点数目
  printf("输入%d个顶点.\n",G.vexnum);
  for(i=0;i<G.vexnum;i++){ //初始化顶点
    printf("输入顶点%d:",i);
    scanf("%c",&G.vexs[i]);
    temp=getchar(); //接收回车 
  }

  for(i=0;i<G.vexnum;i++) //初始化邻接矩阵
    for(j=0;j<G.vexnum;j++)
      G.arcs[i][j]=INFINITY;

  printf("输入%d条弧.\n",G.arcnum);
  for(i=0;i<G.arcnum;i++){ //初始化弧
    printf("输入弧%d:",i);
    scanf("%c %c %d",&a,&b,&w); //输入一条边依附的顶点和权值
    temp=getchar(); //接收回车
    s1=Locate(G,a);
    s2=Locate(G,b);
    G.arcs[s1][s2]=G.arcs[s2][s1]=w;
  }
}

//图G中顶点k的第一个邻接顶点
int FirstVex(Graph G,int k){
  if(k>=0 && k<G.vexnum){ //k合理
    for(int i=0;i<G.vexnum;i++)
      if(G.arcs[k][i]!=INFINITY) return i;
  }
  return -1;
}

//图G中顶点i的第j个邻接顶点的下一个邻接顶点
int NextVex(Graph G,int i,int j){
  if(i>=0 && i<G.vexnum && j>=0 && j<G.vexnum){ //i,j合理
    for(int k=j+1;k<G.vexnum;k++)
      if(G.arcs[i][k]!=INFINITY) return k;
  }
  return -1;
}

//深度优先遍历
void DFS(Graph G,int k){
  int i;
  if(k==-1){ //第一次执行DFS时,k为-1
    for(i=0;i<G.vexnum;i++)
      if(!visited[i]) DFS(G,i); //对尚未访问的顶点调用DFS
  }
  else{ 
    visited[k]=true;
    printf("%c ",G.vexs[k]); //访问第k个顶点
    for(i=FirstVex(G,k);i>=0;i=NextVex(G,k,i))
      if(!visited[i]) DFS(G,i); //对k的尚未访问的邻接顶点i递归调用DFS
  }
}

//主函数
void main(){
  int i;
  Graph G;
  CreateUDN(G);
  visited=(bool *)malloc(G.vexnum*sizeof(bool)); 
  printf("\n深度优先遍历: ");
  for(i=0;i<G.vexnum;i++)
  visited[i]=false;
  DFS(G,-1);
  printf("\n程序结束.\n");
}

输出结果为(红色为键盘输入的数据,权值都置为1):

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
输入顶点数和弧数:8 9

输入8个顶点.

输入顶点0:a

输入顶点1:b

输入顶点2:c

输入顶点3:d

输入顶点4:e

输入顶点5:f

输入顶点6:g

输入顶点7:h

输入9条弧.

输入弧0:a b 1

输入弧1:b d 1

输入弧2:b e 1

输入弧3:d h 1

输入弧4:e h 1

输入弧5:a c 1

输入弧6:c f 1

输入弧7:c g 1

输入弧8:f g 1

深度优先遍历: a b d h e c f g 

程序结束.

  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连接,但另外还告诉对方,我暂时还有点数据需要传送给你,稍后再关闭连接。

TIME_WAIT: 表示收到了对方的FIN报文,并发送出了ACK报文,就等2MSL后即可回到CLOSED可用状态了。如果FIN_WAIT_1状态下,收到了对方同时带 FIN标志和ACK标志的报文时,可以直接进入到TIME_WAIT状态,而无须经过FIN_WAIT_2状态。

CLOSING: 这种状态比较特殊,实际情况中应该是很少见,属于一种比较罕见的例外状态。正常情况下,当你发送FIN报文后,按理来说是应该先收到(或同时收到)对方的 ACK报文,再收到对方的FIN报文。但是CLOSING状态表示你发送FIN报文后,并没有收到对方的ACK报文,反而却也收到了对方的FIN报文。什么情况下会出现此种情况呢?其实细想一下,也不难得出结论:那就是如果双方几乎在同时close一个SOCKET的话,那么就出现了双方同时发送FIN报文的情况,也即会出现CLOSING状态,表示双方都正在关闭SOCKET连接。

CLOSE_WAIT: 这种状态的含义其实是表示在等待关闭。怎么理解呢?当对方close一个SOCKET后发送FIN报文给自己,你系统毫无疑问地会回应一个ACK报文给对方,此时则进入到CLOSE_WAIT状态。接下来呢,实际上你真正需要考虑的事情是察看你是否还有数据发送给对方,如果没有的话,那么你也就可以 close这个SOCKET,发送FIN报文给对方,也即关闭连接。所以你在CLOSE_WAIT状态下,需要完成的事情是等待你去关闭连接。

LAST_ACK: 这个状态还是比较容易好理解的,它是被动关闭一方在发送FIN报文后,最后等待对方的ACK报文。当收到ACK报文后,也即可以进入到CLOSED可用状态了。

最后有2个问题的回答,我自己分析后的结论(不一定保证100%正确)

1、 为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?

这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。

2、 为什么TIME_WAIT状态还需要等2MSL后才能返回到CLOSED状态?

这是因为:虽然双方都同意关闭连接了,而且握手的4个报文也都协调和发送完毕,按理可以直接回到CLOSED状态(就好比从SYN_SEND状态到 ESTABLISH状态那样);但是因为我们必须要假想网络是不可靠的,你无法保证你最后发送的ACK报文会一定被对方收到,因此对方处于 LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以这个TIME_WAIT状态的作用就是用来重发可能丢失的 ACK报文。

0%