目录
TCP:面向连接、可靠、面向字节流、有状态的协议
面向连接:连接管理、状态管理、心跳保活管理
- 连接管理:三次握手建立连接、四次挥手断开连接
- 状态管理:两端通信的过程中状态迁移变化,无论哪一端,在特定的状态下只能干特定的事情
- 心跳保活管理:在TCP通信中,若两端上时间没有数据往来,则每个一段时间服务端会向客户端发送心跳保活探测数据包,要求对方进行回复,若连续多次没有回复,则认为连接断开
1.握手建立连接为什么是三次
握手建立连接两次不安全,而四次没有必要,因为TCP是面向连接的,双方都要确保对方具有接收数据的能力,防止客户端发送的请求本身就是延迟的请求,在发送请求之后又退出了
四次没有必要:服务端发送的ACK与SKN没有必要分成两个包来进行发送
2.挥手断开为什么是四次
FIN表示发送方不能发送数据,可以接收数据,因此在收到FIN的被动关闭方在收到请求后进行确认回复,必须等待自己不在发送数据了才能向关闭方发送FIN,所以ACK和FIN不能在一起发送,因为被动关闭方可能在进行确认后还要发送数据
3.握手失败时,两端的处理
若第一次SYN发送失败:客户端会重新发送SYN,服务端:没有收到SYN什么都不做
若ACK + SYN丢失:客户端收不到回复就会重发SYN ,服务端收不到回复,等待超时后发送RST重置连接
若最后一次ACK丢失:客户端认为已经建立连接,服务端收不到回复,等待超时后发送RST重置连接
4.TIME_WATI状态有什么用
避免对新连接的影响
若客户端在发送最后一次ACK后关闭连接直接释放资源,然后又以相同的地址信息请求建立新的连接,而发送的ACK丢失服务端没有收到回复,则服务端在等待超时后重发发送FIN,这时候新客户端可能会收到服务端重发的FIN,服务端收到新客户端的SYN请求,但是服务端此时正在等待上一个客户端的ACK回复,收到这个SYN请求会认为类型错误
5.一台主机上出现了大量的TIME_WAIT是什么原因
TIME_WATI是主动关闭连接的一方才会出现的,当主机上出现了大量的TIME_WAIT说明主机上大量的主动关闭了连接,常见于一些爬虫客户端服务器(搭建大量的客户端于服务端建立连接获取资源)
6.一台主机上出现了大量的CLOSE_WAIT的原因是什么
CLOSE_WAIT是被动关闭方才会出现的,收到FIN请求之后回复进入的状态,等待上层确认不再发送数据了关闭连接了才会给对方发送FIN,一般出现大量的CLOSE_WAIT的原因,是因为代码中对没有断开连接的socket进行处理
7.服务端收到相同客户端的多个SYN请求如何处理
客户端在发送SYN请求后由于网络问题,服务端没有收到客户端认为丢失了因此发送了多次
服务端的处理:TCP是有状态的。第一次手之后新建socket,标记状态SYN_RCVD,则收到第二个请求认为类型不对,直接丢弃