前言
在上一节中,我们介绍了 UDP (用户数据报) 的相关知识,在这一节中我们将继续介绍传输层中另一种更为重要的协议。
一、什么是TCP协议?
1.1 TCP 基本概念
TCP协议全称:传输控制协议(TCP,Transmission Control Protocol),它是是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793 [1] 定义。TCP通信一般指客户端和服务端通信。
在Java中,一般使用SocketServer和Socket这两个类实现TCP通信,前者为服务端的一个实体,而后者可以认为是一种对连接的封装。一般来说,需要先启动服务端,然后客户端才能向服务端发送连接请求,连接成功后,两端就可以互相通信了。
1.2 TCP协议段格式
源端口(source port ) 和 目的端口(destination port)
它们的长度都为 16 位,分别表示报文 发送方 的端口号 和 接收方 的端口号。
序号
序号( sequence number )字段,长度为 32 位,表示数据首字节的序号。在三次握手阶段,SYN 指令也是通过该字段,将本端选定的 起始序号 告诉接收方。
确认号
确认号 ( acknowledgement number )字段,长度为 32 位。它表示已确认收到的数据序号,它的值为:已收到数据最后一个字节的序号加一,即接收方期望进一步接收的数据序号。
首部长度
首部长度 ( header length )字段,长度为 4 位,表示 TCP 报文首部的长度,也可称为 数据偏移 ( data offset )。跟 IP 协议一样,TCP 首部长度字段也不是以字节为单位,而是以 32 位字(4字节)为单位。
字( word )是计算机领域中的一个概念,表示由一系列比特组成的数据单位。字的长度可长可短,常见的有 8 位字、16 位字以及 32 位字等等。
这个字段长度为 4 位,最大值为 2 4 − 1 = 15 {{2}^{4}}-1=15 24−1=15 。因此,TCP 头部最大长度只能达到 4 × 15 = 60 4\times 15=60 4×15=60 字节。
6位标志位
- URG:紧急指针是否有效;
- ACK:确认号是否有效;
- PSH:提示接收端应用程序立刻从TCP缓冲区把数据读走;
- RST:对方要求重新建立连接;我们把携带RST标识的称为复位报文段;
- SYN:请求建立连接;我们把携带SYN标识的称为同步报文段。
- FIN:通知对方,本端要关闭了,我们称携带FIN标识的为结束报文段。
窗口大小
窗口大小( window size )字段长度为 16 位,表示当前报文发送者接收窗口的大小,单位一般是 字节 。接收窗口表示接收方还能接收的数据大小,用于实现 TCP 流量控制机制。
校验和
校验和( checksum )发送端填充,CRC校验。接收端校验不通过,则认为数据有问题。此处的检验和不光包含TCP首部,也包含TCP数据部分。除此之外,TCP 还会在报文段前面拼接一个 IP 伪头部,同时参与校验和计算。
16位紧急指针
标识哪部分数据是紧急数据;
二、TCP原理
TCP对数据提供的管控机制,主要体现在两个方面:安全和效率。这些机制和多线程的设计原则类似:保证数据传输安全的前提下,尽可能的提高传输效率。
1. 确认应答机制(安全机制)
TCP将每个字节的数据都进行了编号。即为序列号。
每一个ACK都带有对应的确认序列号,意思是告诉发送者,我已经收到了哪些数据;下一次你从哪里开始发。
2.2 超时重传机制(安全机制)
主机A发送数据给B之后,可能因为网络拥堵等原因,数据无法到达主机B;
如果主机A在一个特定时间间隔内没有收到B发来的确认应答,就会进行重发。
但是,主机A未收到B发来的确认应答,也可能是因为ACK丢失了;
因此主机B会收到很多重复数据。那么TCP协议需要能够识别出那些包是重复的包,并且把重复的丢弃掉。这时候我们可以利用前面提到的序列号,就可以很容易做到去重的效果。
那么,如果超时的时间如何确定?
- 最理想的情况下,找到一个最小的时间,保证 “确认应答一定能在这个时间内返回”;
- 但是这个时间的长短,随着网络环境的不同,是有差异的;
- 如果超时时间设的太长,会影响整体的重传效率;
- 如果超时时间设的太短,有可能会频繁发送重复的包。
TCP为了保证无论在任何环境下都能比较高性能的通信,因此会动态计算这个最大超时时间。
- Linux中(BSD Unix和Windows也是如此),超时以500ms为一个单位进行控制,每次判定
超时重发的超时时间都是500ms的整数倍; - 如果重发一次之后,仍然得不到应答,等待 2*500ms 后再进行重传;
- 如果仍然得不到应答,等待 4*500ms 进行重传。依次类推,以指数形式递增;
- 累计到一定的重传次数,TCP认为网络或者对端主机出现异常,强制关闭连接。
2.3 连接管理机制(安全机制)
在正常情况下,TCP要经过三次握手建立连接,四次挥手断开连接
三次握手
握手过程可以简化为下面的四次交互:
- clien 端首先发送一个 SYN 包告诉 Server 端我的初始序列号是 X;
- Server 端收到 SYN 包后回复给 client 一个 ACK 确认包,告诉 client 说我收到了;
- 接着 Server 端也需要告诉 client 端自己的初始序列号,于是 Server 也发送一个 SYN 包告诉 client 我的初始序列号是Y;
- Client 收到后,回复 Server 一个 ACK 确认包说我知道了。
总结
以上就是今天要讲的内容,本文仅仅简单介绍了传输控制协议(TCP)的相关概念,基本报文格式。此外,还介绍了TCP原理,包括确认应答机制,超时重传机制,并且还简单介绍了连接管理机制中的三次握手,在本栏的下一节我们将会继续介绍TCP原理。