TCP三次握手
- 第一次握手🤝:
建立连接时,客户端发送syn(同步序列编号)包到服务器,并进入SYN_SENT状态,等待服务器确认。 - 第二次握手🤝:
服务器收到syn包,必须确认客户端的SYN,同时自己也发送一个SYN包,即SYN+ACK,服务器进入SYN_RECV状态。 - 第三次握手🤝:
客户端收到服务器的SYN+ACK包,向服务端发送确认包ACK,发送完毕后客户端和服务器进入TCP连接成功状态,完成握手。
TCP四次挥手
- 第一次挥手👋:
客户端发送一个FIN段,并包含一个接收者看到当前自己的序列号K,同时还包含一个ACK表示确认对方最近一次发过来的数据。 - 第二次挥手👋:
服务端将K值加1作为ACK序号值,表明收到了上一个包,上层的应用程序会被告知另一端发起了关闭操作。 - 第三次挥手👋:
服务端发起自己的FIN段,ACK=K+1 - 第四次挥手👋:
客户端确认
常见面试题
- 为什么连接的时候是三次握手,关闭的时候是四次挥手?
答:因为服务端收到客户端SYN连接请求报文后,可直接发送SYN+ACK报文。ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当服务端收到FIN报文,并不会立即关闭,只能先回复一个ACK报文给客户端,只有等服务端所有的报文都发送完了,服务端才发送FIN报文,因此不能一起发送。
** - 为什么不能用两次握手进行连接?
答:三次握手改成两次握手,可能会发生死锁的情况,例如:服务端认为连接已经成功建立,客户端认为连接还未建立成功,将忽略客户端发来的任何数据,只等待连接确认应答分租,而服务端发出的分组超时后,重复发送相同的分组,就形成了死锁。
** - 如果已经建立了连接,但是客户端突然出现故障了怎么办?
答:若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。