赞
踩
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后面还有SYN和FIN,它们也各占据一位(bit)。我将在后面说明这两位。
5. 根据TCP协议的规定,文本流的第一个片段的SYN序号不能是确定的数字(比如说1)。连接的双方各自随机生成自己的ISN,然后再利用的一定方式让对方了解。这样的规定是出于TCP连接安全考虑:如果以一个确定的数字作为初始的TCP序号,那么其他人很容易猜出接下来的序列号,并按照正确的序号发送“伪装”的TCP片段,以插入到文本流中。
TCP是一个面向连接的协议。在传输数据前必须要建立连接,在停止传输数据后要终止连接释放资源。
一、TCP的连接
TCP连接是在IP网络中应用层的两个进程间的全双工逻辑回路。由节点的(IP地址,端口)唯一确定一对连接。
特点
连接的建立
为了建立连接TCP连接双方必须从对方了解下面的信息:
通过3个TCP段的交换来了解这些信息,就是常说的TCP 握手的3个包。一般在客户端访问TCP服务器的时候,在客户端初始化一个TCP连接,服务器端打开一个特殊端口等待传入的请求。客户端主动发起第一个 SYN置位的包开始协商TCP连接。服务器接收后向客户端回ACK,最后客户端在向服务器回复ACK后连接建立。
下面我们用TCP连接的两个对等端A和B来详细介绍握手过程,其中发起方是A。
根据TCP传输的规则,接收到ISN的一方需要回复ACK,所以共计四片信息在建立连接过程中传输。之所以是三次握手 (而不是四次),是因为server将发送SYN和回复ACK合并到一个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连接。
一个期望终止出站数据流的TCP对等端(A)发送一个不包含任何数据的TCP段,他具有如下特点:
与SYN类似,FIN包也会占用一个字节的序列空间,并且必须把它当作是一个字节数据来确认。所以B接收到A发来的FIN-ACK后必须发送一个ACK。
一旦FIN-ACK被确认,发送初始FIN-ACK端A就不能再发送数据了,这仅终止了一个逻辑管道的连接,TCP对等端B发送数据到A的逻辑管道仍然开放,B仍然可以发数据给A,同时A也能发送ACK,只是不能发送数据而已。
对等端A向B发送数据的逻辑管道被关闭后,如果B向A发送数据的逻辑管道仍然有数据发送,且被对等端A确认,这就是TCP半关闭状态。
之后当TCP对等端B也没有数据向A发送后,B也要向A发送FIN-ACK来关闭。
具有如下特点:
当来自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连接状态和说明:
状态 | 说明 |
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 | (被动关闭)等待最后一个关闭确认,并等待所有分组死掉。 |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。