TCP概述及特点
TCP称为传输控制协议,是一种面向字节流的可靠的传输协议,是传输层的协议。
特点:
- TCP是面向连接的传输层协议,所谓面向连接就是需要在使用TCP协议之前先建立连接、使用完TCP协议之后再断开连接。那么如何理解连接的建立和断开呢?
- TCP是点对点的,不能一对多、多对一、多对多。
- TCP提供可靠交付的的服务。传输的数据保证无差错、不丢失、不重复、并且按需到达。
- TCP提供全双工通信。连接双方可以随时随地的相互发送数据,实现的基础是设置有接收缓冲区和发送缓冲区。
- TCP面向字节流。所谓面向字节流指的是:虽然上层的应用层协议会发送一个一个的数据报,但是在TCP这里,他会转化为一连串没有结构的字节流。当TCP根据机制判断需要上交数据的时候,就会将当前缓冲区的数据上交,但是此时并不能保证应用层需要的数据报都在这些字节流中,所以需要使用TCP协议的应用层软件具有识别字节流的能力。
TCP报头
因为TCP要保证可靠性,所以TCP的报头会比较复杂,实现的功能也比较多。
下面简单介绍一下报头各个字段的作用。
- 源端口号和目的端口号指定了发送端的进程和接收端的进程
- 序号和确认序号,字节流中每一个字节都标上了序号,确认序号用来告诉对端在当前序号之前、包括当前序号的字节流我都接收了,接下来请从下一个序号开始给我发送。序号的范围是0~2^32-1,如果到头了从0开始循环,这里可以表示4G的数据,旧序号的数据早已经到达了对端了。其中序号不是固定从零开始的,是有一个随机初始值ISN,连接的时候,从ISN开始。当进行三次握手建立连接的时候,一个很重要的活动就是确定ISN。比如:发送端发送了一个报文,包含的数据是:”Linux”;如果第一个序号给的是100,那么’x’对应的序号是104,’\0’对应序号是105。当接收端接收到这些字符之后,给发送端回一个报文的时候,他的确认序号就是:106,接收端希望发送端发送序号为106及其后面的报文。这个是全双工和可靠性的基础。
- 4位首部长度,首部长度指的是TCP报头的长度,他的单位是4字节。比如首部长度是:0101,那么指的是报头长度为20字节,这里代表了该TCP报头没有选项这个字段。所以通过计算得知,TCP报头最长是60个字节,出去选项字段之前的固定20字节,选项有40字节的扩展空间,但是一般选项默认没有。
- 保留6位,没有使用
- URG、ACK、PSH、RST、SYN、FIN六位标志位。
- URG标志位:URG=1表示将紧急指针有效,它告诉系统,这个报文里面有紧急数据,让这些数据优先到达,而不用按顺序。该标志位与16位紧急指针搭配使用。比如使用Ctrl+C中断程序的时候。
- ACK标志位:ACK=1表示该报文是确认报文,用于对请求的确认。一般来说在建立之后的所以报文的ACK都为1,同时确认报文也会捎带数据用于交换。
- PSH标志位:PSH=1表示提醒接收端,让它把接收缓冲区的数据快速取走,而不是等到缓冲区满的时候才读取。
- RST标志位:RST=1表示复位报文。当发送端以为连接已经建立,而接收端认为连接未建立的时候。如果发送端给接收端发送数据,发送端会回一个RST=1的报文,这样发送端知道连接无效,于是断开重新请求连接。同时还可以用在拒绝打开一个链接的时候,接收端给发送端发送一个复位报文。
- SYN标志位:SYN=1表示这是一个请求连接的报文,如果SYN=1,ACK=0,表示请求连接,而SYN=1,ACK=1,表示现在处于TCP建立连接的时候。
- FIN标志位:FIN=1表示这是一个请求连接断开的报文,用在TCP断开连接的时候。
- 16位窗口大小,窗口指的是接收端接收缓冲区的剩余大小,TCP可以通过窗口大小来协调发送端的发送能力。
- 16位校验和,发送端填充,使用CRC校验,接收端校验失败,表示数据报有问题。这里校验包括了TCP报头和数据。
- 16位紧急指针,当URG=1的时候有效,用于指向紧急数据的位置。就算接收端窗口为0,也可以接收紧急指针指向的数据。
- 最大40位选项:一般不使用,其中比较常用的有:MSS(数据字段的最大长度)选项,MSS应该尽量大,只要在ip层没有进行分片就好,这样的开销是最小的,在以太网中MSS是1500字节-40字节=1460字节,该选项只有在创建连接的过程中有效; 窗口扩大选项,窗口最大是2^16-1,通过这个选项可以增大,该选项只有在创建连接的过程中有效;时间戳值选项,用两个功能。第一个:因为序号是循环使用的,如果当速率很大的时候,会出现序号重复使用的情况,我们就可以通过时间戳将新旧报文段分开;第二个功能:计算往返时间RRT,发送的时候将时间放入,返回的时候带回来,这样就可以计算出往返的时间了。
理解TCP的连接管理机制
通常我们说三次握手、四次挥手,这里指的是TCP创建连接和断开连接的情况。
连接管理全图
连接
链接的工作
TCP连接的建立采用客户端服务器模式(C/S),其中主动发起请求连接的一端叫做客户端,被动等待连接的一端叫做服务端。连接的时候主要用于完成一下三件工作:
- 保证双方都可以确认对方的存在。
- 双方协商一些参数(MSS值、是否使用选项中的窗口扩大选项、时间戳选项等),其中MSS值以双方的较小值为准。见下图:
- 给传输实体进行资源分配。因为维护链接需要使用到TCB传输控制模块,所以要进行资源分配,这里有时间和内存的消耗。
双方协商MSS:
三次握手
三次握手的具体情况如图: