一、TCP概念
TCP(Transmission Control Protocol 传输控制协议)是面向连接的、可靠的、基于字节流的传输层通信协议的传输层协议。
首先来看看OSI的七层模型:
在OSI七层模型中,每一层的作用和对应的协议如下:
功能 | TCP/IP协议族 | |
应用层 | 为计算机用户提供服务 | HTTP,TFTP,DNS等 |
表示层 | 数据处理(编解码、加密解密,压缩解压缩) | 无 |
会话层 | 管理应用程序之间的会话 | 无 |
传输层 | 提供通用的数据传输服务 | TCP,UDP |
网络层 | 路由和寻址 | IP,ICMP等 |
数据链路层 | 传输有地址的帧和错误监测能力 | SLIP,PPP等 |
物理层 | 以二进制形式在物理媒介上传输数据 | ISO2110,IEEE802等 |
二、TCP报文格式
TCP协议是封装在IP数据包中,TCP报文数据格式如下图:
TCP报文是传输层的数据单元,也叫报文段,下面分别对其中的字段进行介绍:
(1)源端口和目的端口:各占2字节
这两个值加上IP首部中的源端IP地址和目的端IP地址唯一确定一个TCP连接;有时一个IP地址和一个端口号也称为socket(插口)。
(2)序号(seq):占4字节
序号是本报文段发送的数据组的第一个字节的序号。在TCP传送的流中,每一个字节一个序号。例如:个报文段的序号为300,此报文段数据部分共有100字节,则下一个报文段的序号为400。
(3)确认序号(ACK):占4字节
是期望收到对方下次发送的数据的第一个字节的序号,也就是期望收到的下一个报文段的首部中的序号;确认序号应该是上次已成功收到数据字节序号+1。
(4)数据偏移:占4比特
表示数据开始的地方离TCP段的起始处有多远,实际上就是TCP段首部的长度;由于首部长度不固定,因此数据偏移字段是必要的;数据偏移以32位为长度单位,也就是4个字节,因此TCP首部的最大长度是60个字节,即偏移最大为15个长度单位=1532位=154字节。
(5)保留:占6比特
为将来定义新的用途保留,现在一般置0。
(6)6个标志位比特
- URG:当URG=1时,注解此报文应尽快传送,而不要按本来的列队次序来传送。与“紧急指针”字段共同应用,紧急指针指出在本报文段中的紧急数据的最后一个字节的序号,使接管方可以知道紧急数据共有多长;
- ACK:只有当ACK=1时,确认序号字段才有效;
- PSH:当PSH=1时,接收方应该尽快将本报文段立即传送给其应用层;
- RST:当RST=1时,表示出现连接错误,必须释放连接,然后再重建传输连接。复位比特还用来拒绝一个不法的报文段或拒绝打开一个连接;
- SYN:同步序号,用于建立连接过程,当SYN=1,ACK=0时表示请求建立一个连接,携带SYN标志的TCP报文段为同步报文段;
- FIN:finish标志,用于释放连接,为1时表示发送方已经没有数据发送了,即关闭本方数据流。
(7)窗口
TCP通过滑动窗口的概念来进行流量控制。设想在发送端发送数据的速度很快而接收端接收速度却很慢的情况下,为了保证数据不丢失,显然需要进行流量控制, 协调好通信双方的工作节奏;滑动窗口可以理解成接收端所能提供的缓冲区大小,TCP利用一个滑动的窗口来告诉发送端对它所发送的数据能提供多大的缓冲区;窗口大小为字节数起始于确认序号字段指明的值(这个值是接收端正期望接收的字节);窗口大小是一个16bit字段,因而窗口大小最大为65535字节。
(8)校验和
检验和覆盖了整个TCP报文段:TCP首部和数据。这是一个强制性的字段,一定是由发端计算和存储,并由收端进行验证。
(9)紧急指针
只有当 URG 标志置 1 时紧急指针才有效。紧急指针是一个正的偏移量,和顺序号字段中的值相加表示紧急数据最后一个字节的序号。;TCP 的紧急方式是发送端向另一端发送紧急数据的一种方式。
(10)选项和填充
最常见的可选字段是最长报文大小,又称为MSS(Maximum Segment Size),每个连接方通常都在通信的第一个报文段(为建立连接而设置SYN标志为1的那个段)中指明这个选项,它表示本端所能接受的最大报文段的长度;选项长度不一定是32位的整数倍,所以要加填充位,即在这个字段中加入额外的零,以保证TCP头是32的整数倍。
(11)数据部分
TCP 报文段中的数据部分是可选的。在一个连接建立和一个连接终止时,双方交换的报文段仅有 TCP 首部;如果一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据。在处理超时的许多情况中,也会发送不带任何数据的报文段。