一、TCP 3次握手的过程?
- 建立连接前server端需要监听端口,所以初始状态是LISTEN
- client端建立连接,发送一个SYN同步包,发送之后状态变成SYN_SENT
- server端收到SYN之后,同意建立连接,返回一个ACK响应,同时也会给client发送一个SYN包,发送完成之后状态变为SYN_RCVD
- client端收到server的ACK之后,状态变为ESTABLISHED,返回ACK给server端。server收到之后状态也变为ESTABLISHED,连接建立完成
ACK:确认报文段;
SYN:同步报文段;
FIN:结束报文段。
![在这里插入图片描述](https://img-blog.csdnimg.cn/ab16950ba41c4bb5a2508da0bd38b7b0.png)
1.1 为什么要3次?2次,4次不行吗?
因为TCP是双工传输模式,不区分客户端和服务端,连接的建立是双向的过程。
如果只有两次,无法做到双向连接的建立,从建立连接server回复的SYN和ACK合并成一次可以看出来,他也不需要4次。
挥手为什么要四次?因为挥手的ACK和FIN不能同时发送,因为数据发送的截止时间不同。
二、四次挥手的过程?
- client端向server发送FIN包,进入FIN_WAIT_1状态,这代表client端已经没有数据要发送了
- server端收到之后,返回一个ACK,进入CLOSE_WAIT等待关闭的状态,因为server端可能还有没有发送完成的数据
- 等到server端数据都发送完毕之后,server端就向client发送FIN,进入LAST_ACK状态
- client收到ACK之后,进入TIME_WAIT的状态,同时回复ACK,server收到之后直接进入CLOSED状态,连接关闭。但是client要等待2MSL(报文最大生存时间)的时间,才会进入CLOSED状态
2.1 为什么要等待2MSL的时间才关闭?
- 为了保证连接的可靠关闭。如果server没有收到最后一个ACK,那么就会重发FIN。
- 为了避免端口重用带来的数据混淆。如果client直接进入CLOSED状态,又用相同端口号向server建立一个连接,上一次连接的部分数据在网络中延迟到达server,数据就可能发生混淆了。
三、TCP怎么保证传输过程的可靠性?
- 确认应答,序列号:TCP进行传输时数据都进行了编号,每次接收方返回ACK都有确认序列号。
- 超时重传:如果发送方发送数据一段时间后没有收到ACK,那么就重发数据。
- 连接管理:三次握手和四次挥手的过程。
- 流量控制:TCP协议报头包含16位的窗口大小,接收方会在返回ACK时同时把自己的即时窗口填入,发送方就根据报文中窗口的大小控制发送速度。
- 拥塞控制:刚开始发送数据的时候,拥塞窗口较小 (慢启动),以后每次收到ACK,拥塞窗口先指数规律后线性增大,然后将拥塞窗口和收到的窗口取较小值作为实际发送的窗口。如果发生超时重传,拥塞窗口重置为最小值。这样做的目的就是为了保证传输过程的高效性和可靠性。
- 校验和:发送方在发送数据之前计算校验和,接收方收到数据后同样计算,如果不一致,那么传输有误。