xdays

传输层协议tcp/udp

June 06, 2010

一、TCP 和 UDP 分段结构

tcp&udpsegment

1)!顺序号的单位是应用层数据的大小(byte 为单位),也就是说两次 tcp 报文段的顺序号之差就是应用层数据大小(byte 为单位)。!
2)确认号是请求下一个数据包的顺序号。
3)length 字段以 32 位为单位计量。
4)code bits 主要有如下含义:

  • U R G 紧急指针(u rgent pointer)有效
  • A C K 确认序号有效。
  • P S H 接收方应该尽快将这个报文段交给应用层。
  • R S T 重建连接。
  • S Y N 同步序号用来发起一个连接。
  • F I N 发端完成发送任务。

5)urgent pointer 紧急指针:只有当 U R G 标志位置 1 时紧急指针才有效。紧急指针是一个正的偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。带有紧急指针的数据段不必等待缓冲数据而直接发送。

二、可靠传输

1. 序号确认

1)三次握手,建立连接

tcp-3hands-shake

2)四次握手,连接终止

tcp-finish

这里再讨论一个细节:当 A 发送了 FIN 消息,并收到确认时整个连接进入半关闭状态。这时 B 仍能向 A 发送数据,A 仍要接收。当 B 没有数据要发送时就发送 FIN 消息,A 回复 ACK 消息。至此,连接并没有完全释放,A 进入 time-wait 状态。两个 MSL(最长报文寿命)之后,A 进入 closed 状态,连接释放。

3)发送方在发送数据包的同时设置超时计时器,在指定时间内没有收到确认(三种可能:发送丢失,确认丢失和确认延迟)就重新传送报文。

三、提高效率

1)累计确认

只对按序号到达的最后一个分组确认,表示在此之前的分组都已经收到了。

2)缓冲传输

当需要传输不大的数据时,发送端一直等待,直到累计一个大的数据块再传输。

3)流水线传输

不必等待对方确认,发送方可以连续发送多个分组。

4)选择确认 SACK

对没有按顺序到达的,且中间缺少一些序号的数据只传送缺少的那部分数据。这里要用到tcp首部的选项字段。

四、流量控制

1)滑动窗口(tcp 的核心机制)

2)死锁及解决:如果接收方由于接收缓存满向发送方发送零窗口报文,不久有了缓存空间,就向发送发发送 rwnd=400 的报文,但是这个报文在传动过程中丢失,造成死锁。tcp 为每个连接设定一个持续定时器(persistence timer),在收到零窗口的报文后启动它,到期后发送零窗口的探测报文,另一方回应窗口大小,防止死锁。

3)nagle 算法:发送方把第一个字节先发送出去,缓存后面的数据字节。待收到第一字节的确认后,把数据封装成报文发送出去,同时继续缓存,只有收到上一个报文的确认才发送下一个报文。适合发送数据快,网络速度慢的情况。

4)糊涂窗口综合症:当接收端能接收最大报文长度的报文;接收端缓存有一半空间。以上两种情况时才发送数据,提高效率。

5)发送窗口取接收窗口(rwnd)和拥塞窗口(cwnd)中较小的一个。

五、拥塞控制

1)慢开始与拥塞避免

具体协议不写了,只列举重要概念:拥塞窗口(cwnd),传输轮次(transmit round),慢开始门限(ssthresh),AIMD(加法增大乘法减小)算法。

2)快重传和快恢复

快重传指当发送方连续收到三个重复确认后就立即重传重复确认的报文,不必等待超时重传计时器。而重传意味着网络可能拥塞,但是还不一定拥塞,所以重传后执行快恢复算法。与慢开始和拥塞避免不同的是:当慢开始门限(ssthresh)减半后,不是将拥塞窗口置为 1MSS 而是慢开始门限的大小,然后也不是执行慢开始算法,而是执行拥塞避免算法。

3)发送窗口取接收窗口(rwnd)和拥塞窗口(cwnd)中较小的一个。