书上的知识要想变成自己的就必须经过一个转换:把所看到和所理解的东西用自己的语言表达出来,最好能举出些例子来辅助理解。
    如果能让别人很容易听懂你所要表达的内容并能很快的理解它,那么你就确确实实的理解到位了!!
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

    下面我就用一个有趣的例子来比喻TCP协议从建立连接到关闭连接的全过程:

 

 
    假设你是小C Client,客户机),在你阳台右边的那个朋友叫小SServer)。有一天你和小S被锁在家里出不来了,你想借小S的暑假作业抄(你想读取服务器上的信息并写入客户机某个应用程序),可是暑假作业的本子太轻,丢不准掉下楼那就惨了!小S想到了用丢纸团的方法来传递答案给你。

 

于是就有了下面的一幕:

 

TCP连接建立

 

1、  你准备好作业本和笔摆在阳台的桌子上。
[ 客户机做好访问服务器的准备,比如运行并初始化相应的程序 ]

 

然后对着阳台右边的小S家喊:“小S 我东西已经准备好了!~ 你可以出来把写有答案的纸团丢过来给我抄啦!!~
[ 客户机发送SYN = 1(标识此帧用于同步序列)、ISN = XX是一个随机的初始序列号)和Window数值Window数值表示客户端上用来存储从服务器发来的数据存入缓存的大小),这些信息是让服务器知道客户机是在请求建立连接,且客户机已经做好建立连接的准备 ]

 

 

2、  S听到后从阳台出来对着你家阳台喊:“噢!知道了~ 我已经准备好了!”
[ 服务器收到客户机的请求连接后发出确认信息:ACK = X + 1(表示此帧用于确认序列号为X的帧已收到),然后服务器再向客户机发出 ISN = Y SYN = 1 window数值,(表示服务器已经做好建立连接的准备) ]

 

 

3、  你听到小S的回话后,高兴的对小S喊:“噢~ 呵呵~ 你准备得还真快,那我们开始吧!”
[ 客户机接到服务器发来的确认信息和序列号为Y的帧后,客户机再次回应客户机:ACK =Y + 1(表示次帧用于确认序列号为Y的帧已收到)  ]

 

S听到我的回话后就开始把写有答案的纸团(数据包)仍(传)给你!
此时你和小S之间的连接已经建立起来了!
(完成TCP的连接建立后双方不分主从的互相发送或接收信息,而且是全双工数据传输方式!!)

 

 

TCP连接关闭

 

1、  你的暑假作业已经抄完了,然后对阳台右边的小S喊:“小S谢啦! 我已经抄完作业了~ 嘿嘿! 你就不用在丢纸团过来了! 下次我请你吃冰激凌~
[ 在断开连接前客户机先把FIN的数据段(FIN帧用于请求关闭连接)和随机序列号为M的数据发送到服务器 ]

 

 

2、  S听到你这么一喊,就高兴的对你喊:“噢~抄完啦! 那我去收拾收拾东西。”
[ 服务器收到客户机的关闭请求后,服务器首先向客户机发送ACK=M+1确认已收到请求关闭连接信息,然后服务器关闭读取通道(收拾作业本和笔,不用再写纸团丢给你了) ]

 

你听到后(收到此信息)也去收拾东西了。
(客户机收到服务器的确认信息后,客户机关闭写入通道,也就是关闭应用程序,从服务器上发来的信息已经不能写入应用程序中)

 

 

3、  S收拾完后对你喊:“我收拾完啦~ 还有什么事吗?没事我进屋看电视咯?噢!对了,别忘记你说过的话! 我要去吃炸的冰激凌!我知道哪有卖!呵呵~
[ 服务器又继续向客户机发送FIN 序列号为N (表示服务器已经关闭读取通道,通知客户机可以断开连接了)]

        
        
4、  你听到小S这么一说,带着好奇的眼神对小S喊:“靠!整天吃那些乱七八糟的东西,就不怕拉肚子?! 吃死你! 进屋去!懒得理你这个怪胎!冰激凌这么会有炸的卖啊!一炸不就化了嘛!”
[ 客户机接到服务器发来的FINN的帧后,最后一次向服务器发送ACK = N + 1确认帧,客户机关闭读取连接,此时客户机的所有连接通道都关闭了 ]

 

S听到说自己是怪胎得意洋洋的进屋了,小S在心理阴笑:“见识真是少! 谁说冰激凌不能炸着吃啊! 到时我让你看得目瞪口呆,一想到你那傻样胃口大开啊!哈哈!”
[ 当服务器收到客户机最后发来的ACK=N+1的确认信息后,服务器关闭写入通道,此时服务器与此客户机之间的所有连接都关闭了 ]
 
关键字解释:

SYNSynchronous frame)同步序列帧:用来同步序列号,并请求建立连接。

 

ISNInitialization Sequence Number)初始序列号:用来设定序列号的初始值,初始序列号的值是随机(Random)的,在发送建立连接请求时包括SYNISN两个数据流。

 

ACKAcknowledgement frame)确认帧:用于确认对方发来的信息。ACK=1时,此数据是用来确认对方发来的信息是否收到,并把对方发来

 

FINFinish)完成帧:用于请求断开连接。在发送请求断开连接时包括FINISN两个数据流。

 

S:代表的是服务器(Server

C:代表的是你,也就是客户机(Client