【网络安全】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表示确认之前的信息,(确认序号)被激活

3.PSH

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

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

 

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

  • 校验和

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

 

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

  • 紧急指针

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

  • 选项

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

封装图:

2.TCP的三次握手

就是建立连接的过程

  • 建立A指向B的会话

  • 建立B指向A的会话

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

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


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老小孩-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值