这一次终于理解了三次握手四次挥手

在网络通信中,TCP(传输控制协议)是最常用的协议之一。TCP 提供可靠的、面向连接的通信,广泛应用于 Android 平台的网络请求中。在 TCP 连接的建立和终止过程中,分别涉及到三次握手(Three-Way Handshake)和四次挥手(Four-Way Handshake)流程。

1. 三次握手(Three-Way Handshake)

三次握手是建立 TCP 连接的过程,确保客户端和服务器都准备好进行数据传输。

  1. 第一次握手(SYN)

    • 客户端向服务器发送一个 SYN(synchronize sequence number)包,表示请求建立连接。
    • 客户端进入 SYN_SENT 状态。
  2. 第二次握手(SYN-ACK)

    • 服务器收到 SYN 包后,向客户端发送一个 SYN-ACK(synchronize-acknowledge)包,表示同意连接请求并同步序列号。
    • 服务器进入 SYN_RCVD 状态。
  3. 第三次握手(ACK)

    • 客户端收到 SYN-ACK 包后,向服务器发送一个 ACK(acknowledge)包,表示连接建立。
    • 客户端进入 ESTABLISHED 状态,服务器收到 ACK 包后也进入 ESTABLISHED 状态。

此时,客户端和服务器之间的连接正式建立,可以开始数据传输。

时序图

arduino 复制代码
 sequenceDiagram
    participant Client
    participant Server

    Client->>Server: SYN
    Server->>Client: SYN-ACK
    Client->>Server: ACK

2. 四次挥手(Four-Way Handshake)

四次挥手是断开 TCP 连接的过程,确保客户端和服务器都安全地终止连接。

  1. 第一次挥手(FIN)

    • 客户端向服务器发送一个 FIN(finish)包,表示请求终止连接。
    • 客户端进入 FIN_WAIT_1 状态。
  2. 第二次挥手(ACK)

    • 服务器收到 FIN 包后,向客户端发送一个 ACK 包,表示确认收到终止请求,但仍有数据需要传输。
    • 服务器进入 CLOSE_WAIT 状态,客户端进入 FIN_WAIT_2 状态。
  3. 第三次挥手(FIN)

    • 服务器传输完所有数据后,向客户端发送一个 FIN 包,表示同意终止连接。
    • 服务器进入 LAST_ACK 状态。
  4. 第四次挥手(ACK)

    • 客户端收到 FIN 包后,向服务器发送一个 ACK 包,表示确认终止连接。
    • 客户端进入 TIME_WAIT 状态,等待一段时间以确保服务器收到 ACK 包后再进入 CLOSED 状态。
    • 服务器收到 ACK 包后,立即进入 CLOSED 状态。

时序图

arduino 复制代码
sequenceDiagram
    participant Client
    participant Server

    Client->>Server: FIN
    Server->>Client: ACK
    Server->>Client: FIN
    Client->>Server: ACK

3. Android 中的网络请求实践

在 Android 开发中,网络请求通常通过 HttpURLConnection 或第三方库如 OkHttpRetrofit 来实现。以下将使用 OkHttp 作为示例,展示如何发起 HTTP 请求,并结合 TCP 的握手和挥手流程进行说明。

OkHttp 示例

vbscript 复制代码
OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder()
        .url("<https://api.example.com/data>")
        .build();

client.newCall(request).enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {
        e.printStackTrace();
    }

    @Override
    public void onResponse(Call call, Response response) throws IOException {
        if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);

        System.out.println(response.body().string());
    }
});

三次握手和四次挥手在 OkHttp 中的应用

  1. 三次握手

    • client.newCall(request).enqueue(new Callback() { ... }) 方法被调用时,OkHttp 会先与服务器进行 TCP 三次握手,确保连接已经建立。
    • 这一步由 OkHttp 内部的 Connection 类处理,客户端发送 SYN 包,服务器响应 SYN-ACK 包,客户端发送 ACK 包,连接建立。
  2. 四次挥手

    • 当 HTTP 请求完成后(包括接收到响应数据),如果没有持久连接(keep-alive),OkHttp 会关闭 TCP 连接。
    • 关闭连接的过程包括四次挥手:客户端发送 FIN 包,服务器响应 ACK 包,服务器发送 FIN 包,客户端响应 ACK 包。

5. 技术效果与优化

理解 TCP 的三次握手和四次挥手流程,可以帮助开发者在 Android 网络请求中进行如下优化:

  1. 连接复用:通过启用 HTTP/2 或持久连接(keep-alive),减少连接建立和断开的开销,提升网络请求的效率。
  2. 超时设置:合理设置连接超时、读写超时,避免长时间等待无响应的连接,提升用户体验。
  3. 错误处理:针对可能的网络错误(如连接超时、服务器不可达)进行处理和重试机制,实现更加可靠的网络请求。

6. 总结

本文详细介绍了 TCP 三次握手和四次挥手流程,并结合 Android 开发中的实践进行了说明。通过 OkHttp 库的示例,展示了如何在实际应用中实现网络请求,并理解其底层的 TCP 连接管理机制。希望本文能帮助 Android 开发者更好地理解和优化网络请求。

相关推荐
‍。。。3 小时前
使用Rust实现http/https正向代理
http·https·rust
懒大王就是我3 小时前
C语言网络编程 -- TCP/iP协议
c语言·网络·tcp/ip
海绵波波1075 小时前
Webserver(4.3)TCP通信实现
服务器·网络·tcp/ip
幺零九零零8 小时前
【计算机网络】TCP协议面试常考(一)
服务器·tcp/ip·计算机网络
ZachOn1y14 小时前
计算机网络:运输层 —— 运输层概述
网络·tcp/ip·计算机网络·运输层
乌龟跌倒15 小时前
网络层3——IP数据报转发的过程
网络·tcp/ip·计算机网络·智能路由器
很透彻18 小时前
【网络】传输层协议TCP(下)
网络·c++·网络协议·tcp/ip
IPdodo全球网络18 小时前
如何在家庭网络中设置静态IP地址:一份实用指南
网络·tcp/ip·智能路由器·ip
蝌蚪代理ip19 小时前
辩论赛——动态IP与静态IP的巅峰对决
网络·网络协议·tcp/ip·ip
田三番21 小时前
使用 vscode 简单配置 ESP32 连接 Wi-Fi 每日定时发送 HTTP 和 HTTPS 请求
单片机·物联网·http·https·嵌入式·esp32·sntp