1、概念介绍
名称:TCP,Transmission Control Protocol,传输控制协议
定义:是一种面向连接的、可靠的、基于字节流的传输层通信协议
-
面向连接:一对一的连接,只能提供两个端点的服务
-
可靠:⽆论的⽹络链路中出现了怎样的链路变化,TCP 都可以保证⼀个报⽂⼀定能够到达接收端,按序、无差错、不重复、不丢包
-
字节流:传输的数据没有固有的“报文”或”报文边界”的概念;⽆论我们消息有多⼤都可以进⾏传输
2、报文结构
参数名称 | 长度/bit | 含义说明 | 作用 |
源端口 | 16 | 发送方的端口号 | |
目的端口 | 16 | 接收方的端口号 | |
序号req | 32 | 从发送端向接收端发送的字节流编号 | 解决网络传输中可能会出现的乱序问题 |
确认号ack | 32 | 接收方回发的应答顺序编号 | 解决网络传输中可能会出现的丢包的问题 |
偏移 | 4 | 数据起始处距离报文段起始处有多远。实际上是指出TCP报文段的首部长度 | |
保留位 | 6 | 保留以后使用 | |
URG | 1 | 紧急标志位:1表示“紧急指针”有效,0无效 | |
PSH | 1 | 推送标志位:1表示需要将数据立刻发送给应用程序,不用再等到整个缓存都填满了后再向上交付 | |
RST | 1 | 复位标志位:1表示需要重连(置为1还用来拒绝一个非法的报文段或拒绝打开一个连接) | |
ACK | 1 | 确认标志位:请求/应答状态;0为请求,1为应答 | 确认应答机制 |
SYN | 1 | 同步标志位:握手时使用,1表示连接请求报文 | 为1表示其想建立连接,设置序列号初始值以便开始建立连接 |
FIN | 1 | 终止标志位:1表示需要断开连接 | 为1代表连接异常,必须强制断开连接 |
窗口 | 16 | 表示从本报文段首部中的确认号算起,接收方目前允许对方一次发送的数据量(动态变化) | |
校验和 | 16 | 包括首部和数据这两部分,需要加上12字节的伪首部 | 由发送方计算和存储,由接收方校验 |
紧急指针 | 16 | 指出本数据段中为紧急数据的字节数,紧急数据无须缓存,当前窗口大小为0也是可以发送紧急数据 | |
选项 | 0~40 | 长度可变,最长可达40字节。没有使用时,TCP的首部长度为20字节 | 最常见的如MSS:数据包每次能够传输的最大数据量(可由通信双方确定) |
填充 | N | 为了使整个首部长度是4bit的整数倍 | |
数据部分 | N | 如果数据大于MSS,其在传输层就自行分片 |
3、主要功能
1)面向连接
-
三次握手:确认双方的传输通道能正常支持传输
-
四次挥手:前两次挥手双方都接收到对方想要释放连接的请求
后两次挥手双方都接收到对方准备好释放连接的请求
2)重传机制
-
超时重传:设有⼀个定时器,当超过指定的时间后,没有收到对⽅的ACK确认应答报⽂,就会重发该数据
-
快速重传:如果接收方某一次没有收到预定Seq的包却收到了大于其的包,这说明中间有个包丢了,它会一直回复丢了的那个包的ACK,当发送方收到三个序号同样的ACK就直接触发重传,这个过程是比超时重传快的
3)滑动窗口
滑动窗口的大小意味着接收方还有多大的缓冲区可以用于接收数据,用于流量控制、有序接收
-
流量控制:发送方根据接收方的实际接收能力控制发送的数据量
4)拥塞控制
-
背景/原因
因为计算机网络处在一个共享的环境之中,所以,发送方发送窗口不一定是因为接收方的调整,还有可能是其他主机之间的通信使得网络发生了拥堵,这个时候发送方如果继续发送大量数据,则会进一步加重网络的负担。形成恶性循环。
所以,发送方的发送速率不仅仅要看接收方的接收能力,还要看整个网络的接收能力。
-
拥塞窗口cwnd
是发送方维护的一个状态变量,它会根据网络的拥塞程度动态变化;
网络中没有出现拥堵,就增大,反之则减小。
-
拥塞控制四大算法:
当TCP刚建立一个连接的时候,它并不清楚发送多少数据比较合适,所以有个慢启动的过程,一点点的试探自己能发多少比较合适。发送方每收到一个ACK,拥塞窗口cwnd就+1;拥塞窗口指数增长。
慢启动门限ssthresh:-
拥塞窗口cwnd<慢启动门限ssthresh,使用慢启动算法
-
cwnd>=ssthresh,使用拥塞避免算法
每收到一个ACK,拥塞窗口只增加1个cwnd。
一旦发生了重传,即拥塞发生。门限和拥塞窗口都发生变化。-
超时重传
-
快速重传
1)将拥塞窗口减半。cwnd/=2;
2)将门限和拥塞窗口相等。ssthresh=cwnd。
3)开始快速恢复算法
-
慢启动算法:
-
拥塞避免算法:
-
拥塞发生算法:
-
快速恢复算法
当发生快速重传的时候,你发送方还能收到三个一样的ACK,说明网络情况没有超时重传那么糟糕,此时采取快恢复算法。
1)拥塞窗口cwnd=ssthresh+3
2)重传数据
3)如果收到新数据的ACK说明网络已经恢复,此时门限值恢复重传之前的值,并开始拥塞避免
-
4、应用场景
1)从对数据准确性要求高的角度(与UDP对比):
-
文件传输(FTP、HTTP/0.9~2.0)
-
发送/接收邮件(POP IMAP SMTP)
-
远程登录(TELNET SSH)
-
...
2)从长连接&短连接角度:
长连接:整个通讯的过程client和server只用一个Socket,从而保持长期的通讯连接。长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间。
-
适用于操作频繁/点对点通讯等连接数不太多的场景,如直播、数据库连接
短连接:每次client向Socket发送请求都会新建一个Socket,当处理完一个请求时就直接关闭掉。
-
适用于并发量大且用户不需要频繁的交互操作的场景,如Web的http服务