您的位置:首页 > 理论基础 > 计算机网络

TCP/IP 详解 学习笔记2

2016-08-02 21:37 489 查看

T F T P ( Trivial File Transfer Protocol)即简单文件传送协议,最初打算用于引导无盘系统通常是工作站或X终端)。和将在第2 7章介绍的使用T C P的文件传送协议( F T P)不同,为了保持简单和短小, T F T P将使用U D P。T F T P的代码(和它所需要的U D P、I P和设备驱动程序)都能适合只读存储器。

最大报文段长度( M S S)表示T C P传往另一端的最大块数据的长度。当一个连接建立时,连接的双方都要通告各自的M S S。

当T C P发送一个S Y N时,或者是因为一个本地应用进程想发起一个连接,或者是因为另一端的主机收到了一个连接请求,它能将M S S值设置为外出接口上的M T U长度减

去固定的I P首部和T C P首部长度。

T C P提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力。这就是所谓的半关闭。

没有半关闭,需要其他的一些技术让客户通知服务器, 客户端已经完成了它的数据传送,但仍要接收来自服务器的数据。使用两个T C P连接也可作为一个选择,但使用半关闭的单连接更好。

T I M E WA I T状态也称为2 M S L等待状态。每个具体T C P实现必须选择一个报文段最大生存时间M S L(Maximum Segment Lifetime)。它是任何报文段被丢弃前在网络内的最长时间。我们知道这个时间是有限的,因为T C P报文段以I P数据报在网络内传输,而I P数据报则有限制其生存时间的T T L字段。

T C P在重启动后的M S L秒内不能建立任何连接。这就称为平静时间(quiet time)。

对于U D P,,当一个数据报到达目的端口时,该端口没在使用,它将产生一个I C M P端口不可达的信息。而T C P则使用复位。

我们在1 8 . 2节中看到终止一个连接的正常方式是一方发送F I N。有时这也称为有序释放(orderly release),因为在所有排队数据都已发送之后才发送F I N,正常情况下没有任何数据丢失。但也有可能发送一个复位报文段而不是F I N来中途释放一个连接。有时称这为异常释放(abortive release)。

异常终止一个连接对应用程序来说有两个优点:

(1)丢弃任何待发数据并立即发送复位报文段;

(2)R S T的接收方会区分另一端执行的是异常关闭还是正常关闭。应用程序使用的A P I必须提供产生异常关闭而不是正常关闭的手段。

两个应用程序同时彼此执行主动打开的情况是可能的,尽管发生的可能性极小。每一方

必须发送一个S Y N,且这些S Y N必须传递给对方。这需要每一方使用一个对方熟知的端口作为本地端口。这又称为同时打开(
simultaneous open)。

当出现同时打开的情况时,状态变迁与图1 8 - 1 3所示的不同。两端几乎在同时发送S Y N,并进入S Y N S E N T状态。当每一端收到S Y N时,状态变为S Y N R C V D(如图1 8 - 1 2),同时它们都再发S Y N并对收到的S Y N进行确认。当双方都收到S Y N及相应的A C K时,状态都变迁为E S TA B L I S H E D。一个同时打开的连接需要交换4个报文段,比正常的三次握手多一个。此外,要注意的是我们没有将任何一端称为客户或服务器,因为每一端既是客户又是服务器。

同时关闭

当应用层发出关闭命令时,两端均从E S TA B L I S H E D变为F I N _ WA I T _ 1。

这将导致双方各发送一个F I N,两个F I N经过网络传送后分别到达另一端。收到F I N后,状态由F I N _ WA I T _ 1变迁到C L O S I N G,并发送最后的A C K。当收到最后的A C K时,状态变化为T I M E WA I T。

呼入连接请求队列
注意区分T C P接受一个连接是将其放入这个队列,而应用层接受连接是将其从该队列

中移出。

N a g l e算法

该算法要求一个T C P连接上最多只能有一个未被确认的未完成的小分组,在该分组的确认到达之前不能发送其他的小分组。相反, T C P收集这些少量的分组,并在确认到来时以一个分组的方式发出去。该算法的优越之处在于它是自适应的:确认到达得越快,数据也就发送得越快。

慢启动为发送方的T C P增加了另一个窗口:拥塞窗口(congestion window),记为c w n d。当与另一个网络的主机建立T C P连接时,拥塞窗口被初始化为1个报文段(即另一端通告的报文段大小)。每收到一个A C K,拥塞窗口就增加一个报文段( c w n d以字节为单位,但是慢启动以报文段大小为单位进行增加)。发送方取拥塞窗口与通告窗口中的最小值作为发送上限。拥塞窗口是发送方使用的流量控制,而通告窗口则是接收方使用的流量控制。

发送方开始时发送一个报文段,然后等待A C K。当收到该A C K时,拥塞窗口从1增加为2,即可以发送两个报文段。当收到这两个报文段的A C K时,拥塞窗口就增加为4。这是一种指数增加的关系。在某些点上可能达到了互联网的容量,于是中间路由器开始丢弃分组。这就通知发送方它的拥塞窗口开得过大。

Karn算法

在一个分组重传时会产生这样一个问题:假定一个分组被发送。当超时发生时, RTO正如2 1 . 2节中显示的那样进行退避,分组以更长的RTO进行重传,然后收到一个确认。那么这个A C K是针对第一个分组的还是针对第二个分组呢?这就是所谓的重传多义性问题。[Karn and Partridge 1987]规定,当一个超时和重传发生时,在重传数据的确认最后到达之前,不能更新RT T估计器,因为我们并不知道A C K对应哪次传输(也许第一次传输被延迟而并没有被丢弃,也有可能第一次传输的A C K被延迟)。

并且,由于数据被重传, RTO已经得到了一个指数退避,我们在下一次传输时使用这

个退避后的RTO。对一个没有被重传的报文段而言,除非收到了一个确认,否则不要计算新的RTO。重传超时时间RTO(Retransmission Ti m e O u t)往返时间( RT T)

慢启动算法是在一个连接上发起数据流的方法,但有时我们会达到中间路由器的极限,此时分组将被丢弃。拥塞避免算法是一种处理丢失分组的方法。

拥塞避免算法和慢启动算法是两个目的不同、独立的算法。但是当拥塞发生时,我们希

望降低分组进入网络的传输速率,于是可以调用慢启动来作到这一点。在实际中这两个算法通常在一起实现。拥塞避免算法和慢启动算法需要对每个连接维持两个变量:一个拥塞窗口c w n d和一个慢启动门限s s t h re s h。这样得到的算法的工作过程如下:

1) 对一个给定的连接,初始化c w n d为1个报文段, s s t h re s h为6 5 5 3 5个字节。

2) TCP输出例程的输出不能超过c w n d和接收方通告窗口的大小。拥塞避免是发送方使用的流量控制,而通告窗口则是接收方进行的流量控制。前者是发送方感受到的网络拥塞的估计,而后者则与接收方在该连接上的可用缓存大小有关。

3) 当拥塞发生时(超时或收到重复确认),s s t h re s h被设置为当前窗口大小的一半( c w n d和接收方通告窗口大小的最小值,但最少为2个报文段)。此外,如果是超时引起了拥塞,则c w n d被设置为1个报文段(这就是慢启动)。

4) 当新的数据被对方确认时,就增加c w n d,但增加的方法依赖于我们是否正在进行慢启动或拥塞避免。如果c w n d小于或等于s s t h re s h,则正在进行慢启动,否则正在进行拥塞避免。

慢启动一直持续到我们回到当拥塞发生时所处位置的半时候才停止(因为我们记录了在步骤2中给我们制造麻烦的窗口大小的一半),然后转为执行拥塞避免。

拥塞避免算法要求每次收到一个确认时将c w n d增加1 /c w n d。与慢启动的指数增加比起来,这是一种加性增长(additive increase)。我们希望在一个往返时间内最多为c w n d增加1个报文段(不管在这个RT T中收到了多少个A C K),然而慢启动将根据这个往返时间中所收到的确认的个数增加c w n d。

由于我们不知道一个重复的A C K是由一个丢失的报文段引起的,还是由于仅仅出现了几个报文段的重新排序,因此我们等待少量重复的A C K到来。假如这只是一些报文段的重新排序,则在重新排序的报文段被处理并产生一个新的A C K之前,只可能产生1 ~ 2个重复的A C K。如果一连串收到3个或3个以上的重复A C K,就非常可能是一个报文段丢失了(我们在2 1 . 5节中见到过这种现象)。于是我们就重传丢失的数据报文段,而无需等待超时定时器溢出。这就是快速重传算法。接下来执行的不是慢启动算法而是拥塞避免算法。这就是快速恢复算法。

在这种情况下没有执行慢启动的原因是由于收到重复的A C K不仅仅告诉我们一个分组丢失了。由于接收方只有在收到另一个报文段时才会产生重复的A C K,而该报文段已经离开了网络并进入了接收方的缓存。也就是说,在收发两端之间仍然有流动的数据,而我们不想执行慢启动来突然减少数据流。这个算法通常按如下过程进行实现:

1) 当收到第3个重复的A C K时,将s s t h re s h设置为当前拥塞窗口c w n d的一半。重传丢失的报文段。设置c w n d为s s t h re s h加上3倍的报文段大小。

2) 每次收到另一个重复的A C K时, c w n d增加1个报文段大小并发送1个分组(如果新的c w n d允许发送)。

3) 当下一个确认新数据的A C K到达时,设置c w n d为s s t h re s h(在第1步中设置的值)。这个A C K应该是在进行重传后的一个往返时间内对步骤1中重传的确认。另外,这个A C K也应该是对丢失的分组和收到的第1个重复的A C K之间的所有中间报文段的确认。这一步采用的是拥塞避免,因为当分组丢失时我们将当前的速率减半。

重新分组

当T C P超时并重传时,它不一定要重传同样的报文段。相反, T C P允许进行重新分组而发送一个较大的报文段,这将有助于提高性能(当然,这个较大的报文段不能够超过接收方声明的M S S)。在协议中这是允许的,因为T C P是使用字节序号而不是报文段序号来进行识别它所要发送的数据和进行确认。

如果一个确认丢失了,则双方就有可能因为等待对方而使连接终止:接收方等待接收数

据(因为它已经向发送方通告了一个非0的窗口),而发送方在等待允许它继续发送数据的窗口更新。为防止这种死锁情况的发生,发送方使用一个坚持定时器(persist timer)来周期性地向接收方查询,以便发现窗口是否已增大。这些从发送方发出的报文段称为窗口探查( w i n d o w p r o b e )。

在连接的一方需要发送数据但对方已通告窗口大小为0时,就需要设置T C P的坚持定时器。发送方使用与第2 1章类似的重传间隔时间,不断地探查已关闭的窗口。这个探查过程将一直持续下去。

当运行一个例子来观察坚持定时器时,我们还观察到了T C P的避免出现糊涂窗口综合症的现象。这就是使T C P避免通告小的窗口大小或发送小的报文段。

许多时候一个服务器希望知道客户主机是否崩溃并关机或者崩溃又重新启动。许

多实现提供的保活定时器可以提供这种能力。

一个说明现在需要使用保活功能的常见例子是当个人计算机用户使用T C P / I P向一个使用Te l n e t的主机注册时。如果在一天结束时,他们仅仅关闭了电源而没有注销,那么便会留下一个半开放的连接。在图1 8 - 1 6中,我们看到通过一个半开放连接发送数据会导致返回一个复位,但那是在来自正在发送数据的客户端。如果客户已经消失了,使得在服务器上留下一个半开放连接,而服务器又在等待来自客户的数据,则服务器将永远等待下去。保活功能就是试图在服务器端检测到这种半开放的连接。

基于T C P / I P的网络管理包含两个部分:网络管理站(也叫管理进程, m a n a g e r)和被管的网络单元(也叫被管设备)

F T P是文件传输的I n t e r n e t标准。与多数其他T C P应用不同,它在客户进程和服务器进程之间使用两个T C P连接—一个控制连接,它一直持续到客户进程与服务器进程之间的会话完成为止;另一个按需可以随时创建和撤消的数据连接。

用户与用户代理( user agent)打交道,可能会有多个用户代理可供选择。常用的U n i x上的用户代理包括M H,Berkeley Mail, Elm和M u s h。

用T C P进行的邮件交换是由报文传送代理M TA(Message Transfer Agent)完成的。最普通的U n i x系统中的M TA是S e n d m a i l。用户通常不和M TA打交道,由系统管理员负责设置本地的M TA。通常,用户可以选择它们自己的用户代理。电子邮件包括在两端(发送方和接收方)都有的一个用户代理以及两个或多个报文传送代理。可以把一个邮件报文分成三个部分:信封、首部和正文。我们已经看到这三个部分用S
M T P和I n t e r n e t标准是如何进行交换的。所有都作为NVT ASCII字符进行交换。

N F S(网络文件系统),它为客户程序提供透明的文件访问。

F i n g e r和W h o i s,是用来获得用户信息的。F i n g e r客户查询一个服务器,经常是为了找到某个人的登录名(以便给他们发电子邮件),或者去看一下某个人是否登录了。W h o i s客户一般与I n t e r N I C运行的服务器联系,查找关于一个人、机构、域或网络号的信息。我们简单描述了其他一些I n t e r n e t资源发现服务: A
r c h i e、WA I S、G o p h e r、Ve r o n i c a和W W W, 帮助我们在I n t e r n e t上定位文件和文档。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: