[计算机网络] TCP连接的建立和终止

说明:本文内容来源于网络,本人只对原文内容重新组织语言进行描述,进行了适当的增删

TCP的报头格式


1. 一个TCP头部需要包含出发端口(source port)目的地端口(destination port)。这些与IP头中的两个IP地址共同确定了连接。

2. 每个TCP片段都有序号(sequence number)。这些序号最终将数据部分的文本片段整理成为文本流。

3. ACK是一位(bit)。只有ACK位设定的时候,回复号(Acknowledgement number)才有效。ACK回复号说明了接收方期待接收的下一个片段,所以ACK回复号为最后接收到的片段序号加1。

很多时候,ACK回复“附着”在发送的数据片段中(捎带确认机制)。TCP协议是双向的。比如A和B两个电脑。ACK回复是接收方回复给发送方 (比如A发送给B, B回复A)。但同时,B也可以是发送方,B有可能有数据发送给A,所以B就把ACK回复附着在它要发送给A的数据片段的头部。这样可以减少ACK所占用的交通流量。一个片段可以只包含ACK回复。一个纯粹的ACK回复片段不传送文本流,所以不消耗序列号。如果有下一个正常的数据片段,它的序号将与纯粹ACK回复片段的序号相同。

(ACK回复还可以“附着”在SYN片段和FIN片段)

4. ACK后面还有SYNFIN,它们也各占据一位(bit)。我将在后面说明这两位。

5. 根据TCP协议的规定,文本流的第一个片段的SYN序号不能是确定的数字(比如说1)。连接的双方各自随机生成自己的ISN,然后再利用的一定方式让对方了解。这样的规定是出于TCP连接安全考虑:如果以一个确定的数字作为初始的TCP序号,那么其他人很容易猜出接下来的序列号,并按照正确的序号发送“伪装”的TCP片段,以插入到文本流中。

TCP的连接和终止

TCP是一个面向连接的协议。在传输数据前必须要建立连接,在停止传输数据后要终止连接释放资源。

一、TCP的连接

TCP连接是在IP网络中应用层的两个进程间的全双工逻辑回路。由节点的(IP地址,端口)唯一确定一对连接。 

特点

  • 通过一个握手进程建立起来;
  • 通过一个周期性保持进程来保持,保证两个TCP节点间处于激活状态;
  • 通过一个握手进程来终止,释放资源。
  • TCP连接可被连接中的任意一端重置。 

连接的建立

为了建立连接TCP连接双方必须从对方了解下面的信息:

  • 1.对方数据发送的开始序列号(一般为随机值);
  • 2.对方在出站管道上发送数据的缓冲区大小;
  • 3.能被接收的最大段MSS;
  • 4.被支持的TCP选项,如窗口的比例因子等;

通过3个TCP段的交换来了解这些信息,就是常说的TCP 握手的3个包。一般在客户端访问TCP服务器的时候,在客户端初始化一个TCP连接,服务器端打开一个特殊端口等待传入的请求。客户端主动发起第一个 SYN置位的包开始协商TCP连接。服务器接收后向客户端回ACK,最后客户端在向服务器回复ACK后连接建立。
下面我们用TCP连接的两个对等端A和B来详细介绍握手过程,其中发起方是A。


根据TCP传输的规则,接收到ISN的一方需要回复ACK,所以共计四片信息在建立连接过程中传输。之所以是三次握手 (而不是四次),是因为server将发送SYN回复ACK合并到一个TCP片段中。

  • 段一:SYN段
    TCP连接的发起方A向B发送第一个TCP同步段(SYN).在TCP头部的选项中会包含一些选项与对端协商。
    TCP 头部包含如下字段:
    目的端口  TCP连接对端B被动打开的TCP端口数
    源端口  TCP连接发起方A主动打开的端口,大多数是一个随机一个端口。
    序列号  SYN的序列号ISN1可以看作是一个32位的计数器,由发起方A产生,具有一定的随机性。Windows 2003和XP根据派生启动(startup-derived)、2048位的随机密钥和一个基于RC4的随机数来计算ISN,从而减少下一TCP连接的 ISN被预测的可能性。
    ACK标志  设置为0,SYN握手第一个包的ACK字段不重要,此时刚发起连接没有数据报需要确认。但后续的ACK是重要的。
    SYN标志  置1.
    窗口  设置为默认值,指示本地TCP接收缓冲区大小的初始值。
    MSS TCP选项   指示发起方A接收的最大的TCP段。
  • 段二:SYN-ACK段
    在B收到SYN包后,B将发SYN-ACK,TCP选项仅包含发起方A发送的SYN包中的的选项。
    目的端口   设置为A端口
    源端口       设置为B端口
    序列号       B产生自己的序列号ISN2。和A发送的SYN中的ISN没有关系,仅产生的方法一样。
    确认号      期望收到的对端的下一个字节ISN1+1.
    SYN标志  置1.
    ACK标志  置1,必须有此标志,除了SYN段中置0外,SYN段之后的所有报文(包括SYN-ACK和实际数据包都会带ACK的标志)。
    窗口  设置B可以接收的最大窗口值,一般根据应用程序或者操作系统默认指定。
    MSS TCP选项  设为B能接收的最大长度的TCP段; 
  • 段3:ACK段
    在TCP连接的发起方A收到SYN-ACK后,A再向B发送ACK。ACK中确认被发起方A使用的最终TCP参数,同时向B确认它该使用同样的参数。自此TCP连接建立完成。 

二、双向连接

两个应用程序同时执行主动建立TCP的连接的可能性是存在的,此时发送到SYN建立需要交换4个包,如图所示:


三、TCP的终止

TCP的连接终止需要4个包交换来完成。在两个逻辑管道上每个逻辑管道上发送方发送FIN置位的终止包,然后收到ACK后关闭该逻辑管道的连接。

我们可以看到,连接终结的过程中,连接双方也交换了四片信息(两个FIN和两个ACK)。在终结连接的过程中,TCP并没有合并FIN与ACK片段。原因是TCP连接允许单向关闭(half-close)。也就是说,TCP连接关闭了一个方向的传输,成为一个单向连接(half-duplex)。第二个箭头和第三个箭头传递必须分开,才能有空隙在开放的方向上继续传输。如果第二个箭头和第三个箭头合并在一起,那么,随着一方关闭,另一方也要被迫关闭。

第二和第三次握手之间,server可以继续单向的发送片段给client,但client不能发送数据片段给server。

在Client发送出最后的ACK回复,但该ACK可能丢失。Server如果没有收到ACK,将不断重复发送FIN片段。所以Client不能立即关闭,它必须确认Server接收到了该ACK。Client会在发送出ACK之后进入到TIME_WAIT状态。Client会设置一个计时器,等待2MSL的时间。如果在该时间内再次收到FIN,那么Client会重发ACK并再次等待2MSL。所谓的2MSL是两倍的MSL(Maximum Segment Lifetime)。MSL指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。

段1:端A的FIN+ACK

一个期望终止出站数据流的TCP对等端(A)发送一个不包含任何数据的TCP段,他具有如下特点:

  • 序列号,和发送带数据TCP段一样设置为出站数据的当前序列号,且当前序列号是最终序列号FSN1,因为马上要关闭了。
  • 确认序列号被设为TCP对等端A期望对方发送的下一个字节v。
  • 设置FIN标志,指示此逻辑管道上没有其他数据需要发送。 

段2:端B的ACK

与SYN类似,FIN包也会占用一个字节的序列空间,并且必须把它当作是一个字节数据来确认。所以B接收到A发来的FIN-ACK后必须发送一个ACK。

一旦FIN-ACK被确认,发送初始FIN-ACK端A就不能再发送数据了,这仅终止了一个逻辑管道的连接,TCP对等端B发送数据到A的逻辑管道仍然开放,B仍然可以发数据给A,同时A也能发送ACK,只是不能发送数据而已。

段3:端B的FIN+ACK

对等端A向B发送数据的逻辑管道被关闭后,如果B向A发送数据的逻辑管道仍然有数据发送,且被对等端A确认,这就是TCP半关闭状态。

之后当TCP对等端B也没有数据向A发送后,B也要向A发送FIN-ACK来关闭。

段4:端A的ACK

具有如下特点:

  • 序列号 设为出站数据的当前序列号FSN1+1
  • 确认号字段被设为比对端B发送的最终序列号多1的值FSN2+1

当来自A的ACK被B接收后,TCP连接上的B向A发送数据的逻辑管道就会被关闭,此时经过四次握手后,整个TCP连接才会被完整关闭。

四、TCP的双向终止

双方都执行主动关闭也是可能的,TCP协议也允许这样的同时关闭(simultaneous close)。双方各发送一个FIN,两个FIN经过网络传送后分别到达另一端。收到FIN后,两端发送最后的ACK。当收到最后的ACK时,关闭TCP连接。


五、TCP的连接复位(Reset)

TCP连接终止进程适用于一个TCP连接的两个管道在互相同意的情况下正常关闭。

另外一种终止TCP连接的方式是通过TCP连接复位—一个具有RST(Reset)标志的TCP段来完成。

当一个不可调和的入站TCP段的TCP头中存在参数问题时,一个TCP连接复位就会被发送。例如,不恰当的源IP地址、目的IP地址或者TCP端口号都能中断一个建立了的连接。中断的TCP连接将丢失所有的TCP数据,包括正在传送中或者在等待被发送的缓冲区中的数据,类似于强制关机。

TCP Reset也用来拒绝一个TCP连接企图,以响应对SYN段的接收。最常见的是,SYN段中目的端口与运行在SYN段接收者上的应用层进程相对应。当达到被允许的最大值时,连接企图就会被拒绝。下图显示了TCP连接复位。


TCP的状态转换

TCP连接状态和说明:

状态说明
CLOSED关闭状态,没有TCP连接
LISTEN监听状态,服务器正在等待连接进入
SYN SENT已发送连接请求(SYN段)后,等待确认
SYN RCVD收到一个连接请求(SYN段),并对应的发送一个SYN-ACK之后
ESTABLISHED连接建立,正常的双向传输数据状态。
FIN WAIT-1(主动关闭)已经发送关闭请求(FIN),等待确认。
FIN WAIT-2(主动关闭)收到对方对己方的关闭确认(ACK),等待对方关闭请求。
CLOSING双方同时尝试关闭(自己发了FIN,之后接到对方的FIN),等待对方确认
TIME WAIT完成双向关闭,等待所有分组死掉
CLOSE WAIT(被动关闭)收到对方关闭请求,已经确认。
LAST ACK(被动关闭)等待最后一个关闭确认,并等待所有分组死掉。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值