目录
一、概述
二、功能
2.1 连接管理
2.2 响应与序列号
2.3 超时重发
2.4 传输单位:段
2.5 窗口控制
2.6 流控制
2.7 拥塞控制
2.8 效率提高
三、报文格式
一、概述
TCP作为一种面向有连接的协议,只有在确认通信对端存在时才会发送数据,从而可以控制通信流量的浪费。TCP通过检验和、序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现可靠性传输。
二、功能
2.1 连接管理
TCP是面向连接的通信,其连接建立与连接断开分别被称为三次握手、四次挥手机制。
2.2 响应与序列号
TCP为每个传输的报文提供序列号以及响应机制,实现数据重复判断、缺失重发等功能,提高了数据通信的可靠性。
2.3 超时重发
TCP在每次发包时都会计算往返时间及其偏差,而超时重发时间就是比这两个值之和稍微大一些。
在BSD的Unix以及Windows系统中,超时都以0.5秒为单位进行控制,因此重发超时都是0.5秒的整数倍(偏差的最小值也是0.5秒。因此最小的重发时间至少是1秒。) 。不过,由于最初的数据包还不知道往返时间,所以其重发超时一般设置为6秒左右。
数据被重发之后若还是收不到确认应答,则进行再次发送。但是之后的等待应答时间将以2倍的方式指数增长。同时,需要注意的是重发次数并不是无限次数的,而是在达到一定重发次数之后,如果仍没有任何确认应答返回,就会判断为网络或对端主机发生了异常,强制关闭连接。并且通知应用通信异常强行终止。
2.4 传输单位:段
在建立TCP连接的同时,也可以确定发送数据包的单位,我们也可以称其为“最大消息长度”(MSS)。TCP在传送大量数据时,是以MSS的大小将数据进行分割发送。进行重发时也是以MSS为单位。
MSS是在三次握手的时候,在两端主机之间被计算得出。在建立连接时,如果某一方的MSS选项被省略,可以选为IP包的长度不超过576字节的值(IP首部20字节,TCP首部20字节,MSS 536字节)
2.5 窗口控制
TCP以1个段为单位,每发一个段进行一次确认应答的处理。这样的传输方式在包的往返时间越长通信性能就越低。为解决这个问题,TCP引入了窗口这个概念。确认应答不在以段为单位,而是选择更大的单位进行确认,从而减少网络性能的下降。该机制也成为了滑动窗口机制。
备注:
(1)窗口在一定程度上较大时,即使有少部分的确认应答丢失也不会进行数据重复。可以通过下一个确认应答进行确认。
(2)接收端在没有收到自己所期望的序列号数据时,会对之前收到的数据进行确认应答。发送端一旦收到某一个应答后,又连续3次收到同样的确认应答,则认为数据段已经丢失,需要进行重发。
2.6 流控制
TCP提供一种机制可以让发送端根据接收端的实际接收能力控制发送的数据量。这就是所谓的流控制。它的具体操作是,接收端主机向发送端主机通知自己可以接收数据的大小,于是发送端会发送不超过这个限度的数据。该大小限度就被称作窗口大小。
2.7 拥塞控制
为了避免通信开始时TCP就发送大量的数据导致网络拥塞,TCP引入慢启动机制,即定义一个拥塞窗口,在每一次发送得到确认后,发送端口会逐渐增大,以提高网络吞吐量。
2.8 效率提高
Nagle算法-发送数据条件:
- 已发送的数据都已经收到确认应答时;
- 可以发送最大段长度(MSS)的数据时;
延迟确认应答-响应条件:
- 在没有收到2×最大段长度的数据为止不做确认应答
- 其他情况下,最大延迟0.5秒发送确认应答
三、报文格式
TCP报文时面向连接的传输层协议,使用了序列号和确认号,以及三次握手、四次挥手以及重传机制,实现可靠的传输。
(1)源端口号:表示数据发送方的应用层程序
(2)目的端口号:表示数据接收方的应用层程序
(3)序列号SEQ:TCP链接中传输的数据流中每个字节都编上一个序号。序号字段的值指的是本报文段所发送的数据的第一个字节的序号。
(4)确认号ACK:是期望收到对方的下一个报文段的数据的第1个字节的序号,即上次已成功接收到的数据字节序号加1。只有ACK标识为1,此字段有效。
(5)首部长度:数据偏移,即首部长度,指出TCP报文段的数据起始处距离TCP报文段的起始处有多远,以32比特(4字节)为计算单位。最多有60字节的首部,若无选项字段,正常为20字节。
(6)保留:保留,占 6位,必须为0
(7)控制位:
- URG:表示紧急指针字段有效
- ACK:接收数据序号字段有效
- PSH:表示通过flush操作发送的数据
- RST:强制断开连接,用于异常中断的情况
- SYN:同步序号,用于建立连接过程,在连接请求中发送SYN=1和ACK=0 , 应答 SYN=1和ACK=1
- FIN:用于释放连接,为1时表示发送方已经没有数据发送了,即关闭本方数据流。
(8)窗口:TCP的流量控制,窗口起始于确认序号字段指明的值,这个值是接收端正期望接收的字节数。窗口最大为65535字节。
(9)校验和:校验字段,包括TCP首部和TCP数据
(10)紧急指针,只有当URG标志置1时紧急指针才有效。紧急指针指出在本报文段中紧急数据共有多少个字节(紧急数据放在本报文段数据的最前面)
(11)选项字段:长度不定。但必须是32bits的整倍数
(12)数据:可以不发送任何数据,TCP会在握手阶段告知对方自己的MSS(最大分段大小,常见为1460),而MSS+TCP头部(20byte)+IP头部(20byte)就得到MAC层的MTU1500字节