目录
运输层
运输层概述
运输层端口号、复用与分用的慨念
UDP和TCP的对比
TCP的流量控制
TCP的拥塞控制
TCP四种拥塞控制算法:慢开始,拥塞避免,快重传,快恢复
慢开始和拥塞避免:
快重传:
快恢复:
TCP超时重传时间的选择
超时重传时间RTO应略大于往返时间RTT
- 针对出现超时重传时无法测准往返时间RTT的问题,Karn提出了一个算法:在计算加权平均往返时间RTTs时,只要报文段重传了,就不采用其往返时间RTT样本。也就是出现重传时,不重新计算RTTs,进而超时重传时间RTO也不会重新计算。
- 这又引起了新的问题。设想出现这样的情况:报文段的时延突然增大了很多,并且之后很长一段时间都会保持这种时延。因此在原来得出的重传时间内,不会收到确认报文段。于是就重传报文段。但根据Kan算法,不考虑重传的报文段的往返时间样本。这样,超时重传时间就无法更新。这会导致报文段反复被重传。
- 因此,要对Kan算法进行修正。方法是:报文段每重传一次,就把超时重传时间RTO增大一些。典型的做法是将新RTO的值取为旧RTO值的2倍。
TCP的运输连接管理一TCP的连接建立
TCP的连接建立要解决以下三个问题:
- 使TCP双方能够确知对方的存在:
- 使TCP双方能够协商一些参数(如最大窗口值、是否使用窗口扩大选项和时间戳选项以及服务质量等):
- 使TCP双方能够对运输实体资源(如缓存大小、连接表中的项目等)进行分配。
第三次握手是否多余?
不多余!这是为了防止已失效的连接请求报文段突然又传送到了TCP服务器,因而导致错误。
注意:
- TCP的标准规定,SYN=1的报文不能携带数据,但要消耗掉一个序号。
- TCP的标准规定,普通的确认报文段如果不携带数据,则不消耗序号。
TCP的运输连接管理一TCP的连接释放
若不进行等待 :
TCP报文段的首部格式
- 源端口:占16比特,写入源端口号,用来标识发送该TCP报文段的应用进程。
- 目的端口:占16比特,写入目的端口号,用来标识接收该TCP报文段的应用进程。
- 序号:占32比特,取值范围[0, - 1],序号增加到最后一个后,下一个序号就又回到0。指出本TCP报文段数据载荷的第一个字节的序号。
- 确认号:占32比特,取值范围[0, - 1],确认号增加到最后一个后,下一个确认号就又回到0。
指出期望收到对方下一个TCP报文段的数据载荷的第一个字节的序号,同时也是对之前收到的所有数据的确认。
若确认号=n,则表明到序号-1为止的所有数据都已正确接收,期望接收序号为n的数据。- 确认标志位ACK:取值为1时确认号字段才有效:取值为0时确认号字段无效。
TCP规定,在连接建立后所有传送的TCP报文段都必须把ACK置1。- 数据偏移:占4比特,并以4字节为单位。用来指出TCP报文段的数据载荷部分的起始处距离TCP报文段的起始处有多远。这个字段实际上是指出了TCP报文段的首部长度。
首部固定长度为20字节,因此数据偏移字段的最小值为(0101)
首部最大长度为60字节,因此数据偏移字段的最大值为(1111)- 保留:占6比特,保留为今后使用,但目前应置为0。
- 窗口:占16比特,以字节为单位。指出发送本报文段的一方的接收窗口。
- 校验和:占16比特,检查范围包括TCP报文段的首部和数据载荷两部分。在计算校验和时,要在TCP报文段的前面加上12字节的伪首部。
- 同步标志位SYN:在TCP连接建立时用来同步序号。
- 终止标志位FIN:用来释放TCP连接。
- 复位标志位RST:用来复位TCP连接。
当RST=1时,表明TCP连接出现了异常,必须释放连接,然后再重新建立连接。
RST置1还用来拒绝一个非法的报文段或拒绝打开一个TCP连接。- 推送标志位PSH:接收方的TCP收到该标志位为1的报文段会尽快上交应用进程,
而不必等到接收缓存都填满后再向上交付。- 紧急标志位URG:取值为1时紧急指针字段有效;取值为0时紧急指针字段无效。
- 紧急指针:占16比特,以字节为单位,用来指明紧急数据的长度。
当发送方有紧急数据时,可将紧急数据插队到发送缓存的最前面,并立刻封装到一个TCP报文段中进行发送。紧急指针会指出本报文段数据载荷部分包含了多长的紧急数据,紧急数据之后是普通数据。- 选项:
- 最大报文段长度MSS选项:TCP报文段数据载荷部分的最大长度。
- 窗口扩大选项:为了扩大窗口(提高吞吐率)
- 时间戳选项:
用来计算往返时间RTT
用于处理序号超范围的情况,又称为防止序号绕回PAWS。- 选择确认选项
- 填充:由于选项的长度可变,因此使用填充来确保报文段首部能被4整除(因为数据偏移字段,也就是首部长度字段,是以4字节为单位的)。