什么是TCP协议?
TCP协议是一种面向连接的、可靠的字节流服务,它是一种传输层协议,它会使用网络层协议IP协议。
TCP协议是如何保证可靠传输的
- 序列号
- 校验和
- 确认应答机制
- 连接管理
- 重发控制
- 流露控制
- 阻塞控制
TCP协议的首部是怎样的?
TCP数据被封装在一个IP数据报中。
由TCP传递给IP的信息单位称为报文端或段(segment)
标记比特介绍:
URG:紧急指针有效
ACK:确认需要有效
PSH:接收方应该尽快将这个报文段交给应用层。
RST:重建连接
SYN:同步序号用来发起一个连接。
FIN:发送端完成发送任务。
其它知识点
- 数据校验覆盖了整个TCP报文段,TCP首部和TCP数据,这是一个强制性的字段,一定是由发送端计算和存储的。
- 最常见的可选字段是最长报文大小,又称MSS。每个连接通常都在通信的第一个报文段中指明这个选项,它指明本端所能接收的最大长度的报文段。
TCP连接是如何建立的
- 请求端发送一个SYN段指明客户打算连接的服务器的端口,以及初始序列号。
- 服务端收到请求端发送的报文端之后,回复客户端一个包含服务端初始序列号的SYN报文段,同时将确认序号设置为客户端的初始序列号加一。
- 请求端收到了服务端的回复之后,将确认序列号设置为服务端的初始序列号加一以对服务端SYN报文进行确认。

TCP连接是如何关闭的
- 首先进行关闭的一方,发送第一个FIN将执行主动关闭。
- 当被动关闭端收到这个FIN时,它发回一个ACK,确认序号为收到的序号加一。同时TCP服务器还会向应用程序传送一个文件结束符。接着这个服务器程序就关闭它的连接。
- 服务器程序开始关闭连接,它会向客户端发送一个FIN
- 客户端收到这个FIN后,客户端必须回复一个确认。

TCP的半关闭:
TCP提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力。
TCP的状态变迁图

TCP的滑动窗口与快速重传机制
TCP协议为了确保可靠传输设计了确认应答机制,对每一个发送的数据段,都要等到接收端回复ACK之后,在发送下一个数据段。这样虽然确保了可靠传输,但是吞吐率不高。
TCP的流量控制就是通过滑动窗口实现的
为此TCP引入了滑动窗口协议:
窗口大小是指无需等待确认而可以继续发送数据的最大值。窗口越大,网络吞吐率就越高。
TCP采用了累计确认机制,机当接收端收到比期望序号大的报文段是,便会重复发送最近一次确认的报文段的确认信号,我们称之为冗余ACK。
因为seq=2的报文段丢失了,而接收端收到了比他期望的序号大的报文端3,它就会重复发送最近一次的确认的报文段ACK2,,如果在超时重传定时器溢出之前,连续收到了三个重复冗余ACK,那么发送端就知道哪个报文段丢失了,就可以重发该报文段,避免了等待超时周期,因此该机制被称为快速重传机制
快速重传机制解决了超时重传的什么问题?
- 超时重传需要等待一定的超时周期才能确定是哪个报文段丢失了,才会进行重发。
- 当一个报文段丢失之后,在等待超时重传期间,可能会导致气候的报文段已经被接收段接收但得不到确认,发送端也会任务丢失了,从而引起不惜要得重传。
为什么是3次冗余ACK?
因为TCP报文段是封在IP包内得,IP包在传输时乱序,意味着TCP达到得顺序也是乱序得,乱序也会造成接收端发送冗余ACK。而3次冗余ACK作为判断丢失的准则也是估计值。
TCP的拥塞控制
为什么要进行拥塞控制
防止过多的数据注入到网络中,这样使网络中的路由器或链路不至于过载。
TCP拥塞控制依赖于哪些机制?
- 慢启动
- 拥塞避免
- 快速重传
- 快速恢复
慢开始机制
发送方维持着一个叫做拥塞窗口cwnd,它会根据网络状况动态的进行调整,网络拥塞时,路由器会丢弃报文,发送方没有按时收到确认报文,那么就知道网络发生了拥堵。
所谓的慢开始机制就是初始的拥塞窗口为一。随着传输轮次的增加拥塞窗口逐步加大。为了防止拥塞窗口过大引起网络拥塞,我们需要设置一个慢看是门限ssthreth状态变量,但cwnd < ssthreth时,使用慢开始算法,但cwnd > ssthrerth时,使用拥塞控制算法。
什么是拥塞避免算法?
就是让拥塞窗口缓慢的增大,机每经过一个往返时间,就将拥塞窗口cwnd+1,只要发送方判断出现网络拥堵,无论是在慢启动阶段还是在拥塞控制阶段,都会将慢开始门限值设置为拥塞时发送窗口的一半,但不能小于2,然后把拥塞窗口重置为一,执行慢开始算法。
什么是快速重传?
快速重传要求接收方每收到一个失序的报文段后就立即发送重复确认,而不要等待自己发送数据时才进行捎带确认,发送方只要收到3个冗余确认报文就立即重传报文报,不必等到报文段的重传计时器到期。
什么是快恢复?
一旦出现超时重传,TCP就会把慢启动门限ssthresh的值设置为cwnd值的一半,同时将cwnd设置为ssthresh。

红色线条就应用了快恢复机制