UDP/TCP协议基础

165 阅读6分钟

UDP

UDP段格式

image.png
  • 端口号:0 - 2^16-1 (65535),其中0 - 1023 被众多软件占用
  • UDP长度:0 - 2^16-1 (65535)

抓包

image.png

通常,接收端的UDP协议层将收到的数据放在一个固定大小的缓存队列,等待应用提取数据。当应用处理数据速度小于添加新数据速度,就会丢失数据包,而UDP协议层不会报告这种问题。

TCP

TCP段格式

image.png
  • 序号:自己发送包的序号,解决乱序。
  • 确认序号:对方收到包的序号,解决丢包。
  • 状态位:判断连接状态。
    • SYN(发起连接)
    • ACK(回复)
    • RST(重新连接)
    • FIN(结束连接)
  • 窗口大小:作用于发送方的速度匹配服务(即发送方的发送速率与接收方应用程序的读取速率相匹配)。声明接收方自身的处理能力

抓包

image.png

TCP建立连接

三次握手:确认对方能听见我,我能听见对方

image.png

TCP断开连接

四次挥手

image.png

TCP解决顺序问题和丢包问题

TCP协议为了保证顺序性,每一个包都有序号。在建立连接时,会商定双方各自的起始序号,然后按照序号一个个发送。为了保证不丢包,会确认某个序号之前的包都收到了,即累计确认。

  • 假设发送端LastByteSent=7,LastByteAcked=4,5 的ACK丢了,这该怎么办?

超时重试:对每个发送的包都设一个定时器,超过一定时间就重发。这个超时时间必须大于RTT。

自适应重传算法(Adaptive Retransmission Algorithm):TCP通过采样RTT和RTT的波动范围,进行加权平均得到一个值。因为网络状况不断变化,这个值也要不断变化。

  • 假设过一段时间,发送端重新发送5、6、7,接收端只收到5、6,发送ACK=7。发送端当7再次超时时,TCP的策略是超时时间加倍。连续两次超时,就说明网络环境差,不宜频繁发送

  • 假设接收端都收到8、9了7还没来,于是连续发送3个ACK=7。当发送端收到3个重复的ACK,就会不等超时,马上重发,即快速重传机制。

快速重传机制:当接收端收到一个序号大于它所期望的数据包时,就会发送冗余的ACK,但ACK仍然是期望的序号。当发送端收到3个冗余的ACK后,就会在定时器过期前重传此ACK序号的数据包。

TCP流量控制

定义

TCP为它的应用程序提供了流量控制服务(flow-control service)以消除发送方使接收方缓存溢出的可能。流量控制因此是一个速度匹配服务,即发送方的发送速率与接收方应用程序的读取速率相匹配。

原理

TCP通过让发送方维护一个称为接收窗口(receive window)的变量来提供流量控制。通俗地说,接收窗口用于给发送方一个指示——接收方还有多少可用的缓存空间。因为TCP是全双工通信,在连接两端的发送方都各自维护一个接收窗口。

举例

  • 假设主机A通过一条TCP连接向主机B发送一个大文件。主机B为了该连接分配一个接收缓存,并用RcvBuffer来表示其大小。主机B上的应用进程不时地从该缓存中读取数据。我们定义以下变量:
    • LastByteRead: 主机B上的应用进程从缓存读取的数据流的最后一个字节的编号。
    • LastByteRcvd: 从网络中到达的并且已经放入主机B接收缓存中的数据流的最后一个字节的编号。
  • 由于TCP不允许已分配的缓存溢出,下式必须成立:
    • LastByteRcvd - LastByteRead ≤ RcvBuffer
  • 接收窗口用rwnd表示,根据缓存可用空间的数量来设置:
    • rwnd = RcvBuffer - [LastByteRcvd - LastByteRead]
  • 由于该空间是随着时间变化的,所以rwnd是动态的。
image.png image.png

极端情况

  • 假设主机B的接收缓存已满,使得 rwnd=0 。在将 rwnd=0 发给主机A后,主机B没有任何数据要发给主机A。即使之后主机B接收缓存清空,主机A却不知道 (TCP仅当在它有数据或有确认要发时才会发送报文段),这样产生死锁。
    • 为了解决这个问题,发送方会定时发送窗口探测数据包,看是否有机会调整窗口的大小。
    • TCP规范中要求:当主机B的接收窗口为0时,主机A继续发送只有一个字节数据的报文段。这些报文段将会被接收方确认。最终缓存将开始清空,并确认报文里将包含一个非0的rwnd值。
  • 另外,当接收发比较慢时,要防止低能窗口综合征:
    • 只空出几个字节就赶快告诉发送方很快又填满。可以当窗口太小时,不更新窗口,直到一定大小,或者缓存一半为空,才更新窗口。

TCP拥塞控制

网络错综复杂,在这个复杂的网络中,很少有两台主机是直连的。我们发送到网络中的数据,当达到网络中的一个节点时(假设是路由器),它会根据数据包含的地址,帮我们将数据转发到离目的地更近的路由器,或直接转发到目的地。但是,这些路由器不是直接就可以转发的,它们需要先将接收到的数据放入自己的内存(可能还要做一些处理),再从中取出进行转发。

网络中的数据太多,导致某个路由器处理不过来或处理地太慢,这就是网络拥塞

若是对于TCP这种有重传机制的传输协议,当发生数据丢失时,重传数据将延长数据到达的时间;同时,高频率的重传,也将导致网络的拥塞加重。拥塞控制,就是在网络中发生拥塞时,减少向网络中发送数据的速度,防止造成恶性循环;同时在网络空闲时,提高发送数据的速度,最大限度地利用网络资源

定义

TCP发送方也可能因为IP网络的拥塞而被遏制,这种形式的发送方的控制被称为拥塞控制(congestion control)。

原理

  • TCP使用拥塞窗口进行拥塞控制。
  • 拥塞窗口(congestion window)是由发送方计算得出,用来限制发送方发送速率的变量,简称cwnd.
    • 发送方的发送速率大概是cwnd/RTT 字节/秒。
  • 在TCP传输字节流的过程中,TCP发送方会按照cwnd的数值对发送方向网络推入字节的速率进行实时控制,cwnd的值是动态改变的。

发送端的三种状态

慢启动

开始慢慢的,逐渐指数增长

拥塞控制

设一个阈值,超过这个值,平滑向上增长。

快速恢复

发送端收到三次同一个包的ACK,不等超时再重传,直接快速重传。

image.png image.png