TCP协议和UDP协议

本文详细介绍了TCP和UDP协议,包括UDP的无连接特性和简单的校验和,以及TCP的可靠传输机制、标志位、流量控制和拥塞控制策略,如慢开始、拥塞避免、快重传和快恢复。重点讨论了TCP如何通过序号、确认号、窗口等确保数据的可靠性,并提及SACK选择性确认技术提高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

传输层

两个主要协议:

  • TCP,传输控制协议
  • UDP,用户数据报协议

请添加图片描述

UDP协议(数据格式、校验和)

  • UDP是无连接的,减少了建立和释放连接的开销
  • UDP尽最大能力交付,不保证可靠交付
  • 因此不需要维护一些复杂的参数,首部只要8个字节(TCP首部至少20个字节)

请添加图片描述

UDP-校验和(checksum)

  • 校验和的计算内容:伪首部(含源IP、目标IP)+首部+数据
    • 伪首部:仅在计算校验和时起作用,不会传递给网络层

请添加图片描述

TCP协议

  • 几个要点
    • 可靠传输
    • 流量控制
    • 阻塞控制
    • 连接管理(建立连接、释放连接)

请添加图片描述

  • TCP首部长度为20字节~60字节
  • 数据偏移
    • 占4位,取值范围(5~15)
    • 首部长度= 数据偏移*4

UDP首部中有个16位字段记录了UDP报文段的长度(首部+数据)

TCP只记录了TCP首部的长度

  • 分析
  • UDP首部中占16位的长度字段完全是冗余的,纯粹为了保证首部是32bit对齐
  • TCP\UDP的数据长度,其实完全可以由IP数据包的首部推断出

TCP-校验和

  • 同UDP一样,TCP的校验和的计算内容:伪首部+首部+数据

TCP标志位(Flags)URG ACK PSH RST SYN FIN

URG(Urgent)
  • URG = 1 时,紧急指针字段才有效。表明当前报文段中有紧急数据,应优先尽快传送
ACK
  • ACK = 1 时,确认号字段才有效
RST(Reset)
  • RST = 1 时,表明连接中出现严重差错,必须释放连接,然后再重新建立连接
SYN**(Synchronization)**
  • SYN = 1、ACK = 0 时,表明这是一个建立连接的请求
  • 若对方同意建立连接,则回复 SYN = 1、ACK = 1
FIN(Finish)
  • FIN = 1 时,表明数据已经发送完毕,要求释放连接

TCP-序号、确认号、窗口

序号(Seq)
  • 在传输过程的每一个字节都会有一个编号
  • 在建立连接后,序号代表:这一次传给对方的TCP数据部分的第一个字节的编号
确认号(Ack)
  • 在建立连接后,确认号代表:期望对方下一次传过来的TCP数据部分的第一个字节的编号
窗口
  • 该字段由流量控制功能,用以告知对方下一次允许发送的数据大小(字节为单位)

TCP-【可靠传输】

可靠传输的目的:为了保证包的完整性,当有丢包、收到三次重复确认等情况,就会重新发包。

实现方式一:停止等待ARQ协议

ARQ(Automatic Repeat Request),自动重传请求

请添加图片描述

请添加图片描述

重传次数

若有个包重传了N次还是失败,会一直持续重传到成功为止吗?

  • 这个取决于系统的设置,有些系统,重传5次还未成功就会发送reset(RST)报文断开TCP连接
    *请添加图片描述
实现方式二:连续ARQ协议+滑动窗口协议

请添加图片描述

问题:

如果接收窗口最多接收4个包,但发送方只发了2个包,接收方如何确定后面还有没有2个包?

  • 等待一定时间后没有第3个包,就会返回确认收到2个包返回给发送方

  • 假设每一组数据是100个字节,代表一个数据段的数据
  • 每一组给一个编号

请添加图片描述

请添加图片描述

SACK(选择性确认)

产生原因:

  1. 在TCP通信过程中,如果发送序列中间某个数据包丢失(比如1、2、3、4、5中3丢失了)
  2. TCP会通过重传最后确认的分组后续的分组(最后确认的是2,会重传3、4、5)
  3. 这样原先已经正确传输的分组也可能重复发送(比如4、5),降低了TCP性能

解决:SACK(Selective acknowledgment,选择性确认)技术

  1. 告诉发送方哪些数据丢失,哪些数据已经提前收到 (参照上图)
  2. 使TCP只重新发送丢失的包(7),不用发送后续所有的分组(8)
SACK信息会放在TCP首部的选项部分

请添加图片描述

  • Kind:占1字节。值为5代表这是SACK选项
  • Length:占1字节。表明SACK选项一共占用多少字节
  • Left Edge:占4字节,左边界
  • Right Edge:占4字节,右边界

请添加图片描述

思考

为什么选择在传输层将数据分为多个段,而不是等到网络层再分片传递给数据链路层?

  • 为了提高重传的性能
  • 需要明确的是:可靠传输是再传输层进行控制
  • 如果在传输层不分段,一旦出现数据丢失,整个传输层的数据都得重传
  • 如果在传输层分了段,一旦出现数据丢失,只需要重传丢失的那些段即可

TCP-[流量控制]

流量控制是点对点 ,端对端两台设备之间

为什么需要流量控制?

如果接收方的缓存区满了,发送方还在疯狂着发送数据

  • 接收方只能把收到的数据包丢掉,大量的丢包会极大地浪费网络资源
  • 所以要进行流量控制

什么是流量控制?

  • 让发送方的速率不要太快,让接收放来得及接收处理

原理

  • 通过确认报文中**窗口字段(win)**来控制发送方的发送速率
  • 发送放的发送窗口大小不能超过接收方的接收窗口大小
  • 当发送方收到接收窗口的大小为0时,发送方就会停止发送数据

请添加图片描述

[流量控制]特殊情况
  1. 一开始,接收方给发送方发送了0窗口的报文段
  2. 后面,接收方又有了一些存储空间,然而在给发送方发送的非0窗口的报文段丢失了
  3. 发送方的发送窗口会一直为0,双方陷入僵局

解决方案:

  • 当发送放收到0窗口通知时,这时发送方停止发送报文
  • 并且同时开启一个定时器,隔一段时间就发个测试报文去询问接收方最新的窗口大小
  • 如果接收的窗口大小还是为0,则发送方再次刷新启动定时器

TCP-[拥塞控制]

何为拥塞控制?

  • 防止过多的数据注入到网络中
  • 避免网络中的路由器或链路过载

拥塞控制是一个全局性的过程

  • 涉及到所有的路由器和主机
  • 涉及降低网络传输有关的所有因素
  • 是大家努力的结果

请添加图片描述

TCP-解决拥塞控制方法

  • 慢开始
  • 拥塞避免
  • 快重传
  • 快恢复

几个概念

  • MSS(Maximum Segment Size):每个段最大的数据部分大小(在建立连接时确定)
  • cwnd(congestion window):拥塞窗口
  • rwnd:接收窗口
  • swnd=min(rwnd,cwnd) 发送窗口
TCP-[拥塞控制]慢开始

cwnd的初始值比较小,然后随着数据包被接受方确认(收到一个ACK)

cwnd然后就成倍增长(指数级)

请添加图片描述

请添加图片描述

TCP-[拥塞控制]拥塞避免

请添加图片描述

ssthresh(slow start threshold):慢开始阈值,cwnd达到阈值,开始拥塞避免(加法增大)

拥塞避免(加法增大):拥塞窗口cwnd缓慢增大,防止网络过早出现拥塞

乘法减小:只要出现网络拥塞,把sshresh减为拥塞峰值的一半,同时执行慢开始算法(cwnd又恢复到初始值)

  • 当出现频繁拥塞时,sshresh值下降的很快
  • 拥塞峰值:拥塞避免(加法增大)出现丢包的cwnd的临界值
TCP-[拥塞控制]快重传,快恢复
  • 快重传

请添加图片描述

  • 快恢复:
    • 当发送放连续收到三个重复确认,说明网络出现拥塞(丢包了)
      • 就执行"乘法减小"算法,把 慢开始阈值(sshresh)减为拥塞峰值的一般
    • 与慢开始不同之处,是不执行慢开始算法,即cwnd现在不恢复到初始值
      • 而是把cwnd值设置为新的sshresh值(减小后的值)
      • 然后开始执行拥塞避免算法(“加法增大”),是cwnd线性增大

快重传+快恢复

请添加图片描述

发送窗口的最大值swnd = min(接收窗口cwnd, 堵塞窗口rwnd)

  • 当 rwnd < cwnd 时,是接收方的接收能力限制发送窗口的最大值
  • 当 cwnd < rwnd 时,则是网络的拥塞限制发送窗口的最大值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值