TCP数据包格式

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 中默认报文段丢失是由于网络拥塞造成超时而引起的。
“拥塞避免”并非指完全能够避免了拥塞。利用以上的措施要完全避免网络拥塞还是不可能的。
“拥塞避免”是说在拥塞避免阶段把拥塞窗口控制为按线性规律增长,使网络比较不容易出现拥塞。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值