传输层在TCP/IP协议中包含两种协议,分别为UDP和TCP协议,用户数据报协议上节内容已经介绍,本节将详细介绍传输控制协议(TCP,Transmission Control Protocol)。
1. 传输控制协议
传输控制协议(TCP)是IP层的上层协议,在IP的协议的字段为6。
TCP协议与UDP异同点
- TCP是建立连接的控制传输,而UDP非连接的传输
- TCP是一对一的控制传输,UDP可以为一对一传输,也可以一对多传输
- TCP是可靠传输,UDP是非可靠传输
TCP报文字段
TCP报文头字段如图1所示,

图1 TCP 报头字段
- 源端口(Source port),16位源端口,对应发送主机的应用程序。
- 目的端口(Destination port),16位目的端口号,对应接收主机的应用程序。
- 序号:Seq序列号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记,初始的序列号可以为随机数(一般设为0)。具有双重作用:
如果 SYN 标志设置为 1,则这是初始序列号。 实际第一个数据字节的序列号和相应 ACK 中的确认号就是这个序列号加 1。
如果 SYN 标志清零 0,则这是当前session的segment的第一个数据字节的累积序列号。 - 确认序号:Ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,Ack = Seq + 1。
- 数据偏移:指出TCP头部数据长度(32-bit),也是数据部分(payload)的偏移。最小值是5,最大值是15。
- 标志位:共9个,即NS、CWR、ECE、URG、ACK、PSH、RST、SYN、FIN等,具体含义如下:
- NS:ECN(Explicit Congestion Notification,显式拥塞通知)随机数隐蔽保护(目前在实验阶段)。
- CWR:发送主机设置CWR(Congestion Window Reduced,拥塞窗口减少 )标志来说明它收到一个设置了 ECE 标志的 TCP 段,并已在拥塞控制机制中作出响应。
- ECE:Echo 具有双重作用,具体取决于 SYN 标志的值:
如果 SYN 标志设置为 1,则 TCP 对等体具有 ECN(Explicit Congestion Notification,显式拥塞通知)的能力。
如果 SYN 标志清零 0,则在正常传输期间接收到 IP 包头中设置了拥塞经历过的标志 (ECN=2’b11)的数据包。 这可作为TCP 发送方网络拥塞(或即将发生拥塞)的指示 。 - URG:紧急指针(urgent pointer)有效。
- ACK:确认序号有效。只有该位设置为1,确认序列号才有效。
- PSH:接收方应该尽快将这个报文交给应用层。
- RST:复位并重置连接。
- SYN:同步序列号,只有发起一个新连接时有效。
- FIN:最后一包并释放一个连接。
- 窗口尺寸(window size),设置TCP接收内存的大小,服务器与客户机可以设置不同的值,一般在建立连接时双方都会通知对方窗口尺寸的大小。

图2
滑动窗口
滑动窗口是指TCP发送程序,对内存的控制,线性增长,指数衰减。如图3所示

图3-1 TCP滑动窗口示意图

图3-2 TCP滑动窗口示意图
以64K window size 为例,初始发送16K byte数据,随后每次按1K增长,如果有没有确认或丢失的包超时,将会把滑动窗口尺寸减半。如果发送端实体在合理的往返时延(RTT,Round Trip Time)内未收到确认,那么对应的数据(假设丢失了)将会被重传。
TCP的checksum计算
TCP的checksum计算首先也要建立伪IP包头,如图4所示,细节参照UDP伪包头的构建方式

图4 TCP checksum计算示意图
2. TCP链接及终止过程:
- 建立过程(3次握手)
- Server 端,准备 IP与TCP端口绑定
- 客户端发送SYN请求
- Server端应答SYN,并同时发送SYN
- 客户端 应答,至此建立链接完成
- 数据通信
- 中止过程(4次握手)
- 客户端发出FIN请求
- Server应答(ACK)客户端的FIN请求
- Server发出FIN请求
- 客户端应答Server端的FIN请求,断开链接。
- 如果在超时时间内没有收到应答,Server 即会自动断开链接

图5 TCP建立及中止链接
- SYN,ACK,Seq之间的关系如图6。

图6-1

图6-2
3. 数据传输:
- 数据分片:在发送端对用户数据进行分片,在接收端进行重组,由TCP确定分片的大小并控制分片和重组;
- 到达确认:接收端接收到分片数据时,根据分片数据序号向发送端发送一个确认;
- 超时重发:发送方在发送分片时启动超时定时器,如果在定时器超时之后没有收到相应的确认,重发分片;
- 滑动窗口:TCP连接每一方的接收缓冲空间大小都固定,接收端只允许另一端发送接收端缓冲区所能接纳的数据,TCP在滑动窗口的基础上提供流量控制,防止较快主机致使较慢主机的缓冲区溢出;
- 失序处理:作为IP数据报来传输的TCP分片到达时可能会失序,TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层;
- 重复处理:作为IP数据报来传输的TCP分片会发生重复,TCP的接收端必须丢弃重复的数据;
- 数据校验:TCP将保持它首部和数据的检验和,这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到分片的检验和有差错,TCP将丢弃这个分片,并不确认收到此报文段导致对端超时并重发。