1 TCP协议简介
1) 面向连接的、可靠地、基于字节流的传输层通信协议
2) 将应用层的数据流分割成报文段,发送给目标节点的TCP层
3) 数据包都有序号,对方收到则发送ACK确认,未收到则重传
4 )使用校验和来检验数据在传输过程中是否有误。
2 三个重要的TCPflag
ACK:确认序号标志
SYN:同步序号,用于建立连接过程
FIN:finish标志,用于释放连接
3 TCP三次握手
TCP三次握手如下图:
流程
1)第一次握手:建立连接时,客户端发送SYN包(syn=j)到服务器,并进入到SYN_SEND状态,等待服务器确认
2)第二次握手:服务器收到SYN包必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入到SYN_RECV状态
3)客户端收到服务器的SYN+ACK包,像服务器发送确认包(ack=k+1),此包发送完毕,客户端和服务器进入到ESTABLISHED状态,完成三次握手。
4 TCP 四次挥手---终止连接(释放连接)
TCP四次挥手如下图:
流程:
1)第一次挥手:客户端发送一个FIN,用来关闭客户端到服务器的数据传送,客户端进入FIN_WAIT_1状态
2)第二次挥手:服务器收到FIN后,发送一个ACK给客户端,确认序号为收到序号+1,服务器进入CLOSE_WAIT状态。客户端收到ACK进入FIN_WAIT_2状态
3)服务器发送一个FIN,用来关闭服务器到客户端的数据连接,服务器进入LSAT_ACK状态
4)客户端收到FIN后,客户端进入TIME_WAIT状态,接着发送一个ACK给服务器端,确认序号为序列号+1。服务器进入到CLOSED状态。经过2MLS时间后,客户端进入CLOSED状态,完成四次挥手。
5 常见的几个问题
1)为什么需要三次握手才能建立起连接
答:为了初始化客户端和服务器的sequence number,实现信息对等
2)首次握手隐患--SYN超时
原因分析:
- 服务器端收到客户端的SYN,回复SYN+ACK包之后,未收到ACK确认
- 服务器端不断重试直至超时,Linux默认等待63秒才断开连接
SYN Flood风险的防护措施
- SYN队列满后,通过tcp_syncookies参数会发SYN Cookie
- 弱为正常连接,则客户端会回发SYN Cookie,直接建立连接
3)建立连接后,客户端出现故障怎么办
保活机制:
- 向对方发送保活探测报文,若未收到相应则继续发送
- 尝试次数达到保活探测数仍未收到响应则中断连接。
4)为什么TCP是三次握手但是是四次挥手
答:三次握手主要是信息同步。四次挥手的时候,客户端发送终止连接的请求的时候,服务器可能还在发送数据,只能先暂时发送一个ACK报文表示收到了终止连接的请求,待数据发送完毕之后,再发送一个FIN报文终止连接。
5)为什么TCP必须经过2MLS后才真正的释放连接
答:如果服务器端没有收到客户端发送的ACK消息,而继续发送了下一个FIN到客户端的最长时间就是2MSL,等到2MSLA是确保服务器端真的接受到了ACK消息。