JAVAEE初阶 网络编程(六)

TCP协议

    • 一. 四次挥手
    • 二. 连接管理过程中TCP状态的变化
      • 2.1 listen状态
      • 2.2 established状态
      • 2.3 CLOSE_WAIT状态
      • 2.4 TIME_WAIT状态
    • 三. 滑动窗口
      • 3.1 ack丢了
      • 3.2 数据丢了

一. 四次挥手

JAVAEE初阶 网络编程(六)_第1张图片

我们都知道,在三次握手中是可以把中间步骤合并成一个步骤执行,那么在四次挥手中是否可以呢?
答案是不一定的,因为触发时机的不同,在三次握手中,在内核收到syn之后立即触发,因此是可以合并的。
但是在四次挥手中,ack和fin执行时间中间差异很多,所以一般是不能进行合并的。

JAVAEE初阶 网络编程(六)_第2张图片

那么服务器主动挥手,是服务器挂了的缘故吗?
答案当然并不全是,服务器挂了的话,确实是会触发四次挥手,但是服务器如果不想跟客户端继续进行连接通信的话,也是会触发四次挥手的。

二. 连接管理过程中TCP状态的变化

所谓的状态,描述的是一个实体,现在正在做什么的意思。
服务器和客户端都需要一种数据结构来保存对端的信息,在这个数据结构当中有一种属性,就叫做状态。

JAVAEE初阶 网络编程(六)_第3张图片

2.1 listen状态

JAVAEE初阶 网络编程(六)_第4张图片
在这里插入图片描述

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是客户端到服务器的最长时间。超过这个时间,就不会重传了。

三. 滑动窗口

JAVAEE初阶 网络编程(六)_第5张图片
JAVAEE初阶 网络编程(六)_第6张图片

滑动窗口是怎样工作的呢?

JAVAEE初阶 网络编程(六)_第7张图片
JAVAEE初阶 网络编程(六)_第8张图片

如果出现丢包,怎么办呢?

3.1 ack丢了

JAVAEE初阶 网络编程(六)_第9张图片

3.2 数据丢了

JAVAEE初阶 网络编程(六)_第10张图片

你可能感兴趣的:(网络,java-ee,java)