网络编程——TCP可靠传输相关技术

TCP报文格式

源端口、目的端口

各占2个字节,分别写入源端口号和目的端口号。端口号用于区分不同服务

序号

序号占4字节,范围是[0,2^32-1],共2^32(即4 294 967 296)个序号。序号增加到2^32-1后,下一个序号就又回到0。TCP是面向字节流的。在一个TCP连接中传送的字节流中的每一个字节都按顺序编号

确认号

占4字节,是期望收到对方下一个报文段的第一个数据字节的序号。
TCP协议能够实现可靠传输,接收方收到几个数据包后,就会给发送方一个确认数据包,告诉发送方下一个数据包该发第多少个字节了。
若确认号是N,则表明:到序号N-1为止的所有数据都已正确收到。

数据偏移

占4位,它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。这个字段实际上是指出TCP报文段的首部长度。由于首部中还有长度不确定的选项字段,因此数据偏移字段是必要的。但请注意,“数据偏移”的单位为4字节,由于4位二进制数能够表示的最大十进制数字是15,因此数据偏移的最大值是60字节,这也是TCP首部的最大长度,这也就意味着选项长度不能超过40字节。

保留

占6位,保留为今后使用,但目前应置为0。

控制字段

URG:当URG=l 时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据),而不要按原来的排队顺序来传送。

ACK:确认ACK(ACKnowlegment) 仅当ACK=1时确认号字段才有效。当ACK=0时,确认号无效。TCP规定,在连接建立后所有传送的报文段都必须把ACK置1。

PSH:推送PSH(PUSH) 当两个应用进程进行交互式的通信时,有时在一端的应用进程希望在键入一个命令后立即就能够收到对方的响应。与URG相比,PSH管接收端,URG管发送端

RST:复位RST(RESET) 当RST=l时,表明TCP连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。

SYN:同步SYN(Synchronization) 在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若同意建立连接,则应在响应的报文段中使SYN=1和ACK=1。因此,SYN置为1就表示这是一个连接请求或连接接受报文。

FIN:终止FIN(Finish意思是“完”、“终”) 用来释放一个连接。当FIN=1时,表明此报文段的发送方的数据己发送完毕,并要求释放传输连接。

窗口

占2字节。窗口值是[0,2^16-1]之间的整数。TCP协议有流量控制功能,窗口值告诉对方:从本报文段首部中的确认号算起,接收方目前允许对方发送的数据量(单位是字节)。

检验和

占2字节。检验和字段检验的范围包括 首部和数据 这两部分。和UDP用户数据报一样,在计算检验和时,要在TCP报文段的前面加上12字节的伪首部。

紧急指针

占2字节。紧急指针仅在URG=1时才有意义,它指出本报文段中的紧急数据的字节数(紧急数据结束后就是普通数据)。因此紧急指针指出了紧急数据的末尾在报文段中的位置。

选项(长度可变)

最长可达40个字节。当没有使用选项时,TCP的首部长度是20字节。TCP最初只规定了一种选项,即最大报文段长度MSS(Maximum Segment Size)。

停止等待协议

发送一个分组就停止发送等待确认。停止等待协议虽然实现了TCP可靠传输,但是效率太低,发送完分组到接收到确认这段时间都白白浪费掉了。停止等待协议也称为ARQ(Automatic Repeat-reQuest,自动重传请求)。

无差错情况

超时重传

确认丢失

确认迟到

 

连续ARQ协议和滑动窗口协议

可以认为这两种协议是改进版的停止等待协议,这两种协议通常情况下组合使用

滑动窗口技术详解

滑动窗口协议是面向字节流的,为方便解释,假设一个分组100字节。

A是服务器,B是客户端

下图依然满足最基本的停止等待协议,在没有收到B确认时,A中的数据不会删除,如果超时仍没有收到B的确认,A会重传。

SACK

TCP通信时,如果发送序列中间某个数据包丢失,TCP会通过重传最后确认的分组后续的分组,这样原先已经正确传输的分组也可能重复发送,降低了TCP性能。为改善这种情况,发展出SACK(Selective Acknowledgment,选择确认)技术,使TCP只重新发送丢失的包,不用发送后续所有的分组,而且提供相应机制使接收方能告诉发送方哪些数据丢失,哪些数据已经提前收到等。

C/S在建立连接时,双份会互相协商是否支持SACK。

由于TCP首部选项最长40个字节,而指明一个边界需要用掉4个字节(因为序号有32位,需要使用4个字节表示),因此在TCP选项中一次最多只能指明4个字节块的边界信息。这是因为4个字节块有8个边界,一个边界占用4个字节,占用32个字节,另外还需要2个字节,一个字节用来指明是SACK选项,另一个字节指明这个选项占多少字节。

超时重传时间的调整

TCP的发送方在规定的时间内没有收到确认就要重传己发送的报文段。这种重传的概念是很简单的,但重传时间的选择却是TCP最复杂的问题之一。

举个例子:局域网内数据包往返时间很短,假设是1ms,如果2ms还没收到确认数据包,则可以认为丢失,此时超时重传时间2ms就很合理。如果中美两国计算机相互通信,那么数据包往返时间可能数百ms。由此引出问题:传输层的超时计时器的超时重传时间究竟应设置为多大呢?

RTT的测量方法

TCP Timestamp选项

TCP时间戳选项可以用来精确的测量RTT。发送方在发送报文段时把当前时钟的时间值放入时间戳字段,接收方在确认该报文段时把时间戳字段值复制到时间戳回送回答字段。因此,发送方在收到确认报文后,可以准确地计算出RTT来。RTT=当前时间-数据包中Timestamp选项的回显时间。

注意:这种方式目前并没有采用

重传队列中数据包的TCP控制块

在TCP发送窗口中保存着发送而未被确认的数据包,数据包skb中的TCP控制块包含着一个变量, tcp_skb_cbwhen,记录了该数据包的第一次发送时间,当收到该数据包确认,就可以计算RTT,RTT=当前时间-when。这就意味着发送端收到一个确认,就能计算新的RTT。

RTT是随着网络状态动态的变化的,TCP保留了RTT的一个加权平均往返时间RTTs(这又称为平滑的往返时间,S表示Smoothed。因为进行的是加权平均,因此得出的结果更加平滑)。每当第一次测量到RTT样本时,RTTs值就取为所测量到的RTT样本值。但以后每测量到一个新的RTT样本,就按下式重新计算一次RTTs:

新的RTTs=(1-α)×(旧的RTTs)+α×(新的RTT样本)

在上式中,0≤α<l。若α很接近于零,表示新的RTTs值和旧的RTT:值相比变化不大,而对新的RTF样本影响不大,RTT值更新较慢)。若选择α接近于1,则表示新的RTTs值受新的RTT样本的影响较大(RTT值更新较快),RFC2988推荐的α值为1/8,即0.125。用这种方法得出的加权平均往返时间RTTs就比测量出的RTT值更加平滑。

 

 

 

 

 

 

转载于:https://www.cnblogs.com/kelamoyujuzhen/p/10296126.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值