文章目录
- TCP 的三次握手
- 四次挥手
- 转换状态
TCP 的三次握手
第一次,客户端与服务端建立链接,需要发送请求连接的消息
第二次,服务端接口到数据后,返回一个确认的操作*(至此客户端和服务端链路建立成功)
第三次,服务端还需要发送要与客户端建立链接的请求
第四次,客户端收到数据后,返回一个确认的操作(至此服务端到客户端的链路建立成功)
由于建立链接时没有数据传输,所以第二次确认和第三次请求可以合并为一次发送
tcp协议为了实现可靠传输,通信双方需要判断自己已经发送的数据包是否都被接收方收到,如果没有收到,就需要重新发送,为了实现这个需求,就引出 序号 seq ,和确认号 ack的使用
四次挥手
第一次挥手: 客户端(服务端也可以主动断开) 向服务端说明想要关闭连接
第二次挥手: 服务端会回复确认,但不是关闭,因为此时服务端可能还有数据在传输中
第三次挥手:待到服务端数据传输都结束后,服务端向客户端发出消息,我要断开连接了
第四次挥手,客户端收到服务端的断开信息后,给予确认,服务端收到确认后正式关闭
1 代表客户端 2代表服务端
1 -> 2
FIN=1
2 -> 1
ACK =1
FIN =1
1 -> 2
ACK =1
转换状态
三次握手状态转换
1.客户端发送syn包向服务端请求建立TCP 连接,客户端进入 SYN_SEND 状态
2.服务端收到请求之后,向客户端发送 SYN+ACK 的合成包,同时自身进入 SYN_RECV 状态
3.客户端收到回复之后,发送 ACK信息,自身进入 ESTABLISHED 状态
4.服务端收到ACK数据之后,进入 ESTABLISHED状态
四次挥手过状态转换
1.客户端发送完数据之后,向服务器请求断开连接,自身进入 FIN_WAIT_1 状态
2.服务端收到 FIN 包之后,回复ACK包表示已经收到,但是此时服务端可能还有数据没有发送完成,自身进入CLOSE_WAIT 状态,表示对方已发送完成且请求关闭连接,自身发送完成之后可以关闭连接
3.服务端数据发送完成之后,发送FIN包给客户端,自身进入LAST_ACK 状态,等待客户端 ACK确认
4,客户端收到FIN 包之后,回复一个ACK包,并进入TIME_WAIT 状态
如果机器 TIME_WAIT 过多,会造成端口耗尽,可以修改内核参数
tcp_tw_recycle=1 端口重用