![](https://csdnimg.cn/release/download_crawler_static/87694417/bg5.jpg)
问 7、如果已经建立了连接,但是客户端突然出现故障了怎么办?
TCP 还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白
白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置
为 2 小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后
每隔 75 秒钟发送一次。若一连发送 10 个探测报文仍然没反应,服务器就认为客户端出了故
障,接着就关闭连接。
2.1.1. 握手机制 - 三次握手,建立一次 tcp 连接
问 1、握手机制
三次握手(Three-way Handshake)就是指建立一个 TCP 连接时,需要客户端和服务器
总共发送 3 个包。主要作用是确认双方的接收能力和发送能力是否正常、指定自己的初始化
序列号为后面的可靠性传送做准备。实质上就是连接服务器指定端口,建立 TCP 连接,并同
步连接双方的序列号和确认号,交换 TCP 窗口大小信息。
开始时,TCP 客户端、服务器都处于关闭状态,两者都先建立传输控制块。然后 TCP 服
务器进入监听状态,等待 TCP 客户进程的连接请求。
(1)第一次握手:建立连接时,客户端发送 SYN(同步序列编号 Synchronize Sequence
Numbers)包(seq=j)到服务器,并进入 SYN_SENT 状态,等待服务器确认;。
(2)第二次握手:服务器收到 syn 包,必须确认客户的 SYN(ack=j+1),同时自己也
发送一个 SYN 包(seq=k),即 SYN+ACK 包,此时服务器进入 SYN_RECV 状态。
( 3 ) 第 三 次 握 手 : 客 户 端 收 到 服 务 器 的 SYN+ACK 包 , 向 服 务 器 发 送 确 认 包
ACK(ack=k+1),此包发送完毕,客户端和服务器进入 ESTABLISHED(TCP 连接成功)状态,
完成三次握手,客户端与服务器开始传送数据。
问 2、Ack 什么时候发生,丢失了会怎样?重传 ack 的时机只有 ack 超时吗?
ACK (Acknowledge character)即是确认字符,接收站对所收到的报文进行检查,若未
发现错误,便向发送站发出确认回答 ACK,表明信息已被正确接收,并准备好接收下一份报
文。在 TCP/IP 协议中,如果接收方成功的接收到数据,由接收方回复给发送方一个 ACK 数
据。TCP 报文格式中的控制位由 6 个标志比特构成,其中一个就是 ACK,ACK 为 1 表示确认
号有效,为 0 表示报文中不包含确认信息,忽略确认号字段。
1、ack 什么时候发生?
在第二次握手时,服务器收到请求报文确认后,发生 syn+ack 到客户端;第三次握手时,
客户端收到服务器的 SYN+ACK 包,向服务器发送确认包 ACK,此包发送完毕,客户端与服务
器开始传送数据。
2、ack 丢失了会怎样?
如果是第二次握手丢失,服务器发送的第二次握手是连接确认报文段 SYN-ACK 包括对第
一次握手的 ACK 确认和 SYN 字段表示要建立连接。所以当第二次握手丢失,客户端迟迟等不
到第一次握手的确认,就会触发超时重传机制,进行超时重传;服务器等不到自己 SYN 连接
的确认,也会进行超时重传。客户端和服务器具体的超时重传次数还是由内核参数决定。
如果是第三次握手丢失,服务器迟迟得不到 ACK 报文,但是 ACK 报文丢失,ACK 报文是