Java中TCP协议详解(上篇):一篇吃透相关知识

前言:TCP协议剖析(上篇):全面掌握相关知识

传输控制协议(TCP)是网络通信里的基础所在,它能提供可靠且具备连接特性的数据传输服务,保障数据包有序抵达且不会丢失。TCP在文件传输、即时通讯以及Web服务等诸多场景中都有广泛应用,是我们学习网络编程时的重要基石。

目录

  1. TCP头部构造
  2. TCP的可靠传输机制
    • 确认应答(ACK)
    • 序列号去重
    • 超时重传
  3. TCP连接管理
    • 三次握手
      • 客户端发起SYN请求
      • 服务器返回SYN - ACK
      • 客户端发送ACK,连接建立
    • 四次挥手
      • 客户端发送FIN关闭请求
      • 服务器返回ACK
      • 服务器发送FIN关闭请求
      • 客户端返回ACK,连接关闭

1. TCP头部构造

传输控制协议(TCP)全称为“Transmission Control Protocol”,它要对数据的传输进行细致把控。那TCP协议的构成是怎样的呢?

TCP协议格式

TCP的最小长度是20字节,要是包含可选字段,最大能达到60字节。下面对各个组成部分进行简单概括:

字节偏移 字段名称 长度(比特) 简单说明
0 - 15 源端口号 16 发送方的端口号
16 - 31 目的端口号 16 接收方的端口号
32 - 63 序列号 32 数据包的序号
64 - 95 确认号 32 用于确认的序列号
96 - 99 数据偏移(头部长度) 4 以4字节为一个单位,最大值为15(即60字节)
100 - 102 保留位 3 保留位置,值为0
103 - 111 标志位 9 SYN、ACK、FIN等控制连接
112 - 127 窗口大小 16 允许的接收窗口
128 - 143 校验和 16 用于确保数据正确性和完整性
144 - 159 紧急指针 16 紧急数据指针
160 - … 可选字段 0 - 40字节 可能包括MSS、窗口缩放等
… - … 数据 不固定 传输的数据

通过上面的表格内容,我们大致知晓了TCP头部的组成部分。接下来逐个进行讲解:

1. 源端口号

源端口号用来表明发送方的端口号,确定数据从哪个端口发送出去,就如同寄件人的地址,标识包裹从哪里发出。

2. 目的端口号

目的端口号用于表明接收方的端口号,确定数据要发往的端口,类似收件人的地址,指示包裹要发送到哪里。

3. 序列号

序列号标记当前数据段的起始字节序号,保证数据按顺序到达。TCP连接建立时,序列号由发送方随机生成,它就像是数据的编号,能让接收方依据此编号把拆分的多份数据按顺序拼接起来。

4. 确认号

确认号用于确认收到的数据,代表接收方期望接收的下一个字节序号,用于对数据进行确认操作,只有当ACK标志位为1时才有效,这就好比快递的签收单,表示东西已被签收。

5. 数据偏移

数据偏移用来指示TCP头部的长度,以4字节为单位,比如值为5,那么头部长度就是 5×4 = 20 字节。

6. 保留位

保留字段,当前未被使用,必须填0。

7. 标志位

用于控制TCP连接状态,其中包含:
- SYN(同步)——用于建立连接(握手)。
- ACK(确认)——确认收到数据。
- FIN(终止)——用于关闭连接。
- RST(复位)——异常终止连接。
- PSH(推送)——立即发送数据。
- URG(紧急)——数据紧急处理。
- ECE/CWR/NS ——用于拥塞控制。

8. 窗口大小

窗口大小表示接收方能接收的最大字节数,用于流量控制,就好像告诉发送方“我一次最多能接收多少数据”,要是太多就可能会溢出。

9. 校验和

校验和用于检测TCP头部和数据在传输过程中的错误,发送方计算并填充,接收方进行校验,如同快递的防伪码。

10. 紧急指针

仅在URG标志位为1时生效,表示紧急数据的偏移量。

11. 可选字段

包含最大段大小、窗口缩放等选项,用于扩展TCP功能。

12. 数据部分

数据部分指的是TCP头部后面的数据内容。

2. TCP的可靠传输机制

为了保证数据能可靠地传送到接收方,TCP采用了确认应答(ACK)、序列号去重以及超时重传机制,下面逐一重点讲解这三个机制。

(1)确认应答(ACK)

确认应答(ACK)是TCP中实现可靠传输的关键机制之一,其主要作用是确保发送的数据包能成功到达接收方,并且接收方能够及时告知发送方是否成功收到数据。

工作原理:

  • 每个数据包都需确认:发送方发送数据包后,会等待接收方的确认应答(ACK),接收方收到数据包后,会向发送方返回一个ACK包,表示已确认收到发送过来的数据包。
  • ACK的内容:ACK包中包含要接收到数据包的下一个期望的序列号(即确认号),这意味着接收方已经成功接收了序列号之前的所有数据包。
  • 顺序保证:接收方每次确认的是最小未接收的数据包的序列号,通过序列号的确认,发送方知道哪些数据包已成功到达,哪些还未到达。

举个例子,发送方发送了数据包1、2、3、4,接收方收到数据包1、2后,会发送一个确认应答ACK(3),表示它已经收到序列号小于3的数据包,期望收到序列号为3的数据包。

(2)序列号去重

序列号去重是用来处理数据包乱序和重复发送问题的,当网络不稳定或路由改变等原因导致数据包可能乱序到达接收方,甚至出现重复数据包时,它能发挥作用。

工作原理:

  • 序列号的分配:每个数据包都被分配一个唯一的序列号,该序列号用于标识数据包的顺序,接收方接收到数据包时,会依据序列号来确定数据包的顺序,保证数据正确接收。
  • 乱序处理:当数据包乱序到达时,接收方可以根据序列号将它们重新排序,保证数据按正确顺序接收。
  • 重复包的丢弃:如果接收方收到相同序列号的包,就会丢弃该包,接收方只会向发送方确认新的数据包。

通过序列号去重的操作,确保了数据的顺序性,即使数据包乱序到达,接收方也能按照序列号正确排序,并且能通过序列号识别重复的数据包。

(3)超时重传

超时重传的主要作用是在数据丢失或网络延迟较高的情况下,确保数据最终能到达接收方。

工作原理:

  • 发送数据并等待ACK:发送方发送数据包后,会启动一个定时器开始计时,等待接收方的ACK确认。
  • 超时判断:如果在设定的超时值内,发送方没有收到ACK,它就会认为数据包丢失,并重新发送该数据包。

在数据包丢失或网络延迟的情况下,发送方能够重新发送数据包,从而保证数据最终到达接收方。

3. TCP连接管理

在计算机网络中,TCP通过三次握手来建立连接,使用四次挥手来关闭连接。那什么是三次握手,什么又是四次挥手呢?

(1)三次握手

TCP连接的建立需要三次交互,以确保客户端与服务器都准备就绪,并同步彼此的初始序列号,以下是简略步骤:

【1】客户端发送SYN请求

客户端向服务器发送一个 SYN 报文,表明自己要建立连接,并带上一个初始序列号。

【2】服务器返回SYN - ACK

服务器收到SYN后,如果同意建立连接,会返回 SYN - ACK 报文,其中:
- SYN表示同意建立连接。
- ACK(Acknowledgment)表示确认客户端的SYN。

【3】客户端发送ACK,连接建立

客户端收到SYN - ACK之后,向服务器发送 ACK(确认)报文,至此连接建立。

(2)四次挥手

TCP连接的关闭需要四次交互,以确保双方都正确释放资源,防止数据丢失,以下是简略步骤:

【1】客户端发送FIN关闭请求

当客户端不再需要通信时,会发送 FIN(Finish) 报文。

【2】服务器返回ACK

服务器收到FIN后,会发送一个 ACK 确认报文。

【3】服务器发送FIN关闭请求

服务器处理完剩余数据后,也发送 FIN 报文,通知客户端可以关闭。

【4】客户端返回ACK,连接关闭

客户端收到服务器的FIN后,发送 ACK 报文,连接关闭。

以上便是本篇文章关于Java中TCP协议相关内容的讲解,希望读者能耐心阅读并总结理解。

文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/13573.html

(0)
LomuLomu
上一篇 11小时前
下一篇 10小时前

相关推荐

  • MySQL 安装部署

    概述 本文主要介绍如何在 Linux 中以 RPM 包的方式安装 MySQL 并进行相关的初始化配置,文中方案均已实践验证。 操作系统 CentOS 7.6 数据库版本 MySQL 8.4.3 LTS [!NOTE] 说明 本文主要介绍 RPM 包的安装方式,其他安装方法可查阅官网:MySQL :: MySQL 8.4 Reference Manual ::…

    未分类 2025 年 1 月 11 日
    35900
  • 2025年最新DataGrip激活码及永久破解方法(支持2099年)

    前言介绍 本教程适用于JetBrains系列开发工具,特别针对数据库管理工具DataGrip,同时也可用于PyCharm、IDEA等其他IDE。以下是成功破解DataGrip至2099年的效果展示: 本教程将分步骤指导您完成DataGrip的永久激活,该方法具有以下优势特性: 跨平台适用(Windows/Mac/Linux全支持) 版本通用(新旧版本都能使用…

    DataGrip激活码 2025 年 7 月 21 日
    11400
  • 年度热选!全球超热门AI编程工具大搜罗

    年度热门之选!全球超火爆AI编程工具大搜集 哈喽,我是R哥。近期AI编程工具那可是热闹得很呢,自打Cursor火起来后,国内外各大厂商都纷纷推出了自家的AI编程工具,我来给大伙讲讲,以下顺序不分先后哦。 国外主流AI编程工具汇总: Cursor: 出品方:Anysphere 官网:https://www.cursor.com/ 收费情况:最低每月20美元,个…

    2025 年 7 月 10 日
    14300
  • manim边学边做–改变动画速度

    ChangeSpeed类是Manim库中用于修改动画速度的类。 它提供了一种灵活的方式来控制动画的播放速度,使动画在不同时间段内以不同的速度播放,从而创造出更加丰富多样的动画效果。 比如,在创建包含多个元素动画的场景中,通过ChangeSpeed可以精确控制不同元素在不同时间点的移动速度,实现复杂的动画节奏编排。 1. 动画概述 与之前介绍的那些动画类不同,…

    2025 年 1 月 6 日
    23700
  • 2025年最新DataGrip永久破解教程(附激活码/注册码)🔥

    还在为DataGrip的激活问题发愁吗?🤔 本教程将手把手教你如何轻松破解DataGrip,让你的IDE使用期限延长至2099年!本方法适用于JetBrains全家桶(IDEA、PyCharm、Goland等),无论你使用什么操作系统或版本,都能完美适配! 先来看看破解成功后的效果图,有效期直接到2099年,简直不要太爽!🎉 第一步:下载DataGrip安装…

    DataGrip激活码 2025 年 6 月 25 日
    42900

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信