Tcp、udp复习笔记

delims 于 2020-08-08 发布

UDP (User Datagram Protocol) 用户数据报协议

UDP首部字段定义,长度单位:字节

字段 源端口 目的端口 长度 校验和
长度 2 2 2 2

源端口: 源端口号。在需要对方回信时选用。不需要时可用全0。

目的端口: 目的端口号,终点交付报文时用到。

长度: UDP用户数据报的长度,其最小值是8(仅有首部)

校验和: 检测UDP用户数据报在传输中是否有错。有错就丢弃。

校验和计算方式

  1. 在UDP用户数据报之前增加12个字节的伪首部
  2. 校验和字段填入 全零
  3. 如果总字节数是奇数,在尾部添加一个全零字节。
  4. 每2个字节一组。按照二进制反码求和的方式计算所有组的和。
  5. 计算结果求反码后填入校验和字段。

伪首部定义如下,长度单位:字节

字段 源IP地址 目的IP地址 0 协议 UDP长度
长度 4 4 1 1 2

第3个字段是全零字段,应该是为了填充为偶数个字节。

协议字段 UDP 是17,TCP 是 6

TCP (Transmission Control Protocol) 传输控制协议

停止等待协议

连续ARQ协议

TCP首部

TCP报文段的首部字段定义如下:长度单位:byte

字段 源端口 目的端口 序号 确认号 偏移保留控制 窗口 校验和 紧急指针 选项
长度 2 2 4 4 2 2 2 2 4n

偏移、保留、控制位定义如下,长度单位:bit

字段 数据偏移 保留 URG ACK PSH RST SYN FIN
长度 4 6 1 1 1 1 1 1

源端口和目的端口号和UDP相似。

序号

确认号

数据偏移、保留、控制位

数据偏移

  1. 占4位,指示数据部分距离起始位置的偏移。说白了就是首部长度。
  2. 偏移量的单位是4字节。偏移量最大值15,所以首部长度最大为 60 字节。
  3. 固定首部是20字节,所以选项长度最大是 40 字节。

保留

  1. 占6位,保留为今后使用。

控制位说明本报文段的性质

字段 说明
紧急 URG (urgent)URG=1时表明本报文中有紧急数据要传送,告诉接收方这段数据很急排队太浪费时间了得插队,接收方会把紧急数据插入到本报文段的最前面。URG需要配置紧急指针使用
确认 ACK (acknowledge) 仅当ACK = 1 时确认号字段才有效。当 ACK = 0 时,确认号无效。TCP规定,在连接建立后所有传送的报文段都必须把ACK置1
推送 PSH PSH (push),当两个应用进程进行交互式的通信时,有时在一端的应用进程希望在键入一个命令后立即就能够收到对方的响应。在这种情况下,TCP就可以使用推送(push)操作。这时,发送方TCP把PSH置1,并立即创建一个报文段发送出去。接收方TCP收到PSH = 1的报文段,就尽快地(即“推送”向前)交付接收应用进程,而不再等到整个缓存都填满了后再向上交付。
复位 RST (reset)当RST = 1时,表明TCP连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。RST置1还用来拒绝一个非法的报文段或拒绝打开一个连接。RST也可称为重建位或重置位。
同步 SYN (SYNchronization) 在连接建立时用来同步序号。当SYN = 1而ACK = 0时,表明这是一个连接请求报文段。对方若同意建立连接,则应在响应的报文段中使SYN = 1和ACK = 1。因此,SYN置为1就表示这是一个连接请求或连接接受报文。
终止 FIN (FINis,意思是“完”、“终”) 用来释放一个连接。当FIN = 1时,表明此报文段的发送方的数据已发送完毕,并要求释放运输连接。

窗口

校验和

紧急指针

选项

TCP 可靠传输的实现 - 以字节为单位的滑动窗口

TCP - 超时重传时间的选择

重传很简单,但是如何设置一个合适超时重传时间是个复杂的问题。设置的时间太短,会引起不必要的重传,增大网络的负荷,设置的时间太长,会使网络空闲时间增大,降低传输效率。

报文往返时间RTT,一个报文从发出到收到确认的时间差。

加权平均往返时间 RTT<font size:8>s</font>,第一测量取RTT,以后每测量一次RTT,按照如下公式计算:

新RTTS = (1-α) * 旧RTTS + α * 新RTT

RFC 2988推荐的α值为1/8

超时计时器设置的超时重传时间 RTO (RetransmissionTime-Out)应略大于上面得出的加权平均往返时间RTTS

RTO = RTTS + 4 * RTTD

而RTTD是RTT的偏差的加权平均值,它与RTTS和新的RTT样本之差有关

RTTD = (1-β) * 旧RTTD + β * | RTTS - 新RTT |

β的推荐值是1/4,即0.25

报文重传后计算RTT样本无法得知是之前的报文的确认还是重传后的报文的确认。

Karn提出了一个算法:在计算加权平均RTTS时,只要报文段重传了,就不采用其往返时间样本。这样得出的加权平均RTTS和RTO就较准确。

按照这种方式如果报文段的时延突然增大了很多,超时时间无法更新也不行。

改进的Karn算法:报文段每重传一次,就把超时重传时间RTO增大一些。典型的做法是取新的重传时间为2倍的旧的重传时间。当不再发生报文段的重传时,才根据公式计算超时时间。

选择确认SACK

利用滑动窗口实现流量控制

发送方,接收方说多了容易乱,我们用AB来代替。假设A是发送方,B是接收方。A正在给B传送数据。

  1. A发一个数据报给B,序号是x ,长度 100。
  2. B收到后给A一个确认,并告诉我A:你发给我的序号x长度100的数据报我收到了,我还有200个字节的接收缓存空间,我想收到的下一个序号x + 100 + 1。
  3. A很听话,调整好自己的发送窗口,信心满满的发给B 序号x+100+1,长度200的数据报。
  4. B收到后,告诉A:我收到了,但是缓存满了,你先别发了。
  5. A听到B缓存满了,只好等待B有接收缓存后,再继续发。
  6. B有了缓存空间后,想告诉A我有缓存了,你继续发吧。但是该数据报丢失了。
  7. A无法收到,所以一直等啊等,等了很久后依然没收到。A心里想:B怎么没动静了,是不是睡着了?
  8. A等不及了,主动发起一个数据报询问B:你到底怎么回事了?这么长时间了,还没有缓存空间吗?
  9. B看到A主动来问了,赶紧告诉我A:我有缓存空间了。
  10. A看到B有缓存了,又开心的发数据了。

拥塞控制的方法

慢开始和拥塞避免

	发送窗口 = min(rwnd,cwnd)

几种拥塞控制的方法

慢开始(slow-start)

拥塞避免(congestion avoidance)

快重传(fast retransmit)

快恢复

随机早期检测RED