TCP协议
- 一. 四次挥手
- 二. 连接管理过程中TCP状态的变化
- 2.1 listen状态
- 2.2 established状态
- 2.3 CLOSE_WAIT状态
- 2.4 TIME_WAIT状态
- 三. 滑动窗口
- 3.1 ack丢了
- 3.2 数据丢了
一. 四次挥手
我们都知道,在三次握手中是可以把中间步骤合并成一个步骤执行,那么在四次挥手中是否可以呢?
答案是不一定的,因为触发时机的不同,在三次握手中,在内核收到syn之后立即触发,因此是可以合并的。
但是在四次挥手中,ack和fin执行时间中间差异很多,所以一般是不能进行合并的。
那么服务器主动挥手,是服务器挂了的缘故吗?
答案当然并不全是,服务器挂了的话,确实是会触发四次挥手,但是服务器如果不想跟客户端继续进行连接通信的话,也是会触发四次挥手的。
二. 连接管理过程中TCP状态的变化
所谓的状态,描述的是一个实体,现在正在做什么的意思。
服务器和客户端都需要一种数据结构来保存对端的信息,在这个数据结构当中有一种属性,就叫做状态。
2.1 listen状态
listen状态表示,服务器这边serverSocket已经创建好,端口号也绑定完成,等待客户端。
2.2 established状态
established状态已经建立好了连接,在三次握手之后。
并且LISTENING和ESTABLISHED各自有服务器和客户端的状态。
2.3 CLOSE_WAIT状态
接收到对端传来的fin之后,要进入到调用close来主动发起fin。谁被动断开连接,谁就会进入到CLOSE_WAIT状态。
2.4 TIME_WAIT状态
TIME_WAIT状态就是本端发出了fin,也接收到了对端发出的fin之后,进入此状态。
存在的意义就是防止最后一个ACK丢包。
服务器如果没有收到最后一个ACK,就会重传fin。但是客户端如果在此处释放TCP,就意味着重传的FIN不会接收到ACK。此处等待时间最多2MSL。MSL是客户端到服务器的最长时间。超过这个时间,就不会重传了。
三. 滑动窗口
滑动窗口是怎样工作的呢?
如果出现丢包,怎么办呢?