首页 > 其他分享 >tcp和udp的区别

tcp和udp的区别

时间:2024-03-06 23:56:01浏览次数:31  
标签:udp 字节 区别 ACK UDP TCP tcp 连接 客户端

在我们的OSI七层模型或者是四层模型中,我们的传输层始终保持不变,传输层负责定义两台主机进程之间的通信,提供数据传输服务,提供端到端的可靠传输,所以我们需要用到的两个主要的协议是:

TCP协议:传输控制协议,提供面向连接、可靠的数据传输服务,主要提供完整性服务
UDP协议:用户数据协议,提供无连接、尽最大努力交互的服务,不保证数据的可靠性,主要提供及时性服务

TCP协议

TCP协议首部组成:

源端口和目的端口(4个字节

源端口是发送端,目的端口是接收方,各自占2个字节

序号(4个字节)

传送的数据的数据流中每一个字节都拥有自己的序号,序号表示本报文段所发送的数据的第一个字节的序号,代表每次数据发送的位置,每发送一次就累加一次该数据字节数的大小,序号是计算机生成的随机数。

确认号(4个字节)

期望收到对方的下一个报文段数据的第一个字节的序号

数据偏移(4位)

表示数据部分距离报文首部的偏移量,“数据偏移”的计算单位是4个字节,数据偏移量是占四位,那么最大表示为1111,最大1111表示15 x 4= 60个字节,即表示TCP首部最大长度为60个字节,因此“选项”部分最多40个字节。

保留字段(4位)

一般设置为0

标志位(8位)

  • 紧急(URG):URG=1表示紧急指针有效,需要尽快传送,不需要排队直接优先传输
  • 确认(ACK):对已接受数据的确认,默认为0,建立连接后,所以传送的报文都必须将ACK置为1,当ACK=1表示确认号字段有效
  • 同步(SYN):在链接建立时使用,SYN=1,ACK=0表示是一个链接请求,若对方同意建立连接,则响应报文段为SYN=1,ACK=1
  • 推送(PSH):接收 TCP 收到 PSH = 1 的报文段,就尽快地交付接收应用进程,而不再等到整个缓存都填满了后再向上交付。
  • 复位(RST):当 RST = 1 时,表明 TCP 连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。
  • 终止(FIN):FIN = 1 表明此报文段的发送端的数据已发送完毕,并要求释放运输连接。

窗口

窗口值作为接受方让发送方设置其发送窗口的依据,单位为字节(限制是因为接受方的数据缓存空间是有限的)

检验和(占 2 字节)

检验和字段检验的范围包括首部和数据这两部分。在计算检验和时,要在 TCP 报文段的前面加上 12 字节的伪首部。

紧急指针(占 16 位)

指出在本报文段中紧急数据共有多少个字节(紧急数据放在本报文段数据的最前面)。

TCP三次握手和四次挥手

三次握手

第一次握手(SYN=1, seq=x)

客户端向服务端发送了一个TCP 的 SYN 标志位置1的包,指明客户端打算连接的服务器的端口,以及初始序号 X,保存在包头的序列号(Sequence Number)字段里。 发送完毕后,客户端进入 SYN_SEND 状态。

第二次握手(SYN=1, ACK=1, seq=y, ACKnum=x+1)

服务端收到了用户端的请求,同意建立连接,然后服务器发回确认包(ACK)应答。即 SYN 标志位和 ACK 标志位均为1。服务器端选择自己 ISN 序列号,放到 Seq 域里,同时将确认序号(Acknowledgement Number)设置为客户的 ISN 加1,即X+1。 发送完毕后,服务器端进入 SYN_RCVD 状态。

第三次握手(ACK=1,ACKnum=y+1)

客户端收到了服务端同意连接的确认后,再次发送确认包(ACK),SYN 标志位为0,ACK 标志位为1,并且把服务器发来 ACK 的序号字段+1,放在确定字段中发送给对方,并且在数据段放写ISN的+1

发送完毕后,客户端进入 ESTABLISHED 状态,当服务器端接收到这个包时,也进入 ESTABLISHED 状态,TCP 握手结束。

四次挥手

第一次挥手(FIN=1,seq=x)

客户端向服务端发送一个 FIN 标志位置为1的包,表示自己已经没有数据可以发送了,客户端主动释放客户端到服务端的TCP连接。

第二次挥手(ACK=1,ACKnum=x+1)

服务端收到了客户端的请求释放报文,给客户端发送确认报文。从客户端到服务端这个方向上的连接就释放了,TCP连接处于半关闭状态。此时客户端无法发送数据给服务端,但是服务端还可以发送数据给客户端,客户端仍可以接收。

服务器端进入 CLOSE_WAIT 状态,客户端接收到这个确认包之后,进入 FIN_WAIT_2 状态,等待服务器端关闭连接。

第三次挥手(FIN=1,seq=y)

服务端没有数据再发给客户端数据,其应用进程就通知TCP释放连接,并向客户端发送确认报文。服务器释放服务器到客户端的TCP连接,服务器端进入 LAST_ACK 状态,等待来自客户端的最后一个ACK。

第四次挥手(ACK=1,ACKnum=y+1)

客户端接收到来自服务器端的关闭请求,发送一个确认包,并进入 TIME_WAIT状态,等待可能出现的要求重传的 ACK 包。 服务器端接收到这个确认包之后,关闭连接,进入 CLOSED 状态。 客户端等待了某个固定时间(两个最大段生命周期,2MSL,2 Maximum Segment Lifetime)之后,没有收到服务器端的 ACK ,认为服务器端已经正常关闭连接,于是自己也关闭连接,进入 CLOSED 状态。

UDP协议

UDP特点

  • 用户数据报协议UDP(User Datagram Protocol) 是传输层的协议,无连接(即发送数据之前不需要建立连接)。
  • UDP 面向报文传输,不保证可靠交付,同时也不使用拥塞控制,适合多媒体通信的要求。
  • UDP 支持一对一、一对多、多对一和多对多的交互通信。
  • UDP 的首部开销小,只有 8 个字节

首部格式

  • UDP的首部没有“序号”字段,因为UDP协议只需要传输一个数据包,所以不需要序号。
  • 用户数据报 UDP 有两个字段:数据字段和首部字段。首部字段有 8 个字节,由 4 个字段组成,每个字段都是两个字节。

TCP和UDP的区别

面向连接:TCP协议需要建立连接,仅支持一对一通信;UDP协议无需建立连接,支持一对一、一对多、多对一和多对多的交互通信。
可靠传输:TCP协议通过确认应答、连接管理、流量控制、拥塞控制来确保可靠性传输;UDP不保证可靠性传输。
性能效率:TCP协议传输效率慢,需要较多的资源开销。UDP协议传输效率快,需要较少的资源开销。
首部格式:TCP协议的首部需要20-60个字节,UDP协议需要8个字节。
应用场景:TCP要求通信数据可靠(比如文件传输、邮件传输等),UDP适用于哟求通信速度快(如音频、视频等)

标签:udp,字节,区别,ACK,UDP,TCP,tcp,连接,客户端
From: https://www.cnblogs.com/zhengbiyu/p/18057925

相关文章

  • C#lambda与Linq区别
    相同点:都是用于查询和筛选数据的工具。异同点:**1.语法不同:Lambda是一种匿名函数,用于创建委托和表达式树;而Linq是一种查询语句,它使用特定的关键字和语法来查询数据。**2.功能不同:Lambda表达式可用于任何需要委托或表达式树的场合,而Linq语句只能用于查询和筛选数据。**3......
  • 力扣T26与T27的区别
    T27给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。T26你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一......
  • TCP 中的 Delay ACK 和 Nagle 算法
    哈喽大家好,我是咸鱼。今天分享一篇大佬的文章,作者:卡瓦邦噶!文章链接:https://www.kawabangga.com/posts/5845教科书介绍的TCP内容通常比较基础:包括三次握手,四次挥手,数据发送通过收到ACK来保证可靠传输等等。当时我以为已经学会了TCP,但是后来在工作中,随着接触TCP越来越多,我......
  • 在Docker中,stage和step有什么区别?
    在Docker的上下文中,特别是在Dockerfile构建和CI/CD流程中,“stage”和“step”这两个术语具有不同的含义:Stage(阶段):在Dockerfile中,stage(也称为构建阶段或构建阶段目标)是一种构建策略,允许开发者将Docker镜像构建过程分割成多个逻辑部分或阶段。每个阶段定义了一个新的构建环境,可......
  • Wi-Fi BSS和ESS的区别
    基本服务集(BSS)基本服务集(BSS),顾名思义是一个由所有站组成的组或集,它们相互之间进行通信。这里,站点被认为是连接到有线网络的计算机或组件。 扩展服务集(ESS)扩展服务集(ESS),顾名思义是一组BSS或一个或多个相互连接的BSS,以及它们的有线网络。 BSS和ESS之间的区别:......
  • WebAPI中控制器路由和方法路由的区别
    控制器级别的路由:在控制器级别应用路由意味着所有该控制器中的操作都将遵循指定的路由模板。控制器级别的路由通常用于区分不同的API版本或将相关的操作分组到一个URL路径下。控制器级别的路由可以在控制器类上应用,例如:[Route("api/[controller]")][ApiController......
  • 进程退出:SIGINT、SIGTERM和SIGKILL区别
    普通用户使用的信号:信号值      符号      行为2          SIGINT    进程终端,CTRL+C9          SIGKILL   强制终端15         SIGTEM    请求中断20         SIGTOP    停止(挂起)进程CRTL+DSIGINT、SI......
  • 功能测试、自动化测试、性能测试的区别
    按测试执行的类型来分:功能测试、自动化测试、性能测试1.功能测试功能测试俗称点点点测试。初级测试人员的主要测试任务就是执行测试工程师所写的测试用例,记录用例的执行状态及bug情况。与开发人员进行交互直到bug被修复。功能测试理论上是指通过测试来检测系统每个功能是否都能......
  • php7中的三元运算符的区别
    <?php$tmparr=['cover'=>'http://img.immomo.com.cn'];echoisset($tmparr['cover'])."\n";echo!empty($tmparr['cover'])."\n";$rep=isset($tmparr['cover'])&&!empty......
  • while和for和do while区别
    三种循环的区别1、for循环和while循环先判断条件是否成立,然后决定是否执行循环体(先判断后执行)2、do..while循环先执行一次循环体,然后判断条件是否成立,是否继续执行循环体(先执行后判断)for和while的区别1、条件控制语句所控制的自增变量,因归属于for循环的语法结构中,在for循环结......