1.什么是TCP
CP 即传输控制协议(Transmission Control Protocol),是一种面向连接的、可靠的、基于字节流的传输层通信协议。它 位于 OSI 模型的传输层,通过三次握手建立连接,在数据传输过程中采用序列号、确认应答、超时重传、流量控制、拥塞控制等机制来保证数据的可靠传输。
2.TCP的六位标志位
1. URG(紧急指针标志):当 URG = 1 时,表示紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送。
2. ACK(确认标志):当 ACK = 1 时确认号字段有效。大多数情况下该标志位都是置位的。
3. PSH(推送标志):当 PSH = 1 时,接收方应尽快将这个报文段交给应用层。
4. RST(复位标志):当 RST = 1 时,表明 TCP 连接中出现严重差错,必须释放连接,然后再重新建立运输连接。
5. SYN(同步标志):在连接建立时用来同步序号。当 SYN = 1 而 ACK = 0 时,表明这是一个连接请求报文段。对方若同意建立连接,则应在响应的报文段中使 SYN = 1 和 ACK = 1 。
6. FIN(终止标志):用来释放一个连接。当 FIN = 1 时,表明此报文段的发送方的数据已发送完毕,并要求释放运输连接。
2.TCP的主要特点
1.. 高可靠性:通过确认和重传机制来保证所有数据能够按照正确的顺序到达目标设备,能在数据传输过程中检测和纠正错误,确保数据的完整性、顺序性和可靠性;
2.到达确认:接收端接收到分片数据时,根据分片数据序号向发送端发送一个确认
3.超时重发:发送方在发送分片时启动超时定时器,如果在定时器超时之后没有收到相应的确认,重发分片;
4.面向连接:在数据传输前,必须先建立连接,传输完成后再断开连接,这种方式可以保证数据传输的可靠性;
3.TCP协议的工作原理
tcp主要通过三次握手和四次挥手进行流量的双向传输
1.三次握手
1.首先,客户端向服务端发送一条没有数据,随机序列号和syn为1(为0时没有意义)的一条流量,并且提前告诉服务端自身的一些信息(如窗口大小)之后,服务端会向客户端发送确认序列号,确认报文以及ack为1(Ack不为一时确认报文无意义)无数据和syn为一的一条流量,此时有客户端向服务端的单向通道建立。之后,客户端向服务端发送一条 确认序列号确认报文,以及ack 为一的一条流量,此时客户端可以向服务端发送数据并且双向通道由此建立。
2.四次挥手
客户端会向服务端发送一条fin为一,序列号,之后,服务端会向客户端发送确认报文,ack为1,序列号此时,客户端对服务端的通道断开。之后,服务端会向客户端发送确认报文,序列号,fin为1,ack=1的一天流量,此时,客户端将被动回复,序列号,确认报文,ack=1,的流量, 此时挥手完成,双向通道断开
3.三次握手和四次挥手过程中出现数据包丢失或超过传输时间时服务端和客户端有哪些反应
1.第三次握手丢失,服务端发送的ACK被客户端正常接收,进入到 CLOSE_WAIT 状态(这里等待应用进程调用的是close函数关闭连接),进入到LAST_ACK状态,发出FIN报文,这个报文丢失了,如果收不到来自客户端的ACK,就会一直超时重传,知道超过超时重传次数;客户端如果采用close关闭的(达到60s就会自动关闭),如果采用shutdown关闭的,可能就有HTTP keep-alive-timeout关闭 或者 TCP Keepalive探测到断开连接了。
2.第四次握手丢失,就是服务端发送的ACK丢失了,服务端维持2MSL,才会进入Close状态,如果在这个过程中收到 服务端超时重传的 FIN(肯定是小于2MSL的)超过了,它自动断开连接。
3.一次挥手丢失,服务端根本不知道,和服务端没有任何关系,客户端发完进入close_wait_1状态,等
4.第二次握手丢失,也就是服务端获取了客户端的FIN报文,进入CLOSE_WAIT状态,因为ACK报文不会重传(本质上是因为它不需要回复),客户端到重传时间就会重传FIN报文,知道收到客户端的ACK报文或者达到最大的重传次数(自己关闭)。如果采用 close 函数关闭,FIN_WAIT1 状态下,接收到 ACK后,不会维护太久时间,直接由 tcp_fin_timeout 来倒计时,这个时间之内收到,进入close 状态,没收到,也就进入close状态了;如果采用shutdown关闭,还是可以接收数据(tcp_fin_timeout无法控制shutdown关闭的连接