TCP:Transmission Control Protocol 传输控制协议,TCP是一种面向连接的、可靠的、基于字节流的运输层通信协议。


一、TCP协议的特点:

1.面向连接的传输;(最大的特点,即TCP通讯前需要通过三次握手建立连接)
2.端到端的通信;(头部中的源端口和目的端口)
3.高可靠性,确保传输数据的正确性,不出现丢失或乱序;(差错控制机制和拥塞控制几种)
4.全双工方式传输;(在同一时间内,数据可以双向传输)
5.采用字节流方式,即以字节为单位传输字节序列;

6.紧急数据传送功能。(通过头部中的的控制位中的URG和16bit的紧急指针位控制)


二、TCP的头部结构:

TCP共有20字节的固定头部

16bit:源端口号

16bit:目的端口号

32bit:序列号

32bit:确认号

4bit: 头部大小

6bit:保留字段

6bit:控制字段

   fin:1, 用于关闭TCP连接
   syn:1, 同步序号
   rst:1, 重建连接
   psh:1, 推送功能,接收方应该尽快将这个报文段交给应用层
   ack:1, 期待下一次接受对方发过来的数据包的序列号

   urg:1, 紧急指针有效

16bit:窗口大小

16bit:检验和

16bit:紧急指针


三、TCP协议的实现原理

TCP是面向连接的,故要利用TCP协议传输数据,需要首先建立连接,数据传输完后关闭连接。


1>以下是3次挥手建立连接的过程:


1.首先客户端发送一个初始化随机序列号和SYN位为1的数据包给服务器端,注意如果该数据包只包含TCP头部,不包含数据的话。那么数据包的大小默认为1.


2.服务器端接受到客户端发送的数据包后,随机生成一个序列号,并且将ACK=上次接受的序列号+1。

发回一个SYN+ACK,完成第二次握手。不含数据时,数据包的大小为1.


3.客户端接受到服务器端的数据包后,发回一个ACK+序列号数据包,连接建立,如果不包含数据,那么默认数据包是不占大小的。


2>4次挥手关闭连接:


1.客户端在发送完数据之后,发送一个FIN数据包,请求服务器端关闭连接。数据包占一个序列号。

2.服务器端在接受FIN之后,通知进程关闭连接,并且发回一个ACK数据包,客户端接收到ACK数据包。处于半连接状态。

3.服务器端连接关闭,发送一个FIN数据包,数据包大小占一个序列号。

4.客户端接受到FIN数据包后,发回一个ACK确认包。


3>差错控制:



4>拥塞控制:

   TCP提供拥塞控制功能,这是无连接的UDP协议所不具备的,TCP通过控制拥塞窗口的大小来实现拥塞控制。主要的一些机制有慢启动,拥塞避免,快速恢复。


拥塞窗口:拥塞窗口的大小决定了发送端一次可以发送多少TCP数据包。


1.慢启动:拥塞窗口初始大小为1,然后每当从对方收到一个ACK确认包,拥塞窗口大小加1,这样1变2,2变成4,拥塞窗口的大小成指数级增长。当增长到一个阈值时,进入拥塞避免状态。如果期间碰到超时现象,阈值变成当前窗口大小的一半,然后重启慢启动。


2.拥塞避免:当拥塞窗口大于阈值时,便停止慢启动,进入增性加乘性减阶段。即每接收到一个数据包拥塞窗口增加 1/拥塞窗口的大小,即线性增长。如果碰到3次重复ACK那么进入快速恢复状态。如果超时重启慢启动过程。


3.快速恢复:

   1.当收到3个重复ACK时,把ssthresh设置为cwnd的一半,把cwnd设置为ssthresh的值加3,然后重传丢失的报文段,加3的原因是因为收到3个重复的ACK,表明有3个“老”的数据包离开了网络。
   2.再收到重复的ACK时,拥塞窗口增加1。
   3.当收到新的数据包的ACK时,把cwnd设置为第一步中的ssthresh的值。原因是因为该ACK确认了新的数据,说明从重复ACK时的数据都已收到,该恢复过程已经结束,可以回到恢复之前的状态了,也即再次进入拥塞避免状态。