计算机网络总结-运输层TCP协议原理v1.0

TCP主要学习的内容包括两个方面:
基本原理和协议内容与问题分析。
 
1、基本原理主要是明确TCP存在是为了解决什么样的问题存在的,就是可靠传输。
2、协议内容与问题分析,主要是TCP的连接建立与拆除,连接的各个状态,数据发送里面的seq和ack编号。
 
先了解一下TCP是如何实现可靠传输的
1、假设是在可靠的信道上进行传输:
那么发送端数据发送之后,接收端一定可以收到。
可靠信道我们做了什么样的假设呢:
(1)信道上不会出现丢包。
(2)信道上不会有数据错乱。
(3)信道是足够大的,发送端和接收端能够以同样的速率进行收发。
对于这样的情况下,下面这种收发模型就可以解决:
 
2、当信道中有数据错乱(这是经常发生的)时,我们要如何保证数据传输呢?
一个很自然的想法就是引入确认机制,接收到告诉发送端,有没有收到正确的数据。收到了回复ACK,错误的数据回复NAK;发送端根据NAK重新发送数据报文。
这个被称之为自动重传协议(ARQ)。ARQ主要有下面几方面的功能:差错检测、接收方反馈、重传。
 
在rdt2.0中,
1、我们没有考虑到分ACK和NAK数据包也会错乱(注意我们假设了信道不会丢失分组)。
这样接收端无法知道他新收到的分组是原来的分组(NAK情况)还是新的分组(ACK)。
这里面可以引入序号来解决这个问题。
对于我们这样的停等协议,只要一个比特位就够了。
 
 
 
实际上,我们并不需要单独的NAK,我们连续发送两次ACK,发送端就知道上次ACK之后发送的数据没有收到。这样的话ACK本身也引入了序号。
 
 
 3 经过有比特差错还有丢包的信道的可靠数据传输?:rdt3.0
发送的数据会丢失、ack也会发生丢失。
前面我们使用检验和、序号、ACK以及重传的技术。当会有丢包的时候,需要有新的协议:
很自然的想到的是发送后一段时间没有收到ACK则重发,重发的时间就是RTT(往返时延)。这样就引入了冗余数据分组,定时器。
4、提高传输效率
rdt3.0是停等协议,传输效率很低。
引入流水线工作,这样传输协议就能提高效率。这样就需要每个分组都要指定序号,发送和接收端都要缓存多个分组。
解决流水线问题:回退N步,选择重传。
 
基序号:最早的未确认分组的序号
下一个序号:最小的未使用序号
窗口长度为N, GBN也成为滑动窗口协议。如果有丢包或者是超时,发送发根据最早发送的数据包超时定时器重传已发送但是未确认的数据。
GBN响应三种事件
1、上层调用
2、收到ACK。ACK里面的N表示,N之前的所有数据都接收完整
3、定时器。
 
GBN协议里面直接丢弃说是有失序的分组,为什么呢?因为失序的数据不会向上层应用传输,所以也不会回复ACK,所以最终都是会被重传的,所以不需要缓存。
 
 
另外一种方式是选择重传,以提高GBN方式的效率。选择重传只重传那些它怀疑在接收方丢失或受损的分组,而避免了不必要的重传。
发送方:
1、从上层收到数据之后,SR检查可用于发送分组的序号,如果是位于窗口内,则用该序号发送分组。或者是缓存数据,等待发送。
2、超时。每个分组都要有自己的定时器,超时后只发送自己的分组。
3、收到ACK之后。如果ACK序号在窗口内,则发送方讲那个被确认的分组标记为已经接收。如果等于send_base则移动窗口,并发送窗口内未发送的分组。
 
接收方:
1、[rcv_base, rcv_base+N-1]内的分组被正确接收。
2、[rcv_base-N, rcv_base-1]内的分组被正确接收到。必须产生一个ack, 即使该分组已经确认过。
3、其他情况忽略。
发送方和接收方看到的接收窗口并不总是一致的,所以接收方的第2步是很重要的。
从接收方的视角我们看到了如果有序号重复是有问题的,所以必须要保证一个序号不重新使用,知道发送方确认任何先前发送的序号为x的分组都不在网络中为止。通过假定在网络中存活的时间不超过某个时长,可以做到这一点。通常该时长为3分钟。
 
 
 
 
 
 
 
 
 
 
 
posted @ 2017-10-08 20:47  amongv587  阅读(373)  评论(0编辑  收藏  举报