TCP 数据包格式(zz)
修改浏览权限 | 删除
TCP 提供一种面向连接的、全双工的、可靠的字节流服务。
在一个 TCP 连接中,仅有两方进行彼此通信。广播和多播不能用于 TCP。
TCP 的接收端必须丢弃重复的数据。
TCP 对字节流的内容不作任何解释。对字节流的解释由 TCP 连接双方的应用层解释。
TCP 通过下列方式来提供可靠性:
应用数据被分割成 TCP 认为最适合发送的数据块,称为报文段或段。
TCP 协议中采用自适应的超时及重传策略。
TCP 可以对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。
TCP 的接收端必须丢弃重复的数据。
TCP 还能提供流量控制。
TCP 报文段格式
源端口和目的端口字段——各占 2 字节。端口是传输层与应用层的服务接口。传输层的复用和分用功
能都要通过端口才能实现。
序号字段——占 4 字节。TCP 连接中传送的数据流中的每一个字节都编上一个序号。序号字段的值则
指的是本报文段所发送的数据的第一个字节的序号。
确认号字段——占 4 字节,是期望收到对方的下一个报文段的数据的第一个字节的序号。
数据偏移——占 4bit,它指出 TCP 报文段的数据起始处距离 CP 报文段的起始处有多远。“数据偏移”
的单位不是字节而是 32bit 字(4 字节为计算单位)。
保留字段——占 6bit,保留为今后使用,但目前应置为 0。
紧急比特 URG——当 URG=1 时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应
尽快传送(相当于高优先级的数据)。
确认比特 ACK——只有当 ACK=1 时确认号字段才有效。当 ACK=0 时,确认号无效。
复位比特 RST(Reset) —— 当 RST=1 时,表明 TCP 连接中出现严重差错(如由于主机崩溃或其他
原因),必须释放连接,然后再重新建立运输连接。
同步比特 SYN——同步比特 SYN 置为 1,就表示这是一个连接请求或连接接受报文。
终止比特 FIN(FINal)——用来释放一个连接。当 FIN=1 时,表明此报文段的发送端的数据已发送完毕,
并要求释放运输连接。
窗口字段——占 2 字节。窗口字段用来控制对方发送的数据量,单位为字节。TCP 连接的一端根据设
置的缓存空间大小确定自己的接收窗口大小,然后通知对方以确定对方的发送窗口的上限。
检验和——占 2 字节。检验和字段检验的范围包括首部和数据这两部分。在计算检验和时,要在 TCP
报文段的前面加上 12 字节的伪首部。
紧急指针字段——占 16bit。紧急指针指出在本报文段中的紧急数据的最后一个字节的序号。
选项字段——长度可变。TCP 首部可以有多达 40 字节的可选信息,用于把附加信息传递给终点,或
用来对齐其它选项。
填充字段——这是为了使整个首部长度是 4 字节的整数倍。
TCP 首部的主要选项:
最大报文段长度 MSS(Maximum Segment Size)是 TCP 报文段中的数据字段的最大长度。
MSS 告诉对方 TCP:“我的缓存所能接收的报文段的数据字段的最大长度是 MSS 个字节。”
窗口扩大因子,用于长肥管道。
时间戳,可用于测量往返时延 RTT。
TCP 的数据编号与确认
TCP 协议是面向字节的。TCP 将所要传送的报文看成是字节组成的数据流,并使每一个字
节对应于一个序号。
在连接建立时,双方要商定初始序号。TCP 每次发送的报文段的首部中的序号字段数值表
示该报文段中的数据部分的第一个字节的序号。
TCP 的确认是对接收到的数据的最高序号表示确认。接收端返回的确认号是已收到的数据
的最高序号加 1。因此确认号表示接收端期望下次收到的数据中的第一个数据字节的序号。
为提高效率,TCP 可以累积确认,即在接收多个报文段后,一次确认。
一、TCP 的流量控制
TCP 采用大小可变的滑动窗口进行流量控制。窗口大小的单位是字节。
TCP 报文段首部的窗口字段写入的数值就是当前给对方设置的发送窗口数值的上限。
发送窗口在连接建立时由双方商定。但在通信的过程中,接收端可根据自己的资源情况,随
时动态地调整对方的发送窗口上限值(可增大或减小)。
发送端要发送 900 字节长的数据,划分为 9 个 100 字节长的报文段,而发送窗口确定为 500
字节。
发送端只要收到了对方的确认,发送窗口就可前移。
发送 TCP 要维护一个指针。每发送一个报文段,指针就向前移动一个报文段的距离。
发送端已发送 400 字节的数据,但只收到对前 200 字节数据的确认,同时窗口大小不变。
现在发送端还可发送 300 字节。
发送端收到对方对前 400 字节数据的确认,但对方通知发送端必须把窗口减小到 400 字节。
现在发送端最多还可发送 400 字节的数据。
利用可变窗口大小进行流量控制 双方确定的窗口值是 400
二、慢启动和拥塞避免
发送端的主机在确定发送报文段的速率时,既要根据接收端的接收能力,又要从全局考虑不
要使网络发生拥塞。
因此,每一个 TCP 连接需要有以下两个状态变量:
接收端窗口 rwnd(receiver window) 又称为通知窗口(advertised window)。
拥塞窗口 cwnd(congestion window)。
接收端窗口 rwnd 和拥塞窗口 cwnd
接收窗口 rwnd 这是接收端根据其目前的接收缓存大小所许诺的最新的窗口值,是来自接
收端的流量控制。接收端将此窗口值放在 TCP 报文的首部中的窗口字段,传送给发送端。
拥塞窗口 cwnd(congestion window) 是发送端根据自己估计的网络拥塞程度而设置的窗
口值,是来自发送端的流量控制。
发送窗口的上限值
发送端的发送窗口的上限值应当取为接收端窗口 rwnd 和拥塞窗口 cwnd 这两个变量中较小
的一个,即应按以下公式确定:
发送窗口的上限值=Min[rwnd,cwnd]
当 rwnd < cwnd 时,是接收端的接收能力限制发送窗口的最大值。
当 cwnd < rwnd 时,则是网络的拥塞限制发送窗口的最大值。
慢启动算法的原理
在刚开始发送时,可先将拥塞窗口 cwnd 设置为一个最大报文段 MSS 的数值。
在每收到一个对新的报文段的确认后,将拥塞窗口增加至 2 倍 MSS 的数值。
用这样的方法逐步增大发送端的拥塞窗口 cwnd,可以使分组注入到网络的速率更加合理。
慢启动和拥塞避免算法的实现举例
当 TCP 连接进行初始化时,将拥塞窗口置为 1。图中的窗口单位不使用字节而使用报文段。
慢启动门限的初始值设置为 16 个报文段,即 ssthresh = 16。
发送端的发送窗口不能超过拥塞窗口 cwnd 和接收端窗口 rwnd 中的最小值。我们假定接收
端窗口足够大,因此现在发送窗口的数值等于拥塞窗口的数值。
在执行慢启动算法时,拥塞窗口 cwnd 的初始值为 1,发送第一个报文段 M0。
发送端收到 ACK1(确认 M0,期望收到 M1)后,将 cwnd 从 1 增大到 2,于是发送端可以
接着发送 M1 和 M2 两个报文段。
接收端发回 ACK2 和 ACK3。发送端每收到一个对新报文段的确认 ACK,就把发送端的拥
塞窗口加倍。现在发送端的 cwnd 从 2 增大到 4,并可发送 M4—M6 共 4 个报文段。
发送端每收到一个对新报文段的确认 ACK,就把发送端的拥塞窗口加倍,因此拥塞窗口
cwnd 随着传输次数按指数规律增长。
当拥塞窗口 cwnd 增长到慢开始门限值 ssthresh 时(即当 cwnd = 16 时),就改为执行拥
塞避免算法,拥塞窗口按线性规律增长。
假定拥塞窗口的数值增长到 24 时,网络出现超时(表明网络拥塞了)。
更新后的 ssthresh 值变为 12(即发送窗口数值 24 的一半),拥塞窗口再重新设置为 1,
并执行慢启动算法。
当 cwnd = 12 时改为执行拥塞避免算法,拥塞窗口按按线性规律增长,每经过一个往返时
延就增加一个 MSS 的大小。
乘法减小(multiplicative decrease)
“乘法减小“是指不论在慢启动阶段还是拥塞避免阶段,只要出现一次超时(即出现一次网络
拥塞),就把慢启动门限值 ssthresh 设置为当前的拥塞窗口值乘以 0.5。
当网络频繁出现拥塞时,ssthresh 值就下降得很快,以大大减少注入到网络中的分组
数。
加法增大(additive increase)
“加法增大”是指执行拥塞避免算法后,当收到对所有报文段的确认就将拥塞窗口 cwnd 增加
一个 MSS 大小,使拥塞窗口缓慢增大,以防止网络过早出现拥塞。
进入拥塞避免算法后,拥塞窗口的增大速度由指数增长变为线性增长。
TCP 中默认报文段丢失是由于网络拥塞造成超时而引起的。
“拥塞避免”并非指完全能够避免了拥塞。利用以上的措施要完全避免网络拥塞还是不可能
的。
“拥塞避免”是说在拥塞避免阶段把拥塞窗口控制为按线性规律增长,使网络比较不容易出现
拥塞。
三、TCP 的重传机制
重传机制是 TCP 中最重要和最复杂的问题之一。
TCP 每发送一个报文段,就对这个报文段设置一次计时器。只要计时器设置的重传时间到
但还没有收到确认,就要重传这一报文段。
由于 TCP 的下层是一个互连网环境,IP 数据报所选择的路由变化很大。因而传输层的往返
时延的方差也很大。
往返时延的自适应算法
记录每一个报文段发出的时间,以及收到相应的确认报文段的时间。这两个时间之差就是报
文段的往返时延。
将各个报文段的往返时延样本加权平均,就得出报文段的平均往返时延 RTT。
每测量到一个新的往返时延样本,就按下式重新计算一次平均往返时延 RTT:
平均往返时延 RTT =a*(旧的 RTT)+(1-a)*(新的往返时延样本)
在上式中,0=