第21天 UDP 与 TCP 的区别是什么?

一、UDP

⾸先 UDP 协议是⾯向⽆连接的,也就是说不需要在正式传递数据之前先连接起双⽅。然后 UDP
协议只是数据报⽂的搬运⼯,不保证有序且不丢失的传递到对端,并且 UDP 协议也没 有任何控制流量的算法,总的来说 UDP 相较于 TCP更加的轻便

  1. ⾯向⽆连接
    ⾸先 UDP 是不需要和 TCP ⼀样在发送数据前进⾏三次握⼿建⽴连接的,想发数据就可 以开始发送了。 并且也只是数据报⽂的搬运⼯,不会对数据报⽂进⾏任何拆分和拼接操作。
    在发送端,应⽤层将数据传递给传输层的 UDP 协议, UDP 只会给数据增加⼀个 UDP
    头标识下是 UDP 协议,然后就传递给⽹络层了 在接收端,⽹络层将数据传递给传输 层, UDP 只去除 IP 报⽂头就传递给应⽤层,不会任何拼接操作

  2. 不可靠性
    ⾸先不可靠性体现在⽆连接上,通信都不需要建⽴连接,想发就发,这样的情况肯定不可 靠。
    并且收到什么数据就传递什么数据,并且也不会备份数据,发送数据也不会关⼼对⽅是否 已经正确接收到数据了。
    再者⽹络环境时好时坏,但是 UDP 因为没有拥塞控制,⼀直会以恒定的速度发送数据。 即使⽹络条件不好,也不会对发送速率进⾏调整。这样实现的弊端就是在⽹络条件不好的 情况下可能会导致丢包,但是优点也很明显,在某些实时性要求⾼的场景(⽐如电话会 议)就需要使⽤ UDP ⽽不是

  3. ⾼效
    虽然 UDP 协议不是那么的可靠,但是正是因为它不是那么的可靠,所以也就没有 TCP
    那么复杂了,需要保证数据不丢失且有序到达。 因此 UDP 的头部开销⼩,只有⼋字节,相⽐ TCP 的⾄少⼆⼗字节要少得多,在传输数 据报⽂时是很⾼效的。
    两个⼗六位的端⼝号,分别为源端⼝(可选字段)和⽬标端⼝ 整个数据报⽂的⻓度 整个数据报⽂的检验和( IPv4 可选 字段),该字段⽤于发现头部信息和数据中的错误

  4. 传输⽅式
    UDP 不⽌⽀持⼀对⼀的传输⽅式,同样⽀持⼀对多,多对多,多对⼀的⽅ 式,也就是说 UDP 提供了单播,多播,⼴播的功能。

  5. 适合使⽤的场景
    UDP 虽然对⽐ TCP 有很多缺点,但是正是因为这些缺点造就了它⾼效的特 性,在很多实时性要求⾼的地⽅都可以看到 UDP 的身影

二、TCP

TCP 基本是和 UDP 反着来,建⽴连接断开连接都需要先需要进⾏握⼿。在
传输数据的过程中,通过各种算法保证数据的可靠性,当然带来的问题就是相 ⽐ UDP 来说不那么的⾼效

1.头部
对于 TCP 头部来说,以下⼏个字段是很重要的

  • Sequence number ,这个序号保证了 TCP 传输的报⽂都是有序的,对端可以通过序号顺 序的拼接报⽂

  • Acknowledgement Number ,这个序号表示数据接收端期望接收的下⼀个字节的编号是多
    少,同时也表示上⼀个序号的数据已经收到

  • Window Size ,窗⼝⼤⼩,表示还能接收多少字节的数据,⽤于流量控制

  • 标识符

    URG=1 :该字段为⼀表示本数据报的数据部分包含紧急信息,是⼀个⾼优先级数据报 ⽂,此时紧急指针有效。紧急数据⼀定位于当前数据包数据部分的最前⾯,紧急指针标 明了紧急数据的尾部。
    ACK=1 :该字段为⼀表示确认号字段有效。此外, TCP 还规定在连接建⽴后传送的所 有报⽂段都必须把 ACK 置为⼀。
    PSH=1 :该字段为⼀表示接收端应该⽴即将数据 push 给应⽤层,⽽不是等到缓冲区 满后再提交。
    RST=1 :该字段为⼀表示当前 TCP 连接出现严重问题,可能需要重新建⽴ TCP 连 接,也可以⽤于拒绝⾮法的报⽂段和拒绝连接请求。
    SYN=1 :当 SYN=1 , ACK=0 时,表示当前报⽂段是⼀个连接请求报⽂。当
    SYN=1 , ACK=1 时,表示当前报⽂段是⼀个同意建⽴连接的应答报⽂。
    FIN=1 :该字段为⼀表示此报⽂段是⼀个释放连接的请求报⽂

  1. 状态机
    建⽴连接三次握⼿

⾸先假设主动发起请求的⼀端称为客户端,被动连接的⼀端称为服务端。不管是客户端还 是服务端, TCP 连接建⽴完后都能发送和接收数据,所以
TCP 是⼀个全双⼯的协议。 起初,两端都为 CLOSED 状态。在通信开始前,双⽅都会创建 TCB 。 服务器创建完TCB 后便进⼊
LISTEN 状态,此时开始等待客户端发送数据

第⼀次握⼿

客户端向服务端发送连接请求报⽂段。该报⽂段中包含⾃身的数据通讯初始序 号。请求发送后,客户端便进⼊ SYN-SENT 状态

第⼆次握⼿

服务端收到连接请求报⽂段后,如果同意连接,则会发送⼀个应答,该应答中 也会包含⾃身的数据通讯初始序号,发送完成后便进⼊ SYN-RECEIVED 状态

第三次握⼿

  1. 当客户端收到连接同意的应答后,还要向服务端发送⼀个确认报⽂。客户端发完这个报⽂ 段后便进⼊ ESTABLISHED 状态,服务端收到这个应答后也进⼊ ESTABLISHED 状态,此 时连接建⽴成功。
  2. PS:第三次握⼿中可以包含数据,通过快速打开( TFO)技术就可以实现这⼀功能。其 实只要涉及到握⼿的协议,都可以使⽤类似 TFO 的⽅式,客户端和服务端存储相同的 cookie,下次握⼿时发出 cookie 达到减少 RTT 的⽬的
    3.因为这是为了防⽌出现失效的连接请求报⽂段被服务端接收的情况,从⽽产⽣错误。
    4.可以想象如下场景。客户端发送了⼀个连接请求 A ,但是因为⽹络原因造成了超时,这时
    TCP 会启动超时重传的机制再次发送⼀个连接请求 B 。此时请求顺利到达服务端,服务 端应答完就建⽴了请求,然后接收数据后释放了连接

断开链接四次握⼿

TCP 是全双⼯的,在断开连接时两端都需要发送 FIN 和 ACK

第⼀次握⼿

若客户端 A 认为数据发送完成,则它需要向服务端 B 发送连接释放请求。

第⼆次握⼿

B 收到连接释放请求后,会告诉应⽤层要释放 TCP 链接。然后会发送 ACK 包,并进⼊ CLOSE_WAIT 状态,此时表明 A 到 B
的连接已经释 放,不再接收 A 发的数据了。但是因为 TCP 连接是双向的,所以 B 仍旧 可以发送数据给 A

第三次握⼿

B 如果此时还有没发完的数据会继续发送,完毕后会向 A 发送连接释放请求,然后 B 便进⼊ LAST-ACK 状态。
PS:通过延迟确认的技术(通常有时间限制,否则对⽅会误认为需要重传),可以将第⼆ 次和第三次握⼿合并,延迟 ACK 包的发送

第四次握⼿

A 收到释放请求后,向 B 发送确认应答,此时 A 进⼊ TIME-WAIT 状态。该状 态会持续
2MSL(最⼤段⽣存期,指报⽂段在⽹络中⽣存的时间,超时会被抛 弃) 时间,若该时间段内没有 B 的重发请求的话,就进⼊ CLOSED
状态。当 B 收到确认应答后,也便进⼊ CLOSED 状态。

为什么 A 要进⼊ TIME-WAIT 状态,等待 2MSL 时间后才进⼊ CLOSED 状态?
为了保证 B 能收到 A 的确认应答。若 A 发完确认应答后直接进⼊ CLOSED 状态,如果确 认应答因为⽹络问题⼀直没有到达,那么会造成 B 不能正常关闭。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值