TCP可靠连接的建立和释放,TCP报文段的格式,UDP简单介绍
TCP连接的建立(三次握手)
建立连接使用的三报文

SYN 报文仅用于 TCP 三次握手中的第一个和第二个报文(SYN 和 SYN-ACK),用于初始化连接的序列号。数据传输阶段不再使用 SYN 标志。 SYN 报文通常只携带连接请求信息,并不包含实际的数据负载。
ACK表明这是一个确认报文。
seq(序列号) 是一个用于追踪每个字节流位置的编号,它确保数据传输的可靠性和有序性。序列号的作用是帮助接收方和发送方正确重组数据,即使数据包顺序错乱或丢失,也能通过序列号将其还原到正确的位置。双方的序列号(Seq)并没有直接的本质联系。每个方向的序列号是独立的,只是它们在各自方向上保持连续性。
ps:在tcp建立连接握手阶段,虽然还尚未发送数据,但是可以看到这里第三个报文和第一个报文相比,序列号增加了1。因为即使没有数据传输,每次握手中的 SYN 报文都会消耗一个序列号
确认号 (ack):如果接收方的最后一个成功接收的数据字节的序列号为 N,那么接收方会在 ACK 中发送确认号 N + 1,表示接收方已经成功接收到了序列号 N 之前的所有字节,并且期望接收序列号为 N + 1 的字节。ack=seq+1
为什么建立TCP连接不能使用两报文?
避免旧的连接请求引发的误连接
如果采用两次握手,假设客户端发送一个 SYN 报文请求建立连接,然后因网络延迟,该报文被滞留在网络中。如果此时服务器没有接到确认就直接建立连接,当滞留的 SYN 报文到达后,服务器可能误以为客户端请求重新连接,错误地建立新的连接。三次握手的第三次 ACK 则能有效避免这一问题,因为旧 SYN 报文不会收到匹配的第三次握手确认,避免了误连接的发生。
如果采用两报文握手,那么将会是下面这样的情况:

如果采用两次握手建立连接,当TCP服务器端收到网络中已经失效的TCP连接请求之后,也会以为是客户机发来的连接请求,直接进入连接状态/但是客户机这边可能已经关闭了tcp连接,此时并不需要tcp服务传送数据,但是服务器端始终保持着这些无效连接,造成了tcp连接资源的浪费 。
TCP连接建立的一道例题

这道题选项中,主机乙选择的初始seq正好与报文要回应的主机甲的ack一样,看起来有点别扭。
TCP连接的释放(四次挥手)
释放连接使用的四报文

1.主动关闭方发送 FIN(Finish)报文
- 发送方(客户端或服务器) 发送一个 FIN 报文段,表示数据发送完毕,不再发送数据。这一步是主动关闭连接的一方(通常是客户端)发出的。
- FIN 报文中的 SEQ 字段表示最后一个字节的序列号(即发送方最后一个字节的序列号),告诉接收方发送方已经完成数据发送。
2. 被动关闭方回复 ACK 报文
- 接收方(另一方,通常是服务器或客户端) 收到 FIN 报文后,会发送一个 ACK 报文,确认已经收到对方的 FIN 请求,序列号为 接收方的下一个序列号。
- 这个 ACK 报文的确认号是 FIN 的序列号 + 1,表示已经收到 FIN 报文。
3. 被动关闭方发送 FIN 报文
- 在发送 ACK 报文后,被动关闭方(比如服务器)会准备关闭连接,发送一个 FIN 报文,表示自己也没有数据要发送,准备关闭连接。
- 这个 FIN 报文和连接的正常数据包一样,包含一个 SEQ 字段,表示自己最后发送的数据字节的序列号。
4. 主动关闭方回复 ACK 报文
- 主动关闭方(客户端或服务器) 收到 FIN 报文后,会发送一个 ACK 报文来确认接收方的 FIN 请求,表示连接完全关闭。但是此时主动关闭方并不会直接变为close状态,而是进入一个时长为2MSL的时间等待状态,为了确保对方收到了最后的 ACK 报文,即便是 ACK 丢失,被动关闭方重发的 FIN 报文也可以被主动关闭方处理,从而保证连接双方的一致性。
- 此时,确认号是 对方的 FIN 序列号 + 1。
为什么需要四次挥手?
- 每方都要告知对方自己没有数据要发送:由于 TCP 是全双工的协议,连接的关闭是单独的。每个方向的数据流都需要单独关闭,因此需要四次挥手。
- 保证数据的完整性:每一方都确保对方确认自己所有的数据已经被接收并且完全关闭连接。
为什么选择设计TCP连接可单向解除?
当主动关闭方发送 FIN 请求断开连接,并得到被动关闭方的 ACK 确认后,主动关闭方会停止数据的发送,但依然会继续接收来自被动关闭方的数据。
-
确保数据传输完整性:
如果主动关闭方在发送 FIN 后立刻关闭接收通道,则可能导致被动关闭方尚未传输的数据被丢弃。通过保持接收通道的开放,即使主动关闭方停止发送数据,它仍可以接收被动关闭方的剩余数据,确保任何未完成的数据传输不会因为连接关闭而丢失。 -
支持渐进式的双向关闭:
在实际应用中,有时主动关闭方可能已经不需要发送更多数据,但被动关闭方仍然有待传输的数据。例如,当客户端请求断开连接时,服务器可能仍有一些待发送的响应或日志。通过分离关闭方向,TCP 允许服务器在完成数据发送后再发送 FIN 请求来正式关闭连接,从而实现一个更优雅的连接终止过程。
TCP连接/释放推荐参考视频:
5.8.2 TCP的运输连接管理—TCP的连接释放_哔哩哔哩_bilibili
【复试自用计算机网络】TCP连接建立的三次握手+TCP连接断开的四次握手_哔哩哔哩_bilibili
TCP报文段的首部格式



- 源端口号:标识发送方应用程序的端口号,通常由发送方操作系统动态分配(除非应用程序指定固定端口号)。
- 目的端口号:标识接收方应用程序的端口号,通常是由接收方服务或应用程序指定。例如,HTTP 服务通常使用端口 80,HTTPS 使用端口 443。
- 序列号:表示报文段中数据的第一个字节的编号,用于确保数据的顺序传输和重组。在建立连接的第一次握手(SYN)中,序列号会作为初始序列号(ISN)发送。
- 确认号:确认号是接收方发送给发送方的一个字段,表示接收方期望收到的下一个字节的序列号。TCP 使用这个字段来实现确认机制,确保数据的可靠传输。
- 数据偏移:指出 TCP 报文段首部的总长度,以 32 位字(4 字节)为单位。这一字段帮助接收方知道数据从报文段的哪个位置开始。(由于tcp报文段的首部包含拓展首部,其长度不固定,而我们首部总长度又必须要求为4字节的倍数,所以拓展首部的后面有填充字段,用来帮助首部长度凑为4的倍数)
- 关于后面的几个字段这里也不详细一一介绍了,可以观看视频:5.9 TCP报文段的首部格式_哔哩哔哩_bilibili
关于tcp首部中序列号和确认号的详细解释
当 TCP 连接建立时,双方都会生成一个 初始序列号(ISN)。这个初始序列号通常是一个 随机数,而不是固定的 0。使用随机的 ISN 是为了提高安全性,防止 序列号预测攻击(例如,攻击者利用已知的序列号猜测数据流)。
tcp数据报其中包含的数据字节都会按顺序编号,并且每个字节都会分配一个唯一的序列号。发送报文的序列号是 连续增长 的,即每发送一个新的数据段,序列号就会增加相应的数量。虽然一个报文段中可以包含若干字节,但是一个tcp数据报中的序列号只填入这个数据报中的第一个字节的编号。
- 假设初始序列号
ISN = X,发送方发送了一个包含N字节数据的报文段。则该报文段的序列号为X,而确认号会是X + N(即对方期望接收的下一个字节的序列号)。- 下一个报文段的序列号将是
X + N,并且它会继续递增,直到所有的数据都发送完。- 注意: 序列号是按字节递增的,而不是报文段递增。这意味着每个数据字节都有一个唯一的序列号。
确认号(ACK)是 TCP 报文段头中的一个字段,表示接收方期望下一个收到的数据字节的序列号。它用于确认已经成功接收到的数据,并告诉发送方接收方期望接收的下一个字节。
序列号和确认号是密切联系配合的!!!
- 发送方:
- 发送方在发送数据时会给数据报文段分配序列号。序列号表示该报文段中的数据相对于字节流的偏移量。
- 接收方:
- 接收方收到数据后,会根据自己期望的下一个字节的序列号来发送确认号。接收方的确认号是 期望接收到的下一个字节的序列号。
- 例如,如果接收方已经收到了序列号为
1000到1500的数据,那么它的确认号会是1501,表示它已经收到并确认了1000到1500的数据,期望收到下一个字节1501。
UDP简单介绍

相关文章:
TCP可靠连接的建立和释放,TCP报文段的格式,UDP简单介绍
TCP连接的建立(三次握手) 建立连接使用的三报文 SYN 报文仅用于 TCP 三次握手中的第一个和第二个报文(SYN 和 SYN-ACK),用于初始化连接的序列号。数据传输阶段不再使用 SYN 标志。 SYN 报文通常只携带连接请求信息&a…...
LLMs之PDF:zeroX(一款PDF到Markdown 的视觉模型转换工具)的简介、安装和使用方法、案例应用之详细攻略
LLMs之PDF:zeroX(一款PDF到Markdown 的视觉模型转换工具)的简介、安装和使用方法、案例应用之详细攻略 目录 zeroX的简介 1、支持的文件类型 zeroX的安装和使用方法 T1、Node.js 版本: 安装 使用方法 使用文件 URL: 使用本地路径&…...
开源数据库 - mysql - mysql-server-8.4(gtid主主同步+ keepalived热切换)部署方案
前置条件 假设主从信息 mysqlhostport主192.168.1.13306从192.168.1.23306vip192.168.1.3 部署流程 导出测试环境表结构与数据 使用mysqldump ./mysqldump -ulzzc -p -S /tmp/mysql3306.sock --single-transaction --database lzzc > databaseLZZCxxxx.sql查看gtid号 …...
Java全栈体系路线
Java全栈体系路线 摘要 Java 是一门广泛应用于企业级开发的语言,具有强大的生态系统和丰富的工具支持。成为一名 Java 全栈开发工程师不仅需要掌握后端开发技能,还需要具备前端开发和数据库管理的能力。本文将详细介绍 Java 全栈开发的学习路线&#x…...
【Unity基础】Unity中如何导入字体?
在Unity中,不能像其他软件一样直接使用字体文件,需要通过FontAssetCreator将其转换成Texture的Asset文件,然后才能使用。 本文介绍了使用FontAssetCreator导入字体的过程,并对其参数设置进行了说明。 Font Asset Creator 是 Uni…...
使用NVIDIA GPU加速FFmpeg视频压制:完全指南
引言 在视频处理领域,FFmpeg是一个强大的工具。结合NVIDIA的硬件编码器NVENC,我们可以实现快速高效的视频压制。本文将详细解析一个实用的视频压制命令,帮助你理解每个参数的作用。 核心命令 ffmpeg -i input.mp4 -vf scale640:360 -c:v h…...
Python学习:scipy是什么?
文章目录 一、Scipy简介二、Scipy的组成部分1. 基础功能:2. 特殊函数:3. 优化:4. 积分:5. 插值:6. 信号处理:7. 图像处理:8. 统计分布:9. 空间数据结构和算法:10. 稀疏矩…...
spark的学习-05
SparkSql 结构化数据与非结构化数据 结构化数据就类似于excel表中的数据(统计的都是结构化的数据)一般都使用sparkSql处理结构化的数据 结构化的文件:JSON、CSV【以逗号分隔】、TSV【以制表符分隔】、parquet、orc 结构化的表:…...
SQL注入(SQL Injection)详解
SQL注入(SQL Injection)是一种代码注入技术,它通过在应用程序的输入字段中插入或“注入”恶意的SQL语句,从而操控后端数据库服务器执行非预期的命令。这种攻击方式常用于绕过应用程序的安全措施,未经授权地访问、修改或…...
深入解析 OpenHarmony 构建系统-2-目录结构与核心组件
引言 OpenHarmony作为一款面向全场景的分布式操作系统,其构建系统在开发过程中扮演着至关重要的角色。本文将详细介绍OpenHarmony构建系统的目录结构和核心组件,帮助开发者更好地理解和使用这一强大的工具。 目录结构概览 以下是OpenHarmony构建系统的目录结构,每个目录和…...
网络安全应急响应(归纳)
目录 一、概述二、理论 系统排查 系统基本信息 windowsLinux用户信息 WindowsLinux启动项:开机系统在前台或者后台运行的程序,是病毒等实现持久化驻留的常用方法。 WindowsLinux任务计划:由于很多计算机都会自动加载“任务计划”,…...
【网络协议栈】网络层(上)网络层的基本理解、IP协议格式、网络层分组(内附手画分析图 简单易懂)
绪论 “It does not matter how slowly you go as long as you do not stop.”。本章是自上而下的进入网络协议栈的第三个篇幅–网络层–,本章我将带你了解网络层,以及网络层中非常重要的IP协议格式和网络层的分片组装问题,后面将持续更新网…...
数据库类型介绍
1. 关系型数据库(RDBMS) 关系型数据库是最常见的一类数据库,它们通过表(Table)来存储数据,表之间通过关系(如主键和外键)来关联。 • MySQL:开源的关系型数据库管理系统&…...
一步一步从asp.net core mvc中访问asp.net core WebApi
"从asp.net core mvc中访问asp.net core WebApi"看到这个标题是不是觉得很绕口啊,但的确就是要讲一讲这样的访问。前面我们介绍了微信小程序访问asp.net core webapi(感兴趣的童鞋可以看看前面的博文有关WEBAPI的搭建),这里我们重点不关心如何…...
linux中kubectl命令使用
一.命令介绍 kubectl 是 Kubernetes 集群管理的命令行工具,用于与 Kubernetes API 交互。你可以通过它来管理和操作 Kubernetes 集群中的资源,如 Pod、Deployment、Service 等。下面是如何在不同操作系统上下载和使用 kubectl 的方法。 二.下载 kubect…...
Linux 系统结构
Linux系统一般有4个主要部分:内核、shell、文件系统和应用程序。内核、shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序、管理文件并使用系统。 1. linux内核 内核是操作系统的核心,具有很多最基本功能,它…...
ESP32-S3设备智能化升级,物联网无线AI语音交互,让生活更加便捷和有趣
在人工智能和物联网技术的推动下,无线AI语音交互技术正在成为智能设备的新选择。这种技术的发展,不仅改变了我们与设备的沟通方式,更开启了一个新的智能交互方案。 想象一下,通过简单的语音指令,就能控制家中的灯光、…...
Python的函数(补充浅拷贝和深拷贝)
一、定义 函数的定义:实现【特定功能】的代码块。 形参:函数定义时的参数,没有实际意义 实参:函数调用/使用时的参数,有实际意义 函数的作用: 简化代码提高代码重用性便于维护和修改提高代码的可扩展性…...
oracle查询字段类型长度等字段信息
1.查询oracle数据库的字符集 SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER NLS_CHARACTERSET; 2.查询字段长度类型 SELECT * FROM user_tab_columns WHERE table_name user AND COLUMN_NAME SNAME 请确保将user替换为您想要查询的表名。sname为字段名 这里的字…...
C语言 | Leetcode C语言题解之第559题N叉树的最大深度
题目: 题解: /*** Definition for a Node.* struct Node {* int val;* int numChildren;* struct Node** children;* };*/int maxDepth(struct Node* root) {if (!root) {return 0;}int depth 0;// 创建空队列const int qCap 10e4 1;str…...
XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...
Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
抽象类和接口(全)
一、抽象类 1.概念:如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象,这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法,包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中,⼀个类如果被 abs…...
前端调试HTTP状态码
1xx(信息类状态码) 这类状态码表示临时响应,需要客户端继续处理请求。 100 Continue 服务器已收到请求的初始部分,客户端应继续发送剩余部分。 2xx(成功类状态码) 表示请求已成功被服务器接收、理解并处…...
