TCP/IP之十:TCP连接的建立与终止
2016-09-07 10:03
639 查看
TCP是传输层的重量级成员,也是整个TCP/IP协议栈的重要组成部分,也正因为这点,协议栈的名字里面才有TCP这样的字样。TCP是端到端的通信协议,它向上层应用提供了可靠的,面向连接的服务,为了实现这样的服务,TCP采用了许多其它协议不曾用到的机制,比如序列号、滑动窗口、超时重传、慢启动等等,同步、流量控制等议题在TCP中体现得淋漓尽致。
为了分析TCP的运行机制,我们先来看看TCP的首部结构:
(1)前面四个字节和UDP类似仍然是源端口号和目的端口号;
Sequence Number:序列号,用于通信双方的同步,TCP在概念上给每个被传输的字节都编号,序列号字段存储了该分节中数据字段第一个字节的编号;
Acknowledgment Number:确认序号,TCP对通信双方发送的分节都确认(ack分节没有确认),确认是通过确认序号来完成的,确认序号字段存储的是发送方期望收到的下一个字节的编号;
Data offset: 数据偏移量,有的资料称之为首部长度,其实表达的是同一个概念,这个字段占了4位,并且以4字节为单位,所以和IP首部中的首部长度字段是一样的,它的最大值为15,说明TCP首部最长可以为60字节(20字节固定长度+最多40字节的选项字段);接下来是6位的保留字段;接着是6位标志比特,具体的标志我们在(2)中阐述;window字段用以告诉对方本地可以接收的数据编号范围;
Checksum:该校验和的计算和UDP首部中的校验和计算方法完全一样;
Urgent Pointer:紧急指针,我们在后面会详述这个字段;
接着是Options选项字段,最常见的选项是用以说明MSS;当TCP首部长度不是4字节的整数倍时需要进行填充。
(2)6位标志字段:
URG:紧急指针位,该位为1,紧急指针字段才有效;
ACK:确认位,该位为1,确认序号才有效;
PSH:用以告知接收方尽快将数据提交给应用程序;
RST:复位标志,后面会讲TCP什么时候发送这个标志;
SYN:同步位,建立连接的时候用,用于同步双方的序号;
FIN: 撤销连接的使用用,用以告诉对方,主机不再往对端发送数据。
(3)TCP首部的Options:
选项格式有以下两种(第二种格式中的长度包含从选项类型到数据的总长度):
在RFC793中第一的选项只有三种,要求每一种TCP实现都必须支持。
0用于表示选项结束;1用于填充使每个选项为4字节的倍数(对于为什么要填充不是很明白?另外,不是每个TCP实现都会这么做);而MSS格式如下:
最新的TCP实现往往还支持时间戳选项和窗口扩大因子选项等一些其它选项。(详情可参考RFC1323)
TCP连接的建立与释放
TCP正常连接建立与释放的过程如上图所示,连接时需要三次握手,释放时需要四次握手。
三次握手过程:
(1)客户端发送设置了SYN位的分节,序号字段为J,并且一般会通告MSS;
(2)服务器端接收到客户端的请求,立马做出确认,并且通告本地的序号和MSS;
(3)客户端确认,服务器端接收到确认,至此,连接建立。
四次握手过程:
(1)客户端执行主动关闭,发送带有FIN标志的分节,说明客户端不会再往这个连接写数据;
(2)服务器端确认这个FIN分节;(此时如果服务器不发送FIN,则连接处理半关闭状态)
(3)服务器也发送FIN,说明服务器端也不发送数据了;
(4)最后客户端也需要再做最后的确认。
同时打开:
同时关闭:
上面所述的正常连接建立和关闭,以及同时关闭和同时打开,囊括了TCP的所有状态,也说明了其状态转换过程。关于TCP的各种状态,最需要说明的是TIME_WAIT状态。
TIME_WAIT状态发生在连接释放时,己方发送完最后的ACK。该状态又称为2MSL(maximum segment lifetime)等待状态,意思是这个状态会持续2MSL的时间,之所以需要这样一个持续时间主要有两个原因:一是确保最后的ACK在丢失时能够重发;二是保证本连接中的数据包不会被将来新建的这个连接的副本接收(虽然出错的概率比较小 )。
最后说明两点:
(1)上面有提到MSS,这个MSS主要是为了避免IP分片的,MSS的计算到分析源码的时候我们再详细阐述;
(2)2MSL又是如何计算的呢?分节的MSL生存时间又是怎么实现的呢?
为了分析TCP的运行机制,我们先来看看TCP的首部结构:
(1)前面四个字节和UDP类似仍然是源端口号和目的端口号;
Sequence Number:序列号,用于通信双方的同步,TCP在概念上给每个被传输的字节都编号,序列号字段存储了该分节中数据字段第一个字节的编号;
Acknowledgment Number:确认序号,TCP对通信双方发送的分节都确认(ack分节没有确认),确认是通过确认序号来完成的,确认序号字段存储的是发送方期望收到的下一个字节的编号;
Data offset: 数据偏移量,有的资料称之为首部长度,其实表达的是同一个概念,这个字段占了4位,并且以4字节为单位,所以和IP首部中的首部长度字段是一样的,它的最大值为15,说明TCP首部最长可以为60字节(20字节固定长度+最多40字节的选项字段);接下来是6位的保留字段;接着是6位标志比特,具体的标志我们在(2)中阐述;window字段用以告诉对方本地可以接收的数据编号范围;
Checksum:该校验和的计算和UDP首部中的校验和计算方法完全一样;
Urgent Pointer:紧急指针,我们在后面会详述这个字段;
接着是Options选项字段,最常见的选项是用以说明MSS;当TCP首部长度不是4字节的整数倍时需要进行填充。
(2)6位标志字段:
URG:紧急指针位,该位为1,紧急指针字段才有效;
ACK:确认位,该位为1,确认序号才有效;
PSH:用以告知接收方尽快将数据提交给应用程序;
RST:复位标志,后面会讲TCP什么时候发送这个标志;
SYN:同步位,建立连接的时候用,用于同步双方的序号;
FIN: 撤销连接的使用用,用以告诉对方,主机不再往对端发送数据。
(3)TCP首部的Options:
选项格式有以下两种(第二种格式中的长度包含从选项类型到数据的总长度):
选项类型 |
选项类型 | 选项长度 | 选项数据 |
0用于表示选项结束;1用于填充使每个选项为4字节的倍数(对于为什么要填充不是很明白?另外,不是每个TCP实现都会这么做);而MSS格式如下:
最新的TCP实现往往还支持时间戳选项和窗口扩大因子选项等一些其它选项。(详情可参考RFC1323)
TCP连接的建立与释放
TCP正常连接建立与释放的过程如上图所示,连接时需要三次握手,释放时需要四次握手。
三次握手过程:
(1)客户端发送设置了SYN位的分节,序号字段为J,并且一般会通告MSS;
(2)服务器端接收到客户端的请求,立马做出确认,并且通告本地的序号和MSS;
(3)客户端确认,服务器端接收到确认,至此,连接建立。
四次握手过程:
(1)客户端执行主动关闭,发送带有FIN标志的分节,说明客户端不会再往这个连接写数据;
(2)服务器端确认这个FIN分节;(此时如果服务器不发送FIN,则连接处理半关闭状态)
(3)服务器也发送FIN,说明服务器端也不发送数据了;
(4)最后客户端也需要再做最后的确认。
同时打开:
同时关闭:
上面所述的正常连接建立和关闭,以及同时关闭和同时打开,囊括了TCP的所有状态,也说明了其状态转换过程。关于TCP的各种状态,最需要说明的是TIME_WAIT状态。
TIME_WAIT状态发生在连接释放时,己方发送完最后的ACK。该状态又称为2MSL(maximum segment lifetime)等待状态,意思是这个状态会持续2MSL的时间,之所以需要这样一个持续时间主要有两个原因:一是确保最后的ACK在丢失时能够重发;二是保证本连接中的数据包不会被将来新建的这个连接的副本接收(虽然出错的概率比较小 )。
最后说明两点:
(1)上面有提到MSS,这个MSS主要是为了避免IP分片的,MSS的计算到分析源码的时候我们再详细阐述;
(2)2MSL又是如何计算的呢?分节的MSL生存时间又是怎么实现的呢?
相关文章推荐
- TCP/IP之十:TCP连接的建立与终止
- TCP-IP详解卷1-18:TCP连接的建立与终止
- TCP/IP学习(三)TCP连接的建立与终止
- TCP/IP 详解卷一学习笔记(四):TCP 连接建立与终止
- [TCP/IP]TCP连接的建立和终止
- TCP/IP 第18章 tcp连接建立和终止
- TCP/IP建立连接与终止连接
- TCP/IP的三次握手连接和四次握手关闭【问题:为什么建立连接协议是三次握手,而关闭连接却是四次握手?】
- TCP连接的建立和终止
- 看段有趣的故事,理解TCP/IP的TCP连接建立与关闭
- TCP/IP连接的建立
- 服务器和客户机通过TCP/IP三次握手建立一个连接
- TCP/IP的三次握手建立连接
- CLisp 5:用Socket包建立TCP/IP连接
- TCP连接的 建立和终止 (TCP MM 和 GG的 初识的三 和 分手的四)
- 详解tcp/ip连接建立与释放
- TCP连接建立和终止
- 客户端需要建立和管理多个TCP/IP连接
- UNIX 网络编程学习(一) TCP连接的建立和终止
- TCP/IP 建立连接的过程(3-way shake)