TCP全称为 “传输控制协议(Transmission Control Protocol”)。TCP拥有8大特性来保证稳定性)(1.确认应答,2.超时重传,3.连接管理,4.流量控制,5.拥塞控制)以及其性能(1.滑动窗口,2.捎带应答,3.延时应答)。
TCP协议段格式:
URG:紧急指针
ACK:是否确认应答消息
PSH:是否立即从缓冲区取走数据
RST:复位标识
SYN:同步序列号标识(TCP连接时使用)
FIN:结束序列号标识(TCP断开时使用)
16位窗口----不是滑动窗口的大小,滑动窗口的大小是固定的,他是用来记录接受缓冲区的大小,如果大小为0,就不会发送数据了。以此达到流量控制。
TCP特性
-
确认应答ACK机制;(保证TCP稳定性最核心的机制)
-
超时重发2个策略:
① 不会使用固定频率发送消息,避免资源浪费。 (超时以500ms为一个单位进行控制, 每次判定超时,重发的超时时间都是500ms的整数倍)
② 重发一定次数之后,还没得到应答,就会停止发送,强制关闭策略。 -
连接管理:
① 3次握手 为什么需要三次?
② 4次挥手
过程中需要证明对方是否有接受和发送数据的能力,下图为连接和断开过程中的双方状态:
- TIME_WAIT需要 2个 MSL(Linux为500ms)(最大超时时间):
①ACK的最大超时时间为MSL
②服务器发送消息的最大等待时间MSL
MSL是TCP报文的最大生存时间, 因此TIME_WAIT持续存在2MSL的话就能保证在两个传输方向上的尚未被接收或迟到的报文段都已经消失(否则服务器立刻重启,可能会收到来自上一个进程的迟到的数据, 但是这种数据很可能是错误的);
同时也是在理论上保证最后一个报文可靠到达(假设最后一个ACK丢失, 那么服务器会再重发一个FIN. 这时虽然客户端的进程不在了, 但是TCP连接还在, 仍然可以重发LAST_ACK)
- 如果服务器端存在大量的CLOSE_WAIT 说明程序是有问题的。BUG >>>没有调用close()方法。
- 滑动窗口:批量传送数据,批量应答,动态实时准备数据
①数据丢失:会补发,正常补发之后,返回最大ACK值,这种机制叫做快重传
。
②ACK丢失:最后一条ACK没丢就没有关系,只要接受了对方就能知道;按照收到最大的ACK来算,补发其他后面的就可以。 - 流量控制
以结果为导向,进行数据的传递。 - 拥塞控制:根据网络的状态来调整收发频率。
慢开始:
- 当TCP开始启动的时候, 慢启动阈值等于窗口最大值;
- 在每次超时重发的时候, 慢启动阈值会变成原来的一半, 同时拥塞窗口置回1;
- 延迟应答
①每隔一段时间进行延迟应答,一定程度上加速大消息的速度
②每隔N次延迟应答一次
注意事项
:有可能会触发超时重传,所以一定要小于超时重传的时间(500ms),一般为200ms - 捎带应答
断开连接一般是四次挥手,但是没有待处理的数据时,服务器可以将两次挥手合并为一次响应,发送给客户端。这就是捎带应答。
TCP面向数据流会遇到沾包,半包即得到不准确数据的问题的解决方法:
- 1.以\n作为数据流的边界
- 2.发送固定大小的数据流信息
TCP异常处理:
1.可挽救:电脑重启或者结束进程的时候,会发送FIN请求,和正常关闭TCP是没有什么区别的。
2.不能挽回:电脑掉电和网线突然中断的情况:TCP报活定时器,会定时检测对方是否在线,如果没有响应,说明已经掉线,释放连接。
基于TCP实现的协议
HTTP,SSH,FTP,Telnet,SMTP