TCP连接
TCP连接是在IP网络中两个进程间(应用层协议)的双向、全双工的逻辑回路。由节点的IP地址和端口将连接双方对应起来。
TCP连接的建立可以简单的称为三次握手,而连接的中止则可以叫做四次握手。
TCP连接建立
通过3个TCP段的交换来了解这些信息,就是常说的TCP 握手的3个包。一般在客户端访问TCP服务器的时候,在客户端初始化一个TCP连接,服务器端打开一个特殊端口等待传入的请求。客户端主动发起第一个 SYN置位的包开始协商TCP连接。服务器接收后向客户端回ACK,最后客户端在向服务器回复ACK后连接建立。
下面我们用TCP连接的两个对等端A和B来详细介绍握手过程,其中发起方是A。
段一:同步(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被预测的可能性。
* 确认号 设置为SYN握手第一个包的ACK字段不重要,此时刚发起连接没有数据报需要确认。但后续的ACK是重要的。
* SYN标志 置1.
* 窗口 设置为默认值,指示本地TCP接收缓冲区大小的初始值。
* MSS TCP选项中的MSS 指示发起方A接收的最大的TCP段。
* 选择性确认(SACK) –TCP选项 如果包含这个字段,可以指示发起方A 的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段;
* SACK-许可 如果A发送的SYN包含此选项时才使用此选项,表示B的TCP能接收和解释SACK选项。
* 窗口缩放选项 如果SYN包含,此时才会包含
段3:ACK段
在TCP连接的发起方A收到SYN-ACK后,A再向B发送ACK。ACK中确认被发起方A使用的最终TCP参数,同时向B确认它该使用同样的参数。自此TCP连接建立完成。
TCP连接终止
TCP的连接终止需要4个包交换来完成。在两个逻辑管道上每个逻辑管道上发送方发送FIN置位的终止包,然后收到ACK后关闭该逻辑管道的连接。
段1:来自TCP对等端A的FIN-ACK
一个期望终止出站数据流的TCP对等端(A)发送一个不包含任何数据的TCP段,他具有如下特点:
* 序列号,和发送带数据TCP段一样设置为出站数据的当前序列号,且当前序列号是最终序列号FSN1,因为马上要关闭了。
* 确认序列号 被设为TCP对等端A期望对方发送的下一个字节。对应TCP对等端B当前序列号CSN2。
* 设置ACK标志
* 设置FIN标志,指示此逻辑管道上没有其他数据需要发送。
段2:来自TCP对等端B的ACK
与SYN类似,FIN包也会占用一个字节的序列空间,并且必须把它当作是一个字节数据来确认。所以B接收到FIN-ACK后必须发送一个ACK,具有如下特点:
* 序列号 设为出站数据的当前序列号CSN2
* 确认号字段被设为比对端A发送的最终序列号多1的值FSN1+1.
* 设置ACK标志。
一旦FIN-ACK被确认,发送初始FIN-ACK端A就不能再发送数据了,