TCP 的特点:
-
面向连接的传输服务
-
支持字节流传输:
应用程序与 TCP 每次交互的数据长度可能都不相同,但 TCP 将应用程序提交的数据看作时一连串的、无结构的字节流,同时在发送方与接收方都维护一个缓存。发送方将几个写操作合并成一个报文段,提交给IP协议封装成IP分组后发送。接收方将接受的字节存储在接收缓存中,由应用程序的读操作取出。 -
支持全双工服务:
通信双方的应用程序在任何时候都可以发送数据。通信双方都有发送缓冲区与接收缓冲区,应用程序将要发送的数据字节提交给发送缓冲区,并在合适的时候从接收缓冲区读取数据,至于实际的发送接收过程则由 TCP 协议控制。 -
支持同时建立多个并发连接:
TCP 支持同时建立多个连接,即在一台主机的多个端口可以建立多个 TCP 连接。(同一个端口上的 TCP 连接可以被表示为多个全连接的五元组) -
可靠传输:
TCP 能够对发送与接收的自己进行跟踪、确认与重传。
一、TCP报文格式
1.报头格式
- 发送序号:指出报文段中的数据在发送方字节流中的位置。
TCP 为发送字节流中每个字节按顺序编号,连接建立时,通信双方都随机产生一个初始序号(ISN),且双方的序号是不同的
- 确认序号:指出接收方希望下一次接收的字节序号。
确认序号表示接收方已正确接收了序号 N 及之前的字节,要求发送方发送序号为 N+1 的字节的报文段。
-
报头长度:4位,以 字节 为单位记录TCP报头的长度。由于 TCP 报头的长度为 20~60 字节,故该字段的值为5~15。
-
保留字段:留作今后使用
-
控制字段:控制字段定义了6种不同的控制位
标志 | 说明 |
---|---|
SYN | |
ACK | 只有当ACK=1时,确认序号字段才有意义 |
FIN | 终止连接。FIN=1时,表明请求释放连接 |
RST | 复位字段。要求立即关闭连接 |
URG | 此报文为紧急数据,应优先发送,需配合紧急指针使用 |
PSH | 将数据向前推,当 PSH=1 时,请求接收方 TCP 尽快将该报文推给应用程序 |
-
窗口字段:以 字节 为单位,表示要求对方必须维持的窗口大小
-
紧急指针:只有当紧急标志=1时才有效,其值表示本报文段中的紧急数据的最后一个字节的编号
-
选项:TCP 报头可以有长达 40 字节的选项字段
-
校验和:TCP 校验和的计算过程与 UDP 相同。但在 UDP 中校验和为可选,而在 TCP 中是必需的。TCP 校验和同样需要伪报头,不同的是协议字段的值为 6
TCP报文头的长度为 20~60 字节(具体的长度取决于选项字段)。
2.TCP最大段长度 MSS
TCP 协议对报文数据的最大长度的限定称为最大段长度(MSS)。MSS 是指报文中数据的最大字节数限定,不包含报头长度,且 TCP 最终发送的报文数据长度由 窗口大小 与 MSS共同决定。
MSS的选取一般会综合考虑:① 协议开销 ② 发送与接收方缓冲区的限制
二、TCP连接建立与释放
1.连接建立:三次握手

- 最初 CLIENT 处于CLOSE状态,当有数据要发送时,会进入SYN-SEND状态,然后向出于LISTEN状态的 SERVER 发送第一个“SYN”报文(SYN=1),该报文包括源端口与目的端口,以及一些连接参数;
- SERVER 收到“SYN”报文后,若同意建立连接,则向客户端发送“SYN+ACK”报文(SYN=1,ACK=1),该报文表示对第一个“SYN”报文的确认,同时给出了服务端的 初始序列号 与 通知窗口大小,客户端会根据响应时间估算出初始 R T T RTT RTT。SERVER 进入SYN-RECD状态;
- CLIENT 收到“SYN+ACK”报文后,发送第三个“ACK”报文,表示对“SYN+ACK”报文的确认,同时给出了客户端的初始序列号,服务端会根据响应时间估算出 R T T RTT RTT。同时 CLIENT 进入ESTABLISHED状态;
- SERVER 收到“ACK”报文后,也进入ESTABLISHED状态;
三次握手指有三个报文被发送:SYN、SYN+ACK、ACK
期间 CLIENT(连接发起者)的状态:CLOSED -> SYN-SEND -> ESTABLISHED
期间 SERVER(连接接收方)的状态:LISTEN -> SYN-RECD -> ESTABLISHED
2.报文传输
连接建立后,CLIENT 与 SERVER 就可以使用连接进行全双工的字节流传输。(这里使用C/S模式为了便于区分)
3.连接释放:四次挥手
客户端(连接发起者)与服务端(连接接收者)都可以发起TCP连接的释放。
-
CLIENT 进入FIN+WAIT-1(释放等待1)状态,并向 SERVER 发送第一个“FIN”(FIN=1)报文。
-
SERVER 收到“FIN”报文后,向 CLIENT 发回“ACK”报文,表示对第一个“FIN”请求报文的确认,并进入CLOSE-WAIT状态
TCP通知高层应用程序 CLIENT 请求释放连接,此时 CLIENT 不会再向 SERVER 发送数据,CLIENT 到 SERVER 的连接断开;但 SERVER 到 CLIENT 的TCP连接还没有断开,若 SERVER 愿意,还可以继续发送数据直至完毕,这种连接状态称为“半关闭状态”
-
CLIENT 收到“ACK”报文后,进入FIN+WAIT-2状态
-
当 SERVER 的高层应用无数据要写入时,会通知 TCP 释放连接,此时 SERVER 向 CLIENT 发送“FIN”报文,并进入LAST-ACK状态
-
CLI