TCP与UDP:网络协议的技术原理与要点
文章目录
- 1. TCP(传输控制协议)
- 1.1 面向连接
- 1.1.1 三次握手
- 1.1.2 为什么需要三次握手?
- 1.1.3 四次挥手
- 1.1.4 为什么需要四次挥手?
- 1.2 可靠性
- 1.3 有序传输
- 1.4 流量控制
- 1.5 拥塞控制
- 2. UDP(用户数据报协议)
- 2.1 无连接
- 2.2 不可靠性
- 2.3 无序传输
- 2.4 简单
- 3. TCP和UDP的头部结构
- 4. TCP和UDP的应用
- 5. 总结
随着互联网的快速发展,网络协议在数据传输中扮演着重要的角色。TCP(传输控制协议)和UDP(用户数据报协议)是传输层的两种基础协议,它们的主要区别在于可靠性、连接方式和传输速度。本文将详细阐述TCP和UDP的技术原理,特别关注三次握手和四次挥手的过程。
1. TCP(传输控制协议)
TCP是一种面向连接的、可靠的传输协议。其技术原理和要点如下:
1.1 面向连接
TCP在数据传输前需要建立连接。通常采用三次握手(Three-way Handshake)过程来建立连接。在数据传输结束后,通过四次挥手(Four-way Handshake)过程来关闭连接。
1.1.1 三次握手
三次握手的过程如下:
- 客户端发送一个带有SYN(Synchronize Sequence Number)标志的TCP数据包给服务器,表示客户端要求建立连接。此时客户端处于SYN-SENT状态。
- 服务器收到客户端的SYN数据包后,发送一个带有SYN和ACK(Acknowledgement)标志的TCP数据包给客户端,表示服务器同意建立连接。此时服务器处于SYN-RECEIVED状态。
- 客户端收到服务器的SYN+ACK数据包后,发送一个带有ACK标志的TCP数据包给服务器,表示客户端已经准备好接收数据。此时客户端和服务器都处于ESTABLISHED状态,连接建立成功。
1.1.2 为什么需要三次握手?
三次握手的目的是在客户端和服务器之间建立一个可靠的连接,确保双方都准备好进行数据传输。两次握手可能无法确保双方都准备好进行数据传输,原因如下:
-
确保双方的发送和接收能力:在第一次握手时,客户端发送 SYN 包到服务器,表示客户端希望建立连接并具备发送能力。在第二次握手时,服务器回复 SYN+ACK 包,表示服务器同意建立连接并具备发送和接收能力。在第三次握手时,客户端发送 ACK 包,表示客户端具备接收能力。这样,通过三次握手,双方都可以确认对方具备发送和接收能力。
-
防止已失效的连接请求:假设只有两次握手,客户端发送了一个连接请求(SYN 包),但因为网络延迟或其他原因,这个请求在很长时间后才到达服务器。此时,客户端可能已经放弃了这个连接请求,但服务器收到请求后仍然会建立连接,这将导致资源的浪费。使用三次握手时,即使服务器收到了延迟的连接请求并回复 SYN+ACK 包,客户端也不会发送 ACK 包,从而避免了无效连接的建立。
因此,两次握手可能导致不稳定的连接和资源浪费,而三次握手可以确保双方都准备好进行数据传输,从而提高了 TCP 连接的可靠性。
1.1.3 四次挥手
四次挥手的过程如下:
- 当客户端准备关闭连接时,发送一个带有FIN(Finish)标志的TCP数据包给服务器,表示客户端已经完成数据传输。此时客户端处于FIN-WAIT-1状态。
- 服务器收到客户端的FIN数据包后,发送一个带有ACK标志的TCP数据包给客户端,表示服务器已经知道客户端要求关闭连接。此时客户端处于FIN-WAIT-2状态,服务器处于CLOSE-WAIT状态。
- 当服务器完成数据传输后,发送一个带有FIN标志的TCP数据包给客户端,表示服务器也准备好关闭连接。此时服务器处于LAST-ACK状态。
- 客户端收到服务器的FIN数据包后,发送一个带有ACK标志的TCP数据包给服务器,表示客户端已经知道服务器要求关闭连接。此时客户端处于TIME-WAIT状态,等待一段时间后,客户端和服务器都进入CLOSED状态,连接关闭。
1.1.4 为什么需要四次挥手?
为了确保双方都收到关闭连接的通知:在四次挥手过程中,客户端和服务器分别发送 FIN 和 ACK 包来表示它们准备关闭连接。这样可以确保双方都收到了关闭连接的通知,并允许双方在关闭连接之前完成数据传输。
在 TCP 协议中,理论上两次挥手可以关闭连接,但是可能会导致“半开连接”或者数据丢失的问题,因此实际中我们使用四次挥手来关闭连接。
“半开连接”是指一种状态,其中一方认为连接已经关闭,而另一方认为连接仍然打开。这可能发生在只有两次挥手的情况下。例如,如果客户端发送 FIN 包,服务器接收到后立即发送 FIN 包并关闭连接,然后客户端发送 ACK 包。在这种情况下,如果 ACK 包在网络中丢失,那么服务器将认为连接已经关闭,而客户端将认为连接仍然打开,因为它没有收到服务器的 FIN 包。这就是所谓的“半开连接”。
此外,如果服务器在收到客户端的 FIN 包后立即发送 FIN 包并关闭连接,那么服务器可能无法将所有剩余的数据发送给客户端。这可能导致数据丢失。
因此,为了避免“半开连接”和数据丢失,TCP 协议使用四次挥手来关闭连接。在四次挥手过程中,客户端和服务器都会发送 FIN 包和 ACK 包,这样可以确保双方都知道连接将关闭,并且可以在关闭连接之前完成数据传输。
1.2 可靠性
TCP通过序号、确认应答(ACK)、重传、流量控制(滑动窗口)和拥塞控制等机制来确保数据的可靠传输。这意味着在数据丢失或出错的情况下,TCP会自动进行重传。
1.3 有序传输
TCP通过序号对数据进行排序,确保接收方按照发送顺序接收数据。
1.4 流量控制
TCP使用滑动窗口机制来进行流量控制,防止发送方发送速度过快导致接收方处理不过来。
1.5 拥塞控制
TCP采用拥塞控制算法(如TCP Tahoe、Reno、NewReno等)来避免网络拥塞,提高网络传输效率。
2. UDP(用户数据报协议)
UDP是一种无连接的、不可靠的传输协议。其技术原理和要点如下:
2.1 无连接
UDP无需建立连接,发送方可以直接将数据报发送给接收方。这使得UDP在一些场景下具有较低的延迟。
2.2 不可靠性
UDP不提供可靠性保证,因此在数据丢失或出错的情况下,UDP不会进行重传。
2.3 无序传输
UDP不保证数据报的发送顺序,接收方可能会收到乱序的数据。
2.4 简单
UDP协议结构简单,没有复杂的流量控制和拥塞控制机制,因此在某些场景下具有较高的传输速度。
3. TCP和UDP的头部结构
TCP和UDP的头部结构也体现了它们的设计理念和使用场景。
-
TCP头部:TCP头部包含源端口、目标端口、序列号、确认号、数据偏移、保留、控制位(如SYN、ACK、FIN等)、窗口大小、校验和、紧急指针等字段。这些字段用于实现TCP的连接管理、可靠性、流量控制和拥塞控制等功能。
-
UDP头部:UDP头部包含源端口、目标端口、长度和校验和等字段。这些字段相比TCP头部要简单得多,这体现了UDP的简单和快速的设计理念。
4. TCP和UDP的应用
TCP和UDP在互联网中有广泛的应用。许多常见的网络协议和应用都是基于TCP或UDP的。
-
基于TCP的协议和应用:HTTP(超文本传输协议)、HTTPS(安全超文本传输协议)、FTP(文件传输协议)、SMTP(简单邮件传输协议)、POP3(邮局协议3)等。
-
基于UDP的协议和应用:DNS(域名系统)、DHCP(动态主机配置协议)、TFTP(简单文件传输协议)、VoIP(网络电话)等。
5. 总结
TCP和UDP是网络传输层的两种基础协议,它们在互联网中扮演着重要的角色。理解TCP和UDP的技术原理和要点,对于我们来说至关重要。在设计网络应用或解决网络问题时,选择合适的传输协议是非常重要的。
相关文章:
TCP与UDP:网络协议的技术原理与要点
文章目录 1. TCP(传输控制协议)1.1 面向连接1.1.1 三次握手1.1.2 为什么需要三次握手?1.1.3 四次挥手1.1.4 为什么需要四次挥手? 1.2 可靠性1.3 有序传输1.4 流量控制1.5 拥塞控制 2. UDP(用户数据报协议)2…...
vue-office/docx插件实现docx文件预览
1.下包 //预览docx文件 npm install vue-office/docx vue-demi//如果是vue2.6版本或以下还需要额外安装 vue/composition-api2.引入 <template><div>//在src填入文档地址<VueOfficeDocx srchttp://...../xx.docx style"width:80%" rendered"re…...
STM32—控制蜂鸣器(定时器)
目录 1 、 电路构成及原理图 2 、编写实现代码 main.c tim_irq.c 3、代码讲解 4、烧录到开发板调试、验证代码 5、检验效果 此笔记基于朗峰 STM32F103 系列全集成开发板的记录。 1 、 电路构成及原理图 定时器中断是利用定时器的计数功能(向上计数或向下计…...
【React】使用 JSX 为 JavaScript 添加标签
使用 JSX 为 JavaScript 添加标签实际上是将 JSX 语法与 JavaScript 代码结合使用,以描述用户界面。JSX 允许你在 JavaScript 中编写类似 HTML 的结构,并最终由 React 库将其转换为真正的 DOM 元素。以下是将标签引入 JavaScript 以及将 HTML 转化为 JSX…...
Docker构建多平台(x86,arm64)构架镜像
这里写自定义目录标题 背景配置buildx开启experimental重启检查 打包 背景 docker镜像需要支持不同平台架构 配置buildx 开启experimental vi /etc/docker/daemon.json {"experimental": true }或者 重启检查 # 验证buildx版本 docker buildx version# 重启do…...
python爬虫基础-----运算符(第三天)
🎈🎈作者主页: 喔的嘛呀🎈🎈 🎈🎈所属专栏:python爬虫学习🎈🎈 ✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天…...
Itextpdf电子签章
印章 印章是我国特有的历史文化产物,古代主要用作身份凭证和行驶职权的工具。它的起源是由于社会生活的实际需要。早在商周时代,印章就已经产生。如今的印章已成为一种独特的,融实用性和艺术性为一体的艺术瑰宝。传统的印章容易被坏人、小人…...
两台电脑简单的通信过程详解(经过两个路由器,不同网段)
一、eNSP拓扑图 二、配置4台电脑的IP地址、子网掩码、网关地址。 三、配置路由器 注意拓扑图的接口与本博客是否相符,判断以下命令中的ip是否需要修改。 1.AR1-接口对应IP <Huawei>sys #进入系统视图 [Huawei]int g0/0/0 #进入0/0/0接口 [Huawei-GigabitE…...
Java基于微信小程序的助农扶贫系统的研究与实现
博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&#…...
RocketMq方便测试,提供一个controller的接口,支持拉取消息,查看消息内容
通过一个REST API接口动态地启动RocketMQ的消费者,并基于传入的参数(topicName,filterExpression,consumerGroupId)决定要监听哪些消息。在Spring Boot项目中,这通常不是推荐的做法,因为消息消费…...
win10 下Msys2编译FFmpeg的流程方法
安装Msys MSYS2官网 安装... 将\msys64\usr\bin加入环境变量 Mysy2中输入 pacman –Syu pacman –Su pacman -S git patch unzip pacman -S mingw-w64-x86_64-toolchain pacman -S mingw-w64-x86_64-yasm pacman -S mingw-w64-x86_64-SDL2 pacman -S mingw-w64-x86_6…...
用 Delphi 做 FTP 服务器以及如何配置防火墙
使用 Delphi 的 TIdFTPServer 这个控件,做一个 FTP 服务器很简单。可以直接拿官方提供的 FTP Server 的那个 Demo 程序来修改。 本文主要描述如何配置服务器端防火墙 网络环境: 1. 客户端在路由器后面,局域网; 2. 服务器端在路…...
《SQL必知必会第五版》第十四章(组合查询)挑战题
1. 编写 SQL 语句,将两个 SELECT 语句结合起来,以便从 OrderItems表中检索产品 ID(prod_id)和 quantity。其中,一个 SELECT 语句过滤数量为 100 的行,另一个 SELECT 语句过滤 ID 以 BNBG 开头的产品。按产品…...
elasticsearch+kibana安装部分问题:
1.elasticsearch启动问题: 如果elasticsearch开启https登录则第一次启动的时候需要前台启动,前台启动的时候会自己创建相应的token等登录信息,如果是后台启动则没有这些登录信息: ./elasticsearch ━━━━━━━━━━━━━━━━━━━…...
Python---常用的web框架
目录 Django创建Django项目启动Django项目引入APP视图函数例如纯文本JSON格式数据重定向渲染页面返回错误提示 FlaskPyramidTornado Django 特点:Django是一个全功能的Web框架,提供了许多内置的功能和工具,如ORM、表单处理、认证等。它的设计…...
Jenkins Docker 部署指南
Jenkins Docker 部署指南 本文档为您提供了在 Docker 容器中部署 Jenkins 的全面指南,使用的是阿里云的容器镜像服务。请仔细遵循以下步骤以确保成功设置。 前提条件 主机上安装了 Docker。拥有阿里云容器镜像服务的账户。 部署步骤 1. 登录阿里云容器镜像服务…...
海外媒体宣发:商务视频推广数字化变革全解析-华媒舍
在当今数字化时代,商务视频推广正迎来一场革命性的数字化变革。本文将为您解析这场变革的核心元素和相关内容。 商务视频推广 商务视频推广是一种通过视频形式来宣传和推广产品、服务或品牌的方法。传统的推广方式主要是通过文字和图片进行,而商务视频推…...
文件服务: 功能介绍
文章目录 一、需求背景二、核心功能1、功能要求2、非工能要求 三、存储方式四、实现方式五、核心技术 一、需求背景 二、核心功能 1、功能要求 文件上传文件预览文件分片上传文件分片合并文件秒传文件断点续传文件下载 2、非工能要求 高扩展性:方便添加新的存储…...
php 快速入门(二)
一、运算符 1.1 算术运算符 运算描述举例加$a$b-减,负数功能$a-$b*乘$a*$b/除$a/$b%取余$a%$b <?php$s1 3;$s2 5;$res1 $s1$s2;$res2 $s1-$s2;$res3 $s1*$s2;$res4 $s1/$s2;$res5 $s1%$s2;echo $res1."<br>";echo "${res2}<b…...
java面试题|(1)多线程如何停止一个线程?
在Java中,停止一个线程的方法通常有以下几种: 使用标志位停止线程: 这是一种常见的做法,即通过设置一个标志位,在线程的执行体中检查这个标志位,当标志位满足某个条件时,退出线程执行。 class M…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
