当前位置: 首页 > article >正文

【网络安全】TCP和UDP

一、TCP/UDP对比

1.共同点:

都是工作在TCP/IP体系结构的传输层的协议

工作主要都是把端口号往原始数据封装

在 TCP 协议中,原始数据指的是应用程序产生的需要通过网络进行传输的数据。这些数据可以是各种类型的信息,例如文本、图像、音频、视频等。
 
原始数据通常在应用程序中生成,并被传递给 TCP 协议进行封装和传输。TCP 协议会将原始数据与其他相关信息(如端口号、序列号、校验和等)一起组成 TCP 数据包。

2.区别:

  • TCP是面向连接的协议,而UDP是无连接的协议;
  • TCP协议的传输是可靠的,而UDP协议的传输 “尽力而为”;
  • TCP协议可以实现流控,而UDP不行;

流控:流量控制

我们在发送数据的时候,有的时候发送的太快,有的时候发送的太慢,我们要想办法控制一下这个速度,这点TCP可以做到,而UDP做不到。

流控(3)应该算是传输可靠性(2)中的一环,流量发的快一点或者慢一点,主要目的是保证对方能够正常收到这些信息,能够正常地处理这些信息,并且保证传输效率。所以有流控这个机制在里面,传输也会更可靠一点。

  • TCP可以分段,而UDP不行;

分段:拆分大的数据包

我们发数据的时候,这个数据包有可能很大,因为里面的数据内容有可能很多,TCP可以分段就是可以把这些很大的数据包拆分开,拆成一个一个的小段,然后再去分别发送过去,而UDP不行,多大就多大发。

  • TCP消耗资源较大,传输效率较低。UDP耗费资源较小,速度快;

3.TCP/UDP使用场景

  • TCP协议更适用于对传输可靠性要求较高,但是对传输效率和资源占用要求较低;(网页浏览、电子邮件传输和文件传输等);
  • UDP更适用于对传输效率要求较高,可靠性要求较低的场景;(即时通实现类:语音、视频、聊天、游戏、直播等);

什么是面向连接?

我们可以通过一个小游戏来理解一下:

 TCP面向连接小游戏

在正式传输数据之前,先使用预先的协议(TCP协议),建立点到点的链接。 

A跟B说:你准备好了吗?我要开始扔球了,然后B说:我准备好了。

有了这一来一回,A就可以给B扔球了。A给B的连接就相当于建立好了。这种情况下,A就可以给B扔球了。

如果B也想给A扔球,那B也要A给B说:你准备好了吗?我也要开始扔球了,然后A说:我准备好了。 有了这一来一回,B也可以给A扔球了。

所以数据传输其实是双向的,TCP协议建立好的通信通道其实是双向的,就是A可以给B扔球,小B也可以给A仍球,这个通道就是 “会话”。

什么是会话?

A可以给B发信息,那A就生成一条指向B的会话,B可以给A发信息,那B就生成一条指向A的会话。可以发送信息的这个通道,就可以把他理解为是一个会话。

TCP协议是面向连接的协议,在发送数据之前要先建立连接,而他建立的连接就是建立的一条双向会话。

TCP建立的连接实际建立了一个双向的会话连接,即通讯双方都可以向对方发送数据。

一张很刺激的图片:

2be060e12a4146d2abb209ffb0335b90.png

这张图可以在一定程度上可以反应出来TCP和UDP这两种协议的风格。

  • TCP比较沉稳,面向连接、速度慢、可靠传输;
  • UDP比较奔放,无连接、速度快、不可靠传输;

二、TCP

1.TCP协议头部

 来看一下TCP和UDP这两个协议的包头,上面的图片中写着TCP-20字节头,UDP-8字节头。

往原始数据前面加的数据称之为头部,往后面加的称之为尾部。

TCP和UDP都是只给前面加,所以他们只有头部信息。

我们看一下他们头部都要封装哪些参数,哪些内容。

TCP协议头部:

44fac022fd414fb68edb9bbab9bf2edc.png

数据:从应用诞生传到传输层再加工的数据

其他:都是要TCP再往原数据上再加的数据

  • 源端口号和目的端口号

源端口号和目的端口号用于标识发送方和接收方的应用程序。端口号是一个 16 位的数字,取值范围为 0 到 65535。

 

源端口号是发送方应用程序所使用的端口号,它告诉接收方数据来自哪个应用程序。目的端口号则是接收方应用程序所监听的端口号,用于确定数据应该被传递给哪个应用程序。

 

例如,当你在浏览器中访问一个网页时,浏览器会使用一个随机的源端口号与服务器的 80 端口(HTTP 默认端口)进行通信。

  • 序号:就是扔球游戏中标记的序号,目的是把传输的数据按照顺序排列起来,还原为正常的顺序

序号就如你所说,在 TCP 传输中类似于扔球游戏中的序号标记。它是一个 32 位的数字,用于对每个发送的数据字节进行编号。

 

发送方在发送数据时,会为每个字节分配一个序号。接收方根据序号可以将接收到的数据按照正确的顺序排列起来,确保数据的完整性和顺序性。

  • 确认序号

确认序号是接收方用来告诉发送方已经成功接收到的数据的序号。它是接收方期望收到的下一个数据字节的序号。

 

当接收方成功接收到数据后,会在回复的报文段中设置确认序号,以确认已经收到的数据,并通知发送方可以继续发送后续的数据。

  • 首部长度:因为有(选项)字段的存在,导致头部长度不固定

首部长度表示 TCP 报头的长度,以 32 位字(4 字节)为单位。由于 TCP 报头的长度是可变的,这个字段用于确定报头的结束位置和数据的开始位置

 

首部长度的取值范围为 5 到 15,分别对应 20 字节到 60 字节的报头长度。

  • 保留

保留字段是为了将来的扩展而保留的,目前必须设置为 0。

  • 六个控制位:URG、ACK、PSH、RST、SYN、FIN

每个标记位占一位。0表示未被激活,为1表示已被激活

1.URG:(紧急标记位),要是置1,(紧急指针)就会被激活,里面的内容就会生效,如果数据包中携带需要紧急优先处理的数据,就需要把紧急标志位激活。会把需要紧急处理的数据放在最前面

紧急指针会指示哪些是紧急数据,指针之前的是紧急的数据,后面是常规数据

2.ACK(确认标志位):置1表示确认之前的信息,(确认序号)被激活,小A跟小B扔5号球,小B回复我已经收到5号球了请你扔六号球,小B回复的过程就是确认的过程,所以小B回复的这个数据包里的ACK标志位要置1

3.PSH:数据可以进行分段,然后分别去传输,到对端还有拼回去,所以TCP这个协议建立连接的过程中有一个机制:对端在接受TCP信息的时候,会预留一个缓冲区域。在缓冲区域中把数据段先收集起来,然后按照序号进行排序,把完整在信息提取出来,然后再进行传递。如果置1,则不需要在缓冲区排队了,将被直接推送给进程

4.RST:

5.SYN:(请求标志位)请求建立连接

6.FIN:(结束标记位)想要断开连接

  1. URG(紧急指针标志位):表示报文段中有紧急数据,应尽快传送。
  2. ACK(确认标志位):确认号字段有效,用于确认收到的数据。
  3. PSH(推送标志位):接收方应尽快将报文段交给应用层。
  4. RST(复位标志位):用于复位因某种原因而出现错误的连接。
  5. SYN(同步标志位):在建立连接时使用。
  6. FIN(结束标志位):用于释放连接。
  • 窗口大小

窗口大小是一个 16 位的数字,用于流量控制。它表示接收方愿意接收的字节数,即接收窗口的大小。

 

发送方根据接收方的窗口大小来调整自己的发送速度,避免发送过多的数据导致接收方无法处理。

  • 校验和:确保数据的完整性,每一层都有校验和,但是四层的校验(传输层)相对于其他层的校验,校验强度稍微高一点
    伪头部校验:头部内容和数据内容都要校验,并且包括下一层(网络层)也进行校验
    封装图:

    只是把网络层的一部分拿出来校验,不是全部。一共会把网络层的12个字节拿出来校验:32为源IP地址、32位目标IP地址、8位保留、8位协议、16位总长度
    使用的算法:反码相加法,跟二层的循环冗余法不一样

校验和用于检测 TCP 报头和数据在传输过程中是否出现错误。它是对报头、数据和伪首部进行计算得到的一个 16 位的校验值。

 

接收方在接收到报文段后,会重新计算校验和,并与报文中的校验和进行比较。如果两者不相等,则说明数据在传输过程中出现了错误,接收方会丢弃该报文段。

  • 紧急指针

当 URG 标志位被设置为 1 时,紧急指针指出紧急数据的最后一个字节的序号。它是一个偏移量,与序号字段中的值相加得到紧急数据的位置。

  • 选项

选项字段是可变长度的,用于提供一些额外的功能,如最大报文段长度(MSS)、窗口扩大因子等。选项的长度必须是 4 字节的整数倍,如果不足,则需要填充到 4 字节的整数倍。

所以TCP头部的长度是:20—60字节

2.TCP的三次握手

就是建立连接的过程

  • 建立A指向B的会话

  • 建立B指向A的会话

  • 2、3两个数据包可以用一个数据包完成

所以这个过程称为三次握手


 


http://www.kler.cn/news/327174.html

相关文章:

  • 防止电脑电池老化,禁止usb或者ac接口调试时充电
  • 计算神经学笔记01
  • 后端-对表格数据进行添加、删除和修改
  • 单片机的原理及应用
  • 2024年华为OD机试真题-找终点-Java-OD统一考试(E卷)
  • AIGC学习笔记—minimind详解+训练+推理
  • elasticsearch单个node节点写入数据
  • 中间层架构设计:构建稳健的企业级服务
  • [Day 81] 區塊鏈與人工智能的聯動應用:理論、技術與實踐
  • 表现层架构设计:打造高效、可维护的前端系统
  • JavaScript网页设计案例深度解析:从理论到实践
  • frps+nginx实现访问ip的记录
  • 测试用例_边界值介绍(需求自动化生成用例方法论)
  • 预训练技巧:在训练末尾对领域数据上采样
  • Linux shell脚本set -e的作用详解
  • Linux 性能优化之CPU 多级缓存
  • ip的生命周期是多久
  • el-table添加fixed后错位问题
  • vscode【实用插件】Project Manager 项目管理
  • fastAPI教程:jinja2模板
  • 代码随想录:孤岛类问题
  • python UNIT 3 选择与循环(2)
  • 笔记本电脑如何改ip地址:操作指南与注意事项
  • Avalonia 项目结构说明
  • Elasticsearch 开放推理 API 增加了对 Google AI Studio 的支持
  • 【python进阶攻略12】C扩展
  • 破局汽车智能化浪潮:Tire 1供应商的网络优化与升级策略
  • leetcode|刷算法 线段树原理以及模板
  • 用OpenSSL搭建PKI证书体系
  • react 前端框架中的 三层(service,model,index)具体操作