首页 > 代码库 > TCP(一)
TCP(一)
传输控制协议TCP
特点:1,面向连接的运输层协议
2,每一条TCP只能有两个端点。点对点
3,TCP是可靠的,无差错,不重复,顺序到达。
4,全双工,允许通信双方进程在任何时候都能收发数据。
5,面向字节流。无结构字节流。
TCP连接
每一条TCP连接的两端是套接字。
套接字的格式:IP地址:端口号
理想传输的特点:传输信道不产生差错,不管发送方以多块的速度发送数据,接收方总来得及处理。
停止等待协议
停止等待就是每发送完一个分组就停止发送,等待对方确认收到确认后再发送下一个分组。
出现差错
A只要超过一段时间仍然没有收到确认,就认为刚才发送的分组丢失了。因而重传前面发送过的分组。这就是超时重传。每发送完就设置一个超时计时器。如果在超时之前收到确认,就撤销计时器。
注意:1,A在发送完一个分组后,必须暂时保留已发送的分组的副本,只有收到确认时,才清楚副本。
2,分组和确认进行编号。
3,超时计时器设置的重传时间应该比数据在分组传输的平均往返时间长一些。
3确认丢失和确认迟到
1,丢弃重复的分组M2,不向上层交付
2,向A发送确认。不能认为已经发送过了就不发送,
信道利用率
A发送分组所需时间TD,B发送确认分组时间TA。A经过TD+RTT+TA后就可以再发送下一个分组。RTT是往返时间。
信道利用率=TD/TD+RTT+TA
为了提高传输效率,发送方可以不适用停止等待协议,而是采用流水线传输。使用流水线传输时,就要使用连续ARQ协议和滑动窗口协议。
连续ARQ协议
发送方每收到一个确认,就把发送窗口向前滑动一个分组的位置。接收方一般采用累积确认方式,不用逐个确认,在收到几个分组后,对按序到达的最后一个分组发送确认。
优点:丢失不必重传
缺点:不能向发送方反映出接收方已经确认正确收到的所有分组的信息。
TCP报文首部
TCP面向字节流,但传输的单元是报文段。一个TCP报文段分为首部和数据两部分。TCP的全部功能体现在首部的各字段。
TCP首部前20个字节固定。后面4N字节根据需要增加,TCP首部最小为20字节。
首部各个字段:
1,源端口和目的端口,各两字节。
2,序号,4字节,范围[0,2^32-1]。在TCP连接中传送的字节流中的每一个字节都按照顺序编号。例如一个报文段序号是300,数据位100字节,则最后一个字节的序号是400。下一个报文的数据序号从401开始,一直到2^32-1结束,重新从0开始。
3,确认号,4字节,期望收到对方下一个报文段的第一个数据字节的序号。比如发送序号为100-200的数据,那么期望收到的序列号应该是201,收到确认号为N,表明N-1为止的所有数据都正常收到。
4,数据偏移,4位,指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。实际指出了TCP报文段首部长度。数据偏移的单位是32位字,也就是4字节。4位二进制最大为15,因此偏移最大为60字节。TCP首部最大的长度。
5,保留,6位,全为0
6,紧急,URG=1表明紧急指针有效,高速系统此报文中有紧急数据,尽快传送。
7,确认ACK,当ACK=1时,确认号有效,ACK=0确认号无效。在连接建立后,ACK设置为1。
8,推送PSH,两个应用进程进行交互,在一端的应用进程希望在键入一个命令后立即就收到对方的响应。
9,复位RST,RST=1,连接中出现严重差错,释放连接,重新建立连接。
10,同步SYN,连接建立时用同步序号,当SYN=1时而ACK=0,表明是一个请求报文段。若对方同意建立连接,响应报文段中应该使SYN=1,ACK=1。因此SYN=1就是表示这是一个连接请求或接受报文。
11,终止FIN,释放连接。FIN=1表明报文段已经发送完毕没要求释放连接。
12,窗口,2字节,窗口值,[0,2^16-1]之间的整数。窗口值作为接收方让发送方设置其发送窗口的依据。
确认号是100,窗口是1000,表示从101开始,还有1000个字节数据的接收缓存空间。
窗口字段表明现在允许对方发送的数据量,是动态变化的。
13,检验和,2字节。检验范围包括首部和数据。检验时,在TCP报文段前面加上12字节伪首部。
14,紧急指针,2字节,URG=1有意义。指出本报文段中的紧急数据字节数。指出了紧急数据的末尾在报文段中的位置。窗口为0也可以发送紧急数据。
15,选项,长度可变,最长40字节。
最大报文段长度MSS,是每一个TCP报文段中的数据字段的最大长度。
TCP可靠传输的实现
以字节为单位的滑动窗口
假定A收到了B发来的确认报文段,其中窗口是20字节,而确认号是31。表明:B期望收到下一个序号是31,而序号30为止的数据已经收到了。
A发送窗口,在没有收到B的确认的情况下,A可以连续把窗口内的数据发送出去,凡是已经发送过的数据,在未收到确认之前都必须暂时保留,以便超时重传。
发送窗口里面的序号表示允许发送的序号,窗口越大,发送方就可以在收到对方确认之前连续发送更多的数据,因而可能获得更高的传输效率。但接收方必须来得及处理这些收到的数据。
发送窗口后面的部分表示已经发送且得到了确认,不需要保留。发送窗口前沿的前面部分表示不允许发送的,接收方没有为这部分数据保留临时缓存空间。
发送窗口后沿窗口变化分两种,不动(没有收到新的确认),前移(收到新的确认)。后沿不可能向后移动。
发送窗口前沿可能向前移动和不动,没有收到确认,窗口不变。收到新的确认,但对方通知的窗口缩小了,使得发送窗口前沿正好不动。
发送窗口前沿也可能向后收缩。发生在对方通知的窗口缩小了,但TCP标准强烈不建议这样。
描述发送窗口的状态
P3-P1=A的发送窗口
P2-P1=已发送但尚未收到确认的字节数
P3-P2=允许发送但尚未发送的字节数
B收到了序号为32和33,这些数据没有按序到达,因为序号为31的数据没有收到,B只能对按序收到的数据中的最高序号给出确认,因此B发送的确认报告段中的确认号仍然是31,而不是32或33。
假设B收到了序号31,并把31-33的数据交付主机,然后B删除这些数据。接收窗口向前移动3个序号,同时给A发送确认,窗口值仍为20,但确认号为34.表明已经收到33为止的数据,同时还收到37,38,40的数据。但这些都没有按序到达,只能暂存在接收窗口中。A收到B确认后,可以把发送窗口向前滑动3个序号,P2不动,可用窗口增大了。可发送范围42-53
A继续发送完42-53数据,P2和P3重合,窗口序号用完,没有收到确认,可用窗口为0.在没有接收到确认情况下,A经过一段时间后,重传这部分数据。直到收到确认为止。
发送缓存
用途:1,发送应用程序传送给发送方TCP准备发送的数据。 2,TCP已发送出但尚未收到确认的数据。
发送窗口通常只是发送缓存的一部分,已经被确认的数据在发送缓存中删除。发送缓存和发送窗口后沿是重合的。
接收缓存
用途:1,按序到达的,但尚未被接收应用程序读取的数据。 2,未按序到达的数据。
注意
1,同一时刻,A的发送窗口并不总和B的接收窗口一样大。
2,对于不按序到达的数据,TCP标准无明确规定。
3,TCP要求接收方必须有累计确认的功能,减小传输开销。
超时重传时间的选择
TCP采用了自适应法,记录一个报文段发出的时间,以及受到相应的确认时间。两个时间差就是报文段的往返时间RTT。RTT的一个加权平均往返时间RTTs。以后每测量一个新的RTT样本就按照下式重新计算一次RTTs
新的RTTs=(1-a)*(旧的RTTs)+a*(新的RTT样本)
0<=a<1,若a很接近0,表示新的RTTs和旧的RTTs值相比变化不大。如果接近于1,影响较大。
超时重传时间RTO应略大于上面得出的加权平均往返时间RTTs。
RTO=RTTs+4*RTTd
RTTd是RTT的偏差的加权平均值。与RTTs和新的RTT样本之差有关。
在第一次测量时,RTTd值为测量到的RTT样本值的一半,在以后的测量中,使用公式
RTTd=(1-b)*(旧的RTTd)+b*|RTTs-新的RTT样本|
这里b是个小于1的系数,推荐值是1/4。
选择确认SACK
当字节块不连续送到的时候,应该只重传缺少的。可以把字节块的范围进行标记。
如果要使用选择确认,那么在建立TCP连接时,就要在TCP首部的选项加入允许SACK的选项,双方都商定好。
TCP流量控制
利用滑动窗口实现流量控制
主要功能让发送方发送的速率不要太快,让对方来得及接收。
A向B发送数据。在链接时,B告诉A,我的接收窗口rwnd=400。所以,发送方的发送窗口不能超过接收方给出的接收窗口的数值。TCP的窗口单位是字节,不是报文段。
TCP为每一个连接设有一个持续计时器,只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器,若持续计时器设置的时间到期,就发送一个零窗口探测报文段,如果仍是零窗口,那么就重新设置持续计时器,如果不是零就打破了死锁僵局。
TCP发送报文时机
1,TCP维持一个变量等于MSS,最大报文段长度。只要缓存中存放的数据达到MSS字节,就组成一个TCP报文发送出去。
2,由发送方的应用进程指明要求发送报文段,TCP支持的推送操作。
3,发送方的一个计时器期限到了,当前缓存装入报文段发送,但不超过MSS。
TCP广泛使用的Nagle算法
发送进程要把发送的数据逐个字符送到tcp的发送缓存,则发送方先把第一个数据字节发出去,后面到达的都缓存起来。当第一个确认后,再发送缓存中所有的数据组成报文发送,同时对后续进行缓存。只有在收到前一个的确认,才发送下一个报文。还规定,当到达的数据已经达到发送窗口大小的一半或报文最大长度,就立即发送一个报文段。
解决糊涂窗口综合征:
让接收方等待一段时间,使得或者接收缓存已经足够空间容纳一个最长的报文段,或者等到接收缓存已有一半空闲的空间。
TCP(一)