首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

1.4.2  TCP

TCP很可能是使用最多的传输层协议,因为它能确保数据交付到对方。如果让TCP库发送数据,则除了一些不常见的事件(例如目的地不存在)外,都会成功地将数据发送到目的地。如果没有TCP,实际上就不可能完成因特网上的文件传输和可靠通信。

与UDP形成对照的是,TCP是一种面向连接的协议。这就意味着甚至在服务器监听流入数据之前,客户必须告诉服务器它想要进行连接。

TCP也是一种流协议。这就意味着此协议发送的是数据流,它是基于包交换网将数据分成包交付给对方。这是TCP的一个重要部分,因为它不仅要确保到达目的地,而且还要确保数据到达的顺序与发送顺序一致。

注意:由于因特网本质上具有分散特性,所以从一个地方发送到另一个地方的两个包可能会沿着完全不同的路径来传送,这就意味着我们并不能肯定先发送的包就先到达。若要确保TCP连接按顺序接收数据,还要进行很多处理。

已经讲过TCP以及它所使用的确认包。因为它们非常重要,这里我们再简单地回顾一下。当TCP端口接收到数据时,它就发送一个确认包,表达已经接收到了数据。如果最初的发送方没有收到确认信息,那么TCP端口会试图再次发送数据。当然,如果发送方发送一个包后,等待得到确认信息后再发送其他数据,则效率会很低。

但是,实际上TCP并不是这样工作的。TCP开始按顺序发送它需要的所有包,它只是不停地发送,直到发完为止。如果TCP意识到它所发送的一个包的确认包还没有发送回来,则它就停下来,试图重新发送没有被确认的这个包。

在接收方这一端,如果接收方检测到它收到的包顺序不对,则它就将包中数据放入缓冲区中,直到顺序应该在它前面的包到达为止。

在应用层,所有这些操作都是透明的。TCP库会为我们处理所有这一切,确保按期望的顺序收到数据。

遗憾的是,所有这些安全处理都需要付出代价,当浏览图1.12所展示的TCP首部时就会对此一目了然。可以注意到TCP首部比UDP首部要长得多。

图1.12 TCP包标准

TCP是一种特性丰富的协议。它不但包括了几乎所有的特性,而且还加以处理。TCP首部的最小长度是20字节,这比首部只有8个字节的UDP要长得多。

TCP采用与UDP相同的端口编号方案,即端口域的长度为16比特,总共可以表示         65 535个端口。与UDP一样,TCP也有一个校验和域,它用于数据完整性。

至少我们还应该注意序号(sequence)、确认(acknowledgement)、窗口(window)和紧急(urgent)等其他几个域。序号域表明当前流中的包在发送时是处于什么位置,这样做的目的是,如果这些包不按顺序到达,则便于接收端将这些包拼合起来。确认域可以告知接收方发送方期望的确认号是多少。

窗口域有点意思。TCP采用流控制机制,这就意味着TCP连接的双方都能够告诉对方它乐于接收多少数据。这样做的目的是避免发送太多的信息,以致于对方处理不过来。

无论何时,只要丢弃数据包,就将自己的接收限度通知对方,这也是一种特别行之有效的方法。由于TCP协议会将顺序不正确的数据放入缓冲器中,因此接收方告知发送方先停止发送数据,等它来得及接收时再发送,这可能也是一种行之有效的方法。存放在缓冲器中的数据可能会占据很多空间,因为TCP库在得到此数据前面的所有包之前,并不会对此数据进行任何操作。

最后,还应该了解TCP所支持的称为紧急数据的这样一个概念,紧急数据由紧急域来处理。虽然紧急数据不应该用在数据流中,但是它包含重要的连接和控制信息。所使用的TCP库应该无缝地从流中将这一数据无缝地剥离出来并自动对它进行维护。

这里介绍了游戏编程人员所需要了解的有关TCP的全部重要内容。如果大家想要了解UDP或者TCP的更多信息,则可以阅读网络方面的一些书籍。这里只要求大家了解这些技术对游戏编程有影响时其基本的工作原理即可。

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论