Chinaunix首页 | 论坛 | 博客
  • 博客访问: 125706
  • 博文数量: 42
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 354
  • 用 户 组: 普通用户
  • 注册时间: 2014-07-01 15:34
个人简介

不晓得说啥子

文章分类

全部博文(42)

文章存档

2015年(41)

2014年(1)

我的朋友

分类: 网络与安全

2015-04-09 18:45:25

一、tcp连接的建立
     
                                                                   
                                               

                                                                                                        图 1 tcp连接的建立

     建立连接(三路握手)的过程
(1) 服务器必须准备好接受外来的连接。这通常通过调用socket、bind和listen这3个函数来完成,我们称之为被动打(passiveopen)。
(2) 客户通过调用connect发起主动打开(active open)。这导致客户TCP发送一个SYN(同步)分节,它告诉服务器客户将在(待建立的)连接中发送的数据的初始序列号。通常SYN分节不携带数据,其所在IP数据报只含有一个IP首部、一个TCP首部及可能有的TCP选项。
(3) 服务器必须确认(ACK)客户的SYN,同时自己也得发送一个SYN分节,它含有服务器将在同一连接中发送的数据的初始序列号。服务器在单个分节中发送SYN和对客户SYN的ACK(确认)。
(4) 客户必须确认服务器的SYN。

这种交换至少需要3个分组,因此称之为TCP的三路握手(three-way handshake)。



二、tcp连接断开
 
                                                                                    
                                                                                     
                                                                                                         图2 tcp断开连接

           断开连接(四次挥手)的过程
          (1)、tcp连接的某一端主动调用close(主动关闭),导致tcp发送 一个FIN报文,表示数据已经发送完成
          (2)、tcp连接的另外一端收到FIN报文后(得知对方数据已经发送完毕)首先发送一个确认的ACK
          (3)、发送好确认的ACK后调用CLOSE关闭该连接(被动关闭),发送一个FIN报文
          (4)、主动关闭一方收到FIN报文后便发送一个ACK,确认收到

          经过这四个过程后一个TCP连接就已经关闭

三、tcp的状态转移图

                                          
                                                             
                                                                                     图3   tcp的状态转移

注意,服务器对客户请求的确认是伴随其应答发送的。这种做法称为捎带(piggybacking),它通常在服务器处理请求并产生应答的时间少于200 ms时发生。如果服务器耗用更长时间,譬如说1 s,那么我们将看到先是确认后是应答。

四、TIME_WAIT状态

       毫无疑问,TCP中有关网络编程最不容易理解的是它的TIME_WAIT状态。在图2-4中我们看到执行主动关闭的那端经历了这个状态。该端点停留在这个状态的持续时间是最长分节生命期(maximum segment lifetime,MSL,数据包在网络当中存活的最长时间)的两倍,有时候称之为2MSL

任何TCP实现都必须为MSL选择一个值。RFC 1122[Braden 1989]的建议值是2分钟,不过源自Berkeley的实现传统上改用30秒这个值。这意味着TIME_WAIT状态的持续时间在1分钟到4分钟之间。MSL是任何IP数据报能够在因特网中存活的最长时间。我们知道这个时间是有限的,因为每个数据报含有一个称为跳限(hop limit)的8位字段TTL(time to live),它的最大值为255。尽管这是一个跳数限制而不是真正的时间限制,我们仍然假设:具有最大跳限(255)的分组在网络中存在的时间不可能超过MSL秒。


     TIME_WAIT状态有两个存在的理由

(1) 可靠地实现TCP全双工连接的终止。

       (2) 允许老的重复分节在网络中消逝。

          第一个理由:如果在图三中最后一个ACK丢了,服务器将重新发送它的最终那个FIN,因此客户必须维护状态信息,以允许它重新发送最终那个ACK。要是客户不维护状态信息,它将响应以一个RST(另外一种类型的TCP分节),该分节将被服务器解释成一个错误。如果TCP打算执行所有必要的工作以彻底终止某个连接上两个方向的数据流(即全双工关闭),那么它必须正确处理连接终止序列4个分节中任何一个分节丢失的情况。本例子也说明了为什么执行主动关闭的那一端是处于TIME_WAIT状态的那一端:因为可能不得不重传最终那个ACK的就是那一端。

          为理解存在TIME_WAIT状态的第二个理由,我们假设在12.106.32.254的1500端口和206.168.112.219的21端口之间有一个TCP连接。我们关闭这个连接,过一段时间后在相同的IP地址和端口之间建立另一个连接。后一个连接称为前一个连接的化身(incarnation),因为它们的IP地址和端口号都相同。TCP必须防止来自某个连接的老的重复分组在该连接已终止后再现,从而被误解成属于同一连接的某个新的化身。为做到这一点,TCP将不给处于TIME_WAIT状态的连接发起新的化身。既然TIME_WAIT状态的持续时间是MSL的2倍,这就足以让某个方向上的分组最多存活MSL秒即被丢弃,另一个方向上的应答最多存活MSL秒也被丢弃。通过实施这个规则,我们就能保证每成功建立一个TCP连接时,来自该连接先前化身的老的重复分组都已在网络中消逝了。通熟易懂的说法:在用同样的IP和端口建立新连接的时候,必须保证之前在该ip该端口的连接的数据包已经从网络当中消失!





阅读(1349) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~