写在前面

本文来看下TCP和UDP协议。
我们接触这两个协议最多的应该就是在面试中了,经典题目就是“TCP和UDP有什么区别?”,而最常得到的答案就是TCP是面向连接的,而UDP是面向无连接的。
那么这里的连接到底是什么呢?难道真的是有一条物理上的线在那里吗?当然不是,实际上是这样子的,我们知道,TCP想要建立连接,必须经历三次握手的过程,三次握手其实就是在交换数据,而三次握手之后,双方都会将这些TCP协议本身需要用到的数据使用一定的数据结构维护起来,所以连接其实就是使用一定的数据结构保存的数据,也所以连接其实就是数据了,即连接=数据。那么UDP为什么是无连接的呢,因为它不需要维护这些数据。使用这些数据来维护交互的状态,也就是在逻辑上连接起来了,而绝非物理上的。
TCP维护连接状态的数据都有哪些呢,比如滑动窗口信息,哪些数据发送了没有ack,哪些数据发送了还没有ack,哪些数据还没有发送等。
其他区别:

TCP提供可靠交付,UDP不是
TCP是面向流的,没头没尾,而UDP是基于数据包的,一个个发,一个个收
TCP有拥塞控制,UDP没有

所以啊,可以总结来看,TCP也是一个服务,而程序分为无状态的服务和有状态的服务,很明显TCP是属于有状态的服务了。相对应的UDP就是一个无状态的服务。

1:UDP

UDP全称,user diagram protocol,即用户数据报协议,是一种无连接协议。

1.1:UDP的头

当机器收到一个包之后,物理层首先会拆掉物理层头部,判断MAC地址是否匹配,如果是匹配则交给网际层,网际层获取头部后,发现IP地址匹配,则交给传输层处理,但是到底是交给哪种传输层协议呢,这里需要看IP头部的具体存放使用的是TCP还是UDP的8位协议信息了,这里假定是UDP,数据到达UDP,UDP怎么知道交给哪个应用程序呢?这就需要端口号了,也就是UDP头的如下信息:
在这里插入图片描述
这里也可以看到UDP的头只有8个字节,简单到一塌糊涂。而相比之下TCP的头就要复杂多了。
传输层处理完毕之后,内核的工作也就完成了。接下来只要找到监听了目标端口号的应用程序,交给其处理就行了。

1.2:UDP适用的场景和实例

1.2.1:网络比较好的内网环境

比如像飞鸽,飞秋等内网的聊天工具。

1.2.2:对时延敏感,且对少少量丢包不敏感应用

比如实时对战游戏,属于分秒必争型的,很多职业玩家,为了进一步降低时延甚至会买专业版的鼠标和键盘。如果是使用TCP,可能为了等待上一个没有到达的包,早就被爆头了。
比如直播场景,视频网站,少量的丢包用户其实是没有感知的,特别是直播追求实时性,已经丢失的包就算等到了其实也没有意义了。

1.2.3:应用本身资源少

比如IOT物联网,设备内部可能只是嵌入了一个很小的操作系统,终端系统资源很少,而TCP需要额外存储一些维护连接状态的数据,协议代价比较大。

1.2.4:广播场景

比如DHCP。就算丢包也所谓,重发就行了。

2:TCP

TCP相对于UDP复杂多了,因为TCP要实现流量控制,顺序控制,拥塞控制等,而想要实现这些控制,就需要额外存储相关数据,这些数据自然需要保存在头中,所以,这部分我们先从TCP的头看起。

2.1:TCP头

如下:
在这里插入图片描述

  • 源端口和目标端口
    没得说,最低配了,UDP就是如此。
  • 序号和确认序号
    序号是给包指定顺序的,解决乱序问题。确认序号是用来进行确认哪个序号的包已经收到的,解决包丢失问题。
需要注意:确认序号是来确认哪个序号的包已经收到的,其和序号本身具有顺序是没有任何关系的,
即就算序号本身是随机顺序对确认序号也是没有丝毫影响的。 
  • 常用的状态位们
URG:紧急位,需要被优先发送的包,比如要下一个大文件,但是下载过程中突然取消下载,这个取消下载的消息就应该紧急发送到应用层。
ACK:确认包位,该位置为1时代表时一个确认包
PSH:推送
RST:连接重置包位,跳过四次挥手,直接断开连接
SYN:三次握手建立连接位
FIN:四次回收断开连接位

注意这些状态位的发送会引起双方状态的变更。

  • 窗口大小
    做流量控制,用来告知对方自己的处理能力,别发太快了,也别发太慢了,即改用什么速度来发送数据,就是流控了。
  • 校验和
    UDP也有,最低配了,校验数据的完整性。

2.2:三次握手

  • 为什么是三次?
    既然要建立连接就要确定对方是在的,至少在自己发消息的那一刻是在的,而要确定是在的,就至少需要一个来回,如下:
1:A给B发消息,此时B知道A是在的
2:B给A回消息,此时A知道B是在的 

欸,这么看起来2次握手就够了,但,握手的目的是要建立连接,而建立连接的本质就是数据的交换,这里交换的数据呢就是数据的序号了,当然这个不必过分关心,只要知道是要交换数据来构建维护连接的状态的数据结构就行了。因此不仅要确定对方在,还要确定自己发给对方的数据对方收到了,所以过程就变为如下这样:

1:A给B发消息并携带数据,此时B知道A是在的
2:B给A回消息并携带数据,此时A知道B在的,并且收到了自己的数据
3:A给B回消息并携带数据(此时其实就可以携带业务数据了),B就知道A收到自己的数据了

所以至少需要三次握手。你可能会说万一三次握手之后服务挂了咋办,这咱就控制不了了,只能是尽人事,听天命了。参考图:
v

2.3:四次挥手

按照正常的逻辑断开连接的过程应该是这个样子的:

1:A给B说,我要断开
2:B给A回,好的,我也断开了

这样子其实是有问题的,因为B不能直接断开连接,原因是这个关闭的动作应该由上层应用来被动完成,而非主动完成,因为上层应用还要释放资源等。所以这个过程要变成如下:

1:A给B说,我要断开
2:B给A回,好的,我已经通知上层应用了,等上层应用关闭我再通知你
3:B上层应用调用关闭方法,B再给A回,上层应用已经关闭了,我关闭了啊
4:A给B回,好的,我收到了

这个时候B已经关闭了,但是A还不能关闭,因为B的包可能还在路上,所以要等待所有的包都死翘翘了才关闭,这个时间时2MSL。如果是A很快将端口释放出来,则来自B还在路上的包可能会被新占用了该端口的新应用收到,出现问题,当然现在可以通过时间戳等技术直接识别并丢弃端口上一任主人的包,但这里就相当于是上了个双保险了。

为啥B不用等2MSL呢?因为A主动关闭,这个时候A不会再发业务包出去了,而在四次握手时,因为上层应用还没有释放资源和调用内核的关闭,所以上层应用还是有可能发出新的包的,所以A要等,而B不用等。
为啥是2MSL?一来一回的时间,A主动关闭前可能刚给B发了包,此时A发给B,B响应A,刚好2MSL。

这个过程如下图:
在这里插入图片描述

2.4:TCP状态机

看图重要
在这里插入图片描述

2.5:消息重传和确认

参考这里 。

2.6:滑动窗口

参考这里 。

2.7:拥塞控制

参考这里 。

写在后面

参考文章列表

多知道一点

网络包的单位都有哪些?

网络传输是以包为单位的,二层叫帧,网络层叫包,传输层叫段。我们笼统地称为包。

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

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

相关文章

Qt音乐播放器项目实践:本地持久化与边角问题处理

本音乐播放器完整项目源码(包含各个按钮的图片文件): ly/Project-Code - Gitee.com 一.本地持久化 请注意,学习此部分之前需要读者具有一定的Mysql基础。如果读者能够接受无法本地持久化,那么可以跳过这部分内容,直接去看边角问题处理。我…

基于NB-IoT技术的宠物定位跟踪系统设计#基于STM32\物联网\单片机技术的宠物定位跟踪系统

基于NB-IoT技术的宠物定位跟踪系统设计#基于STM32\物联网\单片机技术的宠物定位跟踪系统在设计基于NB-IoT技术的宠物定位跟踪系统时,首先明确了系统分为感知层、网络层和应用层三个部分。在感知层,考虑到需要获取宠物位置和运动状态,选用GPS定…

【入门级-算法-3、基础算法:递归法】

递归是一种非常重要的算法思想,它指的是函数调用自身的过程。递归通常包含两个主要部分:基线条件(终止条件)和递归条件(调用自身的条件)。 下面通过例子来理解递归算法: 计算阶乘 阶乘的递归定义…

【CS创世SD NAND征文】存储芯片在工业电表中的应用与技术演进

【CS创世SD NAND征文】存储芯片在工业电表中的应用与技术演进1.工业电表的市场背景2.技术方案分析3.核心技术特性3.1.主控芯片:APM32F465VET63.3.存储芯片:CSNP4GCR01-DPW3.3.1. 基本概述3.3.2. 核心特性3.3.3. 优势特点3.3.4 四大管理算法4.存储芯片性能…

建筑施工遮挡场景漏检率↓76%:陌讯动态融合算法实战解析

原创声明 本文为原创内容,技术参数及架构解析引用自《陌讯技术白皮书》,未经授权禁止转载。 一、行业痛点:建筑施工安全监控的 "看得见" 与 "看不准" 建筑施工场景的安全监控长期面临双重挑战:一方面&…

【LeetCode题解】LeetCode 209. 长度最小的子数组

【题目链接】 209. 长度最小的子数组 【题目描述】 【题解】 方法一:滑动窗口 本题可以使用双指针算法,定义两个指针l和r分别表示子数组的开始位置和起始位置,sum数组存储的从l到r区间内所有元素的和。初始状态下,l和r都指向下…

2025-08-21 Python进阶6——迭代器生成器与with

文章目录1 迭代器与生成器1.1 迭代器1.1.1 基本使用1.1.2 手动迭代(带异常处理)1.1.3 自定义迭代器1.2 生成器1.2.1 工作原理1.2.2 斐波那契数列示例1.3 推导式1.3.1 列表推导式1.3.2 字典推导式1.3.3 集合推导式1.4.4 元组推导式(生成器表达…

C++——C++重点知识点复习2(详细复习模板,继承)

目录 模板 函数模板 类模板 非类型模板参数 模板的特化 函数模板特化 类模板的特化 为什么普通函数可以分离? 继承 继承概念 基类和派生类对象赋值转换(切割,切片) 隐藏 派生类的默认成员函数 .复杂的菱形继承及菱形…

python 项目编号 2025821 有关于中英文数据的收集、处理

python专栏记录:前言 批量读取单词 JSON 文件 → 解析出单词、释义、例句、短语 → 数据清洗(去掉特殊符号) → 同步更新到 MySQL 数据库。 内容 import json import pymysql import re import time from pymysql.converters import escape_s…

Document Solutions .NET Bundle 8.2.0

Document Solutions .NET Bundle 8.2.0MESCIUS 的 Document Solutions .NET Bundle 是一套完整的 API 和查看工具,可增强文档处理并提高效率。它包含 Excel、Word、PDF 和图像文档,以及 PDF 查看器、数据查看器和图像查看器的标准许可证。它将强大的 .NE…

在职老D渗透日记day20:sqli-labs靶场通关(第27关)get报错注入 过滤select和union ‘闭合

5.27.第27关 get报错注入 过滤select和union 闭合function blacklist($id) { $id preg_replace(/[\/\*]/,"", $id); //strip out /* $id preg_replace(/[--]/,"", $id); //Strip out --. $id preg_replace(/[#]/,"", $id); //Strip out #. $…

Go 并发编程-channel

channel 文章目录channel简介基本概念类型表示法值表示法操作的特性初始化通道接收元素值Happens before发送值例1核心组件关键执行顺序输出示例(可能顺序)设计要点例2例3关闭通道长度与容量单向通道主要用途增强代码表达性和安全性(最重要的…

开源和免费一样吗?以商城系统为例为您分析~

开源和免费并不完全一样,二者在核心定义、权利范围和实际应用中存在显著区别,具体可以从以下几个方面理解: 1. 核心定义不同开源(Open Source): 指软件的源代码是公开可获取的,任何人都可以查看…

CMOS知识点 MOS管饱和区电流公式

知识点16&#xff1a;同上篇一样&#xff0c;MOS管主要有3个工作区域&#xff1a;截止区&#xff08;Cut-off Region&#xff09;&#xff1a; < &#xff0c;没有沟道形成&#xff0c;几乎没有电流。线性区/三极管区&#xff08;Triode Region&#xff09;&#xff1a; &g…

【集合框架LinkedList底层添加元素机制】

在 Java 集合框架中&#xff0c;LinkedList 与 ArrayList 是两种截然不同的线性表实现。如果说 ArrayList 像一个可以伸缩的“盒子阵列”&#xff0c;那么 LinkedList 就像一条由“节点”串联而成的“双向链条”。今天&#xff0c;我们将深入 LinkedList 的源码&#xff0c;一步…

《P2700 逐个击破》

题目背景三大战役的平津战场上&#xff0c;傅作义集团在以北平、天津为中心&#xff0c;东起唐山西至张家口的铁路线上摆起了一字长蛇阵&#xff0c;并企图在溃败时从海上南逃或向西逃窜。为了就地歼敌不让其逃走&#xff0c;指挥官制定了先切断敌人东西两头退路然后再逐个歼灭…

C6.0:晶体管放大器的原理与应用(基极偏置篇)

将晶体管Q点偏置在负载线中点附近后&#xff0c;如果将一个小的交流信号耦合到基极上&#xff0c;便会产生一个交流的集电极电压&#xff0c;交流集电极电压与交流基极电压波形相似&#xff0c;但是幅度要大了很多&#xff0c;即交流集电极电压是对交流基极电压的放大。本篇学习…

Oracle: cannot decrease column length because some value is too big

1.背景今天项目上查不到数据,查库发现默认20位的字段被改为了200,用的还是char类型&#xff0c;填充了一堆空格 2.知识LENGTH() 函数用于计算字符串字段 长度TRIM() 函数用于去除字符串字段 column 前后的空格&#xff08;默认&#xff09;或指定字符&#xff1a;SUBSTR() 用于…

Elasticsearch 写入全链路:从单机到集群

0. 先把术语摆正 Index&#xff08;索引&#xff09;&#xff1a;逻辑数据集合&#xff0c;≈ MySQL 的库。Document&#xff08;文档&#xff09;&#xff1a;一条 JSON 数据&#xff0c;≈ MySQL 的行。Field&#xff08;字段&#xff09;&#xff1a;文档里的键值&#xff0…

Java多线程编程——基础篇

目录 前言 一、进程与线程 1、进程 2、线程 二、并发与并行 1、并发 2、并行 三、线程调度 1、CPU时间片 2、调度方式 ①时间片轮转 ②抢占式调度 四、线程实现方式 1、继承 Thread 类 Thread的多种构造函数&#xff1a; 2、实现 Runnable 接口 五、线程的核心方法 1、start() …