TCP全称为 “传输控制协议(Transmission Control Protocol”)。TCP拥有8大特性来保证稳定性)(1.确认应答,2.超时重传,3.连接管理,4.流量控制,5.拥塞控制)以及其性能(1.滑动窗口,2.捎带应答,3.延时应答)。
URG:紧急指针
ACK:是否确认应答消息
RST:复位标识
SYN:同步序列号标识(tcp建立连接时使用)
FIN:结束序列号标识(TCP断开连接时使用)
16位窗口:记录接收缓冲区的大小,如果大小为0,就不会发送数据了.以此达到流量控制
1.不会使用固定频率发送消息,避免资源浪费.一般重发时间都是增加的
2.重发一定次数后,还没得到婴大案,就会停止发送,强制关闭策略.
1.三次握手
为什么是三次握手?不是俩次或四次呐?
二次握手没法建立连接,被动连接方一直收不到主动连接方的确认ACK
被动连接方可以发送确认序列号+ACK,以及自己的序列号和同步信号,这俩个步骤可以合并,只需要三次握手,可以提高连接的速度与效率.
2.四次挥手
下图为连接和断开过程中的双方状态
TIME_WAIT需要2个MSL
MSL是TCP报文的最大生存时间,因此TIME_WAIT持续存在2MSL的话就能保证俩个传输方向上的尚未被接收或迟到的报文段都已经消失(否则服务器立刻重启的话,可能会收到来自上一个进程的迟到的数据,但是这种数据很可能是错误的);
同时也是在理论上保证最后一个报文可靠到达(假设最后一个ACK丢失,那么服务器会再重发一个FIN,这时虽然客户端的进程不在了,但是TCP连接还在,仍然可以重发LAST_ACK)
如果服务器上存在大量的close_wait说明程序是有问题的,可能是没写close()方法.
4.滑动窗口:批量传送数据,批量应答,动态实时准备接收数据
1.数据丢失:会补发,正常补发之后,返回最大ACK值,这种机制叫做快重传
ACK丢失:最后一条ACK没丢就没有关系,只要接收了对方就能知道,按照收到最大的ACK来算,补发其他后面的就可以了.