提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、TCP协议介绍
  • 二、TCP报文格式
  • 三、TCP三次握手
  • 四、TCP四次挥手
  • 五、UDP协议介绍
  • 六、常见协议及其端口
  • 七、TCP与UDP的不同
  • 总结


前言

提示:这里可以添加本文要记录的大概内容:

传输层协议是计算机网络体系中的核心协议之一,位于OSI模型的第四层,主要负责端到端的数据传输控制。其核心功能包括数据分段、流量控制、差错校验和连接管理。常见的传输层协议主要有TCP和UDP,两者在可靠性、效率和适用场景上存在显著差异。


提示:以下是本篇文章正文内容,下面案例可供参考

一、TCP协议介绍

TCP/IP协议族的传输层协议

1. TCP(可靠的老大哥)

特点:

面向连接:必须先“握手”建立连接(类似打电话要先拨通)。

可靠传输:数据丢了会重传(类似快递丢了会补发)。

流量控制:根据接收方的能力调整发送速度(类似快递站根据仓库容量调整收件量)。

2. UDP(随性的小弟)

特点:

无连接:直接发数据,不握手(类似发短信,不用等对方接电话)。

不可靠:数据可能丢失(类似明信片,丢了不补发)。

速度快:适合实时应用(视频、语音、游戏)。

二、TCP报文格式

可以把TCP报文段想象成一封快递包裹,里面装着你要传输的数据。这个包裹有详细的“快递单”(TCP头部),确保数据能准确、可靠地送到对方手里。以下是关键字段的通俗解释:

1.快递收发人信息(端口号)

源端口号(16位):

→ 你的“发货人编号”(比如你的电脑上微信用的端口号是54321)。

目标端口号(16位):

→ 对方的“收货人编号”(比如微信服务器的端口号是80或443)。

类比:就像快递单上写的“寄件人电话”和“收件人电话”。

2.包裹编号与签收确认(序号和确认号)

序号(32位):

→ 给数据字节编号,比如发送的第1个字节编号是100,第二个是101,依此类推。

→ 作用:防止数据乱序或丢失(类似给书页标页码)。

确认号(32位):

→ 告诉对方“我已经收到第N号之前的数据,下次请发第N号开始的”。

→ 比如:确认号=150表示“我已收到1~149,请发150开始的”。

类比:快递员送货时,你检查包裹编号并签字确认:“包裹1、2已收到,请送包裹3”。

3.控制标志位(包裹的特殊要求)

URG:紧急数据(比如快递包裹上贴“加急”标签)。

ACK:确认有效(相当于“我已收到你的消息”)。

PSH:催促对方立刻处理(类似“尽快拆包”)。

RST:强制断开连接(突然拒收包裹,终止交易)。

SYN:发起连接请求(“你好,我要寄快递”)。

FIN:礼貌结束连接(“我的包裹发完了,再见”)。

记忆口诀:

URGENT加急,ACK要确认,PSH快处理,RST断连接,SYN打招呼,FIN说再见。

4.流量控制与纠错(窗口和校验和)

窗口大小(16位):

→ 告诉对方“我的仓库还能放多少包裹”(接收缓冲区剩余空间)。

→ 比如:窗口=5000表示“你最多再发5000字节给我”。

校验和(16位):

→ 检查包裹是否损坏(计算数据完整性,发现错误就丢弃)。

类比:仓库管理员说:“我这还能放5箱货,发多了放不下!”(流量控制),同时检查包裹是否破损(校验和)。

5.其他字段

紧急指针(16位):

→ 配合URG标志,标记紧急数据的位置(比如“包裹里第50字节是重要文件”)。

选项(可变长度):

→ 特殊需求(比如协商最大报文段长度MSS)。

6.总结:TCP报文段像一份智能快递

端口号:告诉快递员送给谁。

序号/确认号:确保所有包裹按顺序签收。

控制标志:处理加急、签收、终止等操作。

窗口大小:防止对方“爆仓”。

校验和:防止包裹损坏。

关键点:TCP通过这种精细设计,实现了可靠传输——数据不乱、不丢、不重复,适合重要文件传输(如网页、邮件)。而UDP则像“扔明信片”,不管对方收没收到,适合直播、游戏等实时场景。

官方

源端口号:发送方进程的端口号。

目标端口号:接收端进程的端口号。接收端收到数据段后,根据这个端口号来确定把数据送给哪个应用程序的进程。

序号:发送端为每个字节进行编号,便于接收端正确重组。

当TCP从进程接收数据字节时,把它们分片成数据段存储在发送缓存中,并对每一个字节进行编号。当数据到达目的地后,接收端会按照这个序号把数据重新排列,保证数据的正确性。

确认号:对发送端的确认信息。

接收端响应消息时将会用它来告诉发送端这个序号之前的数据段都已经收到,如确认号是x,就是表示前X-1个数据段都已经收到。

首部长度:用它可以确定TCP首部数据结构的字节长度。一般情况下TCP首部是20字节,但首部长度最大可以扩展为60字节。

控制位:

URG:紧急位。紧急指针有效位。

ACK: 确认位。只有当ACK=1时,确认序列号字段才有效:当ACK=0时,确认号字段无效。

PSH:急迫位。标志位为1时,要求接收方尽快将数据段送达应用层。

RST:重置位。当RST值为1时,通知重新建立TCP连接。

SYN: 同步(连接)位。同步序号位,TCP需要建立连接时将这个值设为1。

FIN: 断开位。当TCP完成数据传输需要断开连接时,提出断开连接的一方将这个值设为1.

窗口大小:说明本地可接收数据段的数目。这个值的大小是可变的,当网络通畅时接收端响应消息会将这个窗口值变大以加快传输速度,当网络不稳定时减小这个值可保证网络数据的可靠传输,TCP中的流量控制机制就是依靠变化窗口的大小实现的。

比如下载速度从一开始的几KB逐渐提升到几MB的过程。

校验和:用来做差错控制。字段检验的范围包括首部和数据这两部分。数据段在发送时和到达目的地时会进行校验和计算,若这两次的校验和一致,则说明数据基本是正确的,否则将认为该数据已被破坏,接收端将丢弃该数据。

紧急指针:和URG配合使用,当URG=1时有效。

选项:在TCP首部可以有多达40字节的可选信息。例如,最大报文段长度MSS (Maximum Segment Size)。

MSS告诉对方

TCP:“我的缓存所能接收的报文段的数据字段的最大长度是MSS个字节。”

三、TCP 三次握手(建立连接)

1. 客户端 → 服务器:“我要连接!”(SYN=1)

2. 服务器 → 客户端:“好的,你准备好了吗?”(SYN=1, ACK=1)

3. 客户端 → 服务器:“准备好了,开始传数据!”(ACK=1)

讲解三次握手的过程

tcp是面向连接的,就是说每次发送数据之前都要和对方建立一条可靠的连接,这个建立连接的过程分为3个步骤,就叫做三次握手。

① 当客户端向服务器发送请求连接的报文时:

Seq序列号=x(x为随机)

SYN=1(表示发送连接请求)

② 服务器端收到客户端发来的请求报文后,同意建立连接,则向客户端发送确认报文:

Seq序列号=y(这时服务器也会产生一个序列号y,和客户端的序号不相关)

Ack确认号=x+1(Seq序列号x+1,表示确认收到了客户端的请求)

ACK=1(表示这是条确认请求)

SYN=1(同时也发送一个建立连接的请求)

③ 客户端进程收到服务端进程的确认后,还要向服务端给出确认,然后连接成功建立:

Seq序列号=x+1(这时客户端的序号为1)

Ack确认号=y+1(表示确认收到了服务器的连接请求)

ACK=1(表示这是确认报文)

打开wireshark,本机连接虚拟机,选择捕获vmnet1网卡否则消息太多,选择tcp协议,观察tcp三次握手的报文。

四、TCP 四次挥手(断开连接)

1. A → B:“我说完了”(FIN=1)

2. B → A:“好的,等我发完剩下的”(ACK=1)

3. B → A:“我也说完了”(FIN=1)

4. A → B:“拜拜!”(ACK=1)

讲解四次挥手的过程(可以用客户端向服务器端请求一个网页举例)

某个应用进程首先调用close,称该端执行“主动关闭”(active close)。该端的TCP于是发送一个FIN分节,表示数据发送完毕。

接收到这个FIN的对端执行 “被动关闭”(passive close),这个FIN由TCP确认。

一段时间后,接收到这个文件结束符的应用进程将调用close关闭它的套接字。这导致它的TCP也发送一个FIN。

接收这个最终FIN的原发送端TCP(即执行主动关闭的那一端)确认这个FIN。

1.第一次挥手:

Client发送Fin + Acknowledgement 给Server端,表示自己要断开连接,这个时候

Client端已经没有数据要发送了。

2.第二次挥手:

Server接收到Client发送的断开请求连接,那么这个时候Server需要发送一个Acknowledgement=1用于确定客户请求断开的信息成功接收了;有时候这个过程也会和第三次握手进行合并,就像上面展示的一样。

3.第三次挥手:

Server如果所有的数据已经接收完毕,这个时候就会发送一个Fin=1,而Acknowledgement=0用于表示Server端已经没有数据要发送了,需要关闭连接。

4.第四次挥手:

Client端需要发送一个Acknowledgement = 1表示这个Client接收到了Server的关闭请求信息,这样一来双方的就都关闭了。

在四次挥手中有一个半关闭的概念,我们如何理解在 TCP 断开连接过程中,有一个半关闭的概念。TCP 一方(通常是客户端)可以终止发送数据,但仍然可以接收数据,称为半关闭

当仅完成两次挥手之后,服务端能否给客户端发送数据呢?

答案是可以。从两个方向去理解

思考

1、为什么是四次挥手不是三次挥手?

因为当服务端还有数据没有传完的情况

2、谁可以中断连接?客户端还是服务端还是都可以?

都可以中断连接

其实在最后一步客户端收到服务端的ACK之后实际上是不会立马关闭连接的,它进入了TIME_WAIT状态,为什么不立即关闭?

为了这种情况: B向A发送 FIN = 1 的释放连接请求,但这个报文丢失了, A没有接到不会发送确认信息,B 超时会重传,这时A在 WAIT_TIME 还能够接收到这个请求,这时再回复一个确认就行了。(A收到 FIN =1 的请求后 WAIT_TIME会重新记时)

另外服务器B存在一个保活状态,即如果A突然故障死机了,那B那边的连接资源什么时候能释放呢?  就是保活时间到了后,B会发送探测信息, 以决定是否释放连接。

为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

答:虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假想网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。

5.常见 TCP 应用

网页(HTTP/HTTPS,端口 80/443)

文件传输(FTP,端口 21 )

邮件(SMTP,端口 25)

远程登录(TELNET,23)

邮件的接收(POP3 110)

dns–域名服务 (53)

mysql数据库 (3306)

五、UDP协议介绍(随性的小弟)

1.无连接

直接发数据,不握手(类似发短信,不用等对方接电话)。

2.不可靠

数据可能丢失(类似明信片,丢了不补发)。

3.速度快

适合实时应用(视频、语音、游戏)。

4.常见 UDP 应用

DNS 查询(端口 53)

视频通话(Zoom、微信通话)

在线游戏(王者荣耀、吃鸡)

六、常见的udp协议端口号

NTP--网络时间协议 123

DHCP--动态主机配置协议 67

SNMP--简单网络管理协议161

TFTP--简单文件传输协议 69

RPC--远程调用协议 111

七、TCP与UDP的不同

1. 连接方式

TCP:像打电话

→ 先拨号(三次握手),确认对方在线才开始聊,挂断时还要说再见(四次挥手)。

UDP:像发微信消息

→ 直接发,不管对方收没收到,也不等回复。

2. 可靠性

TCP:强迫症快递员

→ 必须签收确认,丢件必重发,包裹按顺序送到。

UDP:随性派送员

→ 包裹扔门口就走,丢了不管,顺序乱了不整理。

3. 速度与效率

TCP:稳但慢

→ 因为要确认、排队、重发,像高铁安检——安全但耗时。

UDP:快但可能丢

→ 像外卖小哥跑着送餐,快但汤可能洒。

4. 适用场景

用TCP

✅ 重要文件传输(如合同、软件安装包)

✅ 需要长连接的服务(如网页、远程登录)

用UDP

✅ 实时性优先(如视频通话、吃鸡游戏)

✅ 少量数据查询(如DNS解析)

一句话总结

TCP:可靠的老管家,适合细心活。

UDP:麻利的小哥,适合急活儿。

附:日常类比

官方总结

UDP和TCP协议的主要区别是两者在如何实现信息的可靠传递方面不同:

TCP 是面向连接的传输控制协议;而UDP 提供了无连接的数据报服务。

TCP 具有高可靠性,确保传输数据的正确性,不出现丢失或乱序;UDP 在传输数据前不建立连接,不对数据报进行检查与修改,无须等待对方的应答,所以会出现分组丢失、重复、乱序,应用程序需要负责传输可靠性方面的所有工作。

UDP 具有较好的实时性,工作效率较 TCP 协议高。UDP 段结构比 TCP 的段结构简单,因此网络开销也小。

TCP 协议可以保证接收端毫无差错地接收到发送端发出的字节流,为应用程序提供可靠的通信服务。对可靠性要求高的通信系统往往使用 TCP 传输数据。

TCP 协议传输更加稳定可靠,UDP 协议传输效率更高。这两个协议各有特点,在实际应用 中,根据实际应用的需要,选择不同的传输层协议。


总结

提示:这里对文章进行总结:

实际例子:

访问百度:

1. DNS(UDP) 查询 “www.baidu.com” 的 IP。

2. TCP 三次握手 建立连接。

3. HTTP(TCP) 请求网页数据。

4. TCP 四次挥手 断开连接。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/97192.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/97192.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/97192.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vibe Coding 概念提出者 AndrejKarpathy 谈强化学习。

在预训练时代,关键在于互联网文本。你最需要的是一大批量、多样化且高质量的互联网文档,供模型从中学习。在监督微调(SFT)时代,核心则是对话数据。人们雇佣合同工人为问题撰写答案,类似于你在 Stack Overfl…

OSI模型和TCP/IP模型区别是什么

问题OSI模型和TCP/IP模型区别是什么我的回答OSI和TCP/IP这两个协议栈有几个主要区别:首先,层次结构不同。OSI是七层模型:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。而TCP/IP是四层模型:数据链路层、网络层、传…

ros2与gazebo harmonic机械臂仿真项目Moveit2YoloObb的优化

文章目录 关于项目RVIZ控制Gazebo Harmonic仿真机械臂GraphExecuter创建流程并通过Yolo算法抓取螺栓 关于项目 本文介绍ros2与gazebo harmonic机械臂仿真项目Moveit2YoloObb优化的内容,具体的代码细节就不赘述了,主要还是演示效果,包括RVIZ控…

Linux 系统调优与CPU-IO-网络内核参数调优

1. Linux系统调优1.1 安装工具包在开始监控前,需要确保系统已安装以下工具包,它们是后续操作的基础:sysstat:包含 mpstat、iostat、sar 等核心统计工具iotop:专门监控磁盘 I/O 的进程级工具nethogs:按进程查…

laravel学习并连接mysql数据库,给本地vue项目提供接口

下载laravel laravel下载地址phpstudy_pro\WWW\laravel.env文件 DB_CONNECTIONmysql DB_HOST127.0.0.1 DB_PORT3306 DB_DATABASEclgl //你的数据库名称 DB_USERNAMEroot //你的账号 DB_PASSWORDroot //你的密码安装 Laravel CORS 包 composer require fruitcake/laravel-c…

Mybatis 与 Springboot 集成过程详解

Mybatis 与 Springboot 集成过程详解一. 核心概念与优势二.Mybatis 核心类简介1.MybatisAutoConfiguration2.MapperScans3.MapperScannerRegistrar4.MapperFactoryBean5.Configuration6.MapperRegistry7.MapperProxy 与 MapperProxyFactory7.1核心定位与职责7.22. ​​MapperPr…

prometheus alertmanager 对接飞书

alertmanager 直接配置 飞书 的 webhook ,发现并不满足飞书接口的 json 格式。报错如下levelerror ts2025-08-28T04:57:02.734Z callerdispatch.go:310 componentdispatcher msg"Notify for alerts failed" num_alerts23 err"prometheusalert-webhoo…

『专利好药用力心脑血管健康』——爱上古中医(28)(健康生活是coder抒写优质代码的前提条件——《黄帝内经》伴读学习纪要)

心脏血管三通康,古时丸药精益装。 笔记模板由python脚本于2025-08-26 18:25:03创建,本篇笔记适合喜欢日常保健养生知识的coder翻阅。 学习的细节是欢悦的历程 博客的核心价值:在于输出思考与经验,而不仅仅是知识的简单复述。 Pyth…

在 .NET 8.0 中实现 JWT 刷新令牌

介绍在 Web 开发领域,安全是重中之重。JSON Web Tokens (JWT) 已成为在各方之间安全传输信息的热门选择。然而,在 JWT 过期后,如何维护用户会话并避免频繁登录至关重要。这正是 JWT 刷新令牌应运而生的地方。在本文中,我们将指导您…

深入解析 git push 命令

1. 基础语法 git push 的基本语法如下: git push <远程仓库名> <本地分支名>:<远程分支名> [选项]<远程仓库名>: 通常是 origin(默认的远程仓库名称)。 <本地分支名>:<远程分支名>: 指定要推送的本地分支以及目标远程分支。如果省略远…

UI弹出动画

简介的UI弹出动画 使用方式很简单 挂载到需要弹出的目标 即可 using UnityEngine; using DG.Tweening; using Unity.VisualScripting;/// <summary>/// 简洁的UI动画脚本/// 直接挂载到UI组件上&#xff0c;调用Play()播放缩放弹出动画/// </summary>public class …

PostgreSQL诊断系列(6/6):配置项全景解析——打造你的专属优化清单

&#x1f517; 作为《PostgreSQL诊断系列》的收官之作&#xff0c;今天我们系统梳理 postgresql.conf 中的核心参数&#xff0c;将前5篇的“诊断”转化为“调优”&#xff0c;打造一套生产环境专属的配置模板。 你是否&#xff1a; 不知道哪些参数该调&#xff1f;害怕调错导致…

Flink Slot 不足导致任务Pending修复方案

当前有3个虚拟机节点&#xff0c;每个节点配置的slot节点数量是4&#xff0c;${FLINK_HOME}/conf/flink-conf.yaml 关于slot的配置如下&#xff1a; # The number of task slots that each TaskManager offers. Each slot runs one parallel pipeline. taskmanager.numberOfTas…

亚马逊合规风控升级:详情页排查与多账号运营安全构建

2025年亚马逊掀起的大规模扫号行动&#xff0c;聚焦商品详情页合规性审查&#xff0c;标志着跨境电商合规监管进入严风控时代&#xff0c;此次行动以关键词规范与定价诚信为核心&#xff0c;大量卖家因内容违规遭遇账号停用&#xff0c;对于卖家而言&#xff0c;构建系统化的合…

FISCO-BCOS-Python 模板

基于Python-SDK的FISCO BCOS区块链HelloWorld模板&#xff0c;提供了简单的问候语设置和查询功能。本项目采用现代Python开发实践&#xff0c;包含完整的配置管理、测试框架和项目结构。 快速开始 仓库地址&#xff1a;git clone https://gitee.com/atanycosts/python-fisco-te…

移动端(微信等)使用 vConsole调试console

本文介绍了一种在移动端真机上进行调试的方法——使用VConsole。通过简单的安装步骤和代码配置&#xff0c;开发者可以在移动端直接查看console.log输出&#xff0c;极大提升了调试效率。 摘要生成于 C知道 &#xff0c;由 DeepSeek-R1 满血版支持&#xff0c; 前往体验 >作…

云计算资源分配问题

这里写目录标题一、云计算资源的基本类型二、资源分配的目标三、资源分配的方式四、资源分配的技术与工具五、挑战与优化方向六、实际应用场景举例总结云计算资源分配是指在云计算环境中&#xff0c;根据用户需求、应用程序性能要求以及系统整体效率&#xff0c;将计算、存储、…

深度学习之第二课PyTorch与CUDA的安装

目录 简介 一、PyTorch 与 CUDA 的核心作用 1.PyTorch 2.CUDA 二、CUDA的安装 1.查看 2.下载安装 3.检查是否安装成功 三、PyTorch的安装 1.GPU版本安装 2.CPU版本安装 简介 在深度学习的实践旅程中&#xff0c;搭建稳定且高效的开发环境是一切实验与项目的基础&…

Ubuntu22.04 安装和使用标注工具labelImg

文章目录一、LabelImg 的安装及配置1. 安装2. 配置二、使用1. 基础操作介绍2. 创建自定义标签2.1 修改 predefined_classes.txt2.2 直接软件界面新增3. 图像标注3.1 重命名排序3.2 标注3.2 voc2yolo 格式转换3.3 视频转图片Yolo系列 —— Ubuntu 安装和使用标注工具 labelImgYo…

Jenkins与Docker搭建CI/CD流水线实战指南 (自动化测试与部署)

更多云服务器知识&#xff0c;尽在hostol.com你是否已经厌倦了那个“人肉”部署的重复循环&#xff1f;每一次 git push 之后&#xff0c;都像是一个庄严的仪式&#xff0c;你必须虔诚地打开SSH&#xff0c;小心翼翼地敲下一连串的 git pull, npm install, docker build, docke…