【网络】运输层

运输层协议概述

既然IP协议能够把源主机发送出去的分组按照首部中的地址送交到目的主机,那么为什么还需要设置一个运输层呢?

这是因为,真正运行通信的实体是在主机中的进程,是这个主机中的一个进程和另一个主机中的一个进程在交换数据。因此严格来讲,两个主机进行通信就是两个主机中的应用进程互相通信。IP协议虽然能把分组送到目的主机,但是这个分组还停留在主机的网络层而没有交付给主机中的进程。

运输层有两个很重要的功能:分用和复用

复用:应用层所有的应用进程都可以通过运输层再传送到IP层。
分用:运输层从IP层收到数据后必须交付给指明的应用程序。

协议端口号

为了使运行不同操作系统的计算机的应用进程能够互相通信,就i必须用统一的方法对TCP/IP体系的应用进程进行标志。解决这个问题的方法就是在运输层使用协议端口号,简称端口。

端口号分类

因特网上的计算机通信是采用客户端-服务器方式。客户在发起通信请求时,必须事先知道对方服务器的IP地址和端口号。因此运输层的端口号共分为下面两大类。
(1)服务器端使用的端口号 这里又分为两类,最重要的一类叫做熟知端口号系统端口号,数值为0~1023.这些数值可在网址www.iana.org查到。IANA把这些端口号指派给了TCP/IP最重要的一些应用程序,让所有的用户都知道。当一种新的应用程序出现后,IANA必须为它指派一个熟知端口,否则因特网上的其他应用进程就无法和它进行通信。另一类叫做登记端口号,熟知为1024~49151.这类端口号是为没有熟知端口号的应用程序使用的。
(2)客户端使用的端口号 数值为49152~65535。这类端口号是留给客户进程选择暂时使用,通信结束后,刚才已使用过的客户端端口号就不复存在。这个端口号就可以共其他客户进程以后使用。


用户数据报协议UDP

UDP特点

无连接、尽力交付、面向报文

UDP首部格式

UDP首部格式
源端口 在需要对方回信时选用。不需要时可用全0.
目的端口 这在终点交付报文时必须要使用到。
长度 UDP用户数据报的长度,其最小值时8(仅有首部)。
检验和 检测UDP用户数据报在传输中是否有错。有错就丢弃。
伪首部 用来计算检验和,既不向下传送也不向上递交。
*检验和的计算方法和计算IP数据报首部检验和的方法相似。


传输控制协议TCP

特点

面向连接、点对点、可靠交付、全双工通信、面向字节流。

连接

TCP连接的端点是套接字Socket
套接字socket = (IP地址:端口号)
每一条TCP连接唯一地被通信两端地两个端点(即两个套接字)所确定。
TCP连接 ::= {socket1,socket2} = {(IP1:port1),(IP2:port2)}

可靠传输的工作原理

为了使两个运输层之间的通信变得可靠,需要使用一些可靠的传输协议。
停止等待协议
停止等待就是每发送完一个分组就停止发送,等待对方的确认。在收到确认后再发送下一个分组。

无差错情况和出现差错
停止等待协议


确认丢失和确认迟到
确认丢失和确认迟到


信道利用率
停止等待协议的优点是简单,但缺点是信道利用率太低。
停止等待协议的信道利用率
为了解决这个问题,选择使用流水线传输。
流水线传输
在使用流水线传输时,就要使用连续ARQ协议和滑动窗口协议。


连续ARQ协议
连续ARQ协议的工作原理

TCP报文段的首部格式

TCP报文段的首部格式
首部固定部分各字段的意义:
源端口和目的端口 各占2个字节。
序列 占4字节,序号使用 mod (2的32次方)运算。序号是指本报文段所发送的数据的第一个字节的序号。
确认号 占4字节,是期望收到对方下一个报文段的第一个数据字节的序号。
数据偏移 占4位,它指出TCP报文段的数据起始处距离TCP报文段的其实处有多远。实际就是TCP报文段的首部长度。
保留 占6位,保留位今后使用 。
紧急URG URG=1时,表示此报文段中又紧急数据,应尽快传送。
确认ACK 仅当ACK=1时确认号字段才有效。
推送PSH 当两个应用进程进行交互式的通信时,又是在一段的应用进程希望在键入一个命令后立即就能够收到对方的响应,不再等待整个缓存都满了之后再向上交付。
复位RST 当RST=1时,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立运输连接。
同步SYN 在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文段。若对方同意建立连接,则应在响应的报文段中使SYN=1和ACK=1。
终止FIN FIN=1时,表明此报文段的发送端的数据已发送完毕,并要求释放运输连接。
窗口 占2字节,窗口值作为接收方让发送方设置其发送窗口的依据。
检验和 占2字节。检验和字段检验的范围包括首部和数据这两部分,同UDP一样,加12字节的伪首部。
紧急指针 占2字节。紧急指针尽在URG=1时才有意义,它指出本报文段中的紧急数据的字节数。(紧急数据结束后就是普通数据)
选项 长度可变,最长达40字节。当没有使用选项时,TCP的首部长度是20字节。

TCP最初只规定了一种选项,即最大报文段长度MSS。MSS是每一个TCP报文段中的数据字段的最大长度。MSS的默认值是536字节长。因此,所有在因特网上的主机都应能接收报文段长度是536+20(固定首部长度)=556字节。随着因特网的发展,又陆续增加了几个选项。如窗口扩大选项、时间戳选项、选择确认选项等。

超时重传时间的选择

TCP采用了一种自适应算法,它记录一个报文段发出的时间,以及收到相应的确认的时间。这两个时间差就是报文段的往返时间RTT。TCP保留了RTT的一个加权平均往返时间RTTs(这个又称为平滑的往返时间,S表示Smoothed。因为进行的是加权平均,因此得出的结果更加平滑)。第一次测量到RTT样本时,RTTs值就取为所测量到的RTT样本值,每当检测到RTT样本后,就重新计算RTTs:
新的RTTs = (1-a) * (旧的RTTs)+a * (新的RTT样本)
0<=a<1,RFC2988推荐的a值为1/8,即0.125.


超时计数器设置的超时重传时间RTO应略大于上面的RTTs。RFC2988建议使用下式计算RTO:
RTO = RTTs + 4*RTTd


RTTd是RTT的偏差的加权平均值。当第一次测量时,RTTd值取为测量到的RTT样本值的一半。
新的RTTd = (1-b) * (旧的RTTd)+b * |RTTs - 新的RTT样本|

如何判断此确认报文段是对先发送的报文段的确认,还是对后来重传的报文段的确认?
报文段每重传一次,就把超时重传时间RTO增大一些。典型的做法是取新的重传时间为2倍的旧的重传时间。当不再发生报文段的重传时i,才根据之前的计算公式计算超时重传时间。

流量控制

流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收。
利用可变窗口进行流量控制
从上图看,接收方主机B进行了三次流量控制。

传输速率。

问题一:如何控制TCP发送报文段的时机。
若是用户只发送一个字符,加上TCP报文段首部和IP首部,效率极低,所以,再发送确认报文时,会选择推迟发回确认报文,并尽量使用捎带确认的方法。

再TCP的实现中广泛使用Nagle算法,算法如下:若发送应用进程把要发送的数据诸葛字节地送到TCP地发送缓存,则发送方就把第一个数据字节先发送出去,把后i按到达地数据字节都缓存起来。当发送方收到对第一个数据字符地确认后,再把发送缓存中地所有数据组装成一个报文段发送出去,同时继续对随后到达地数据进行缓存。只有再收到对前一个报文段地确认后才继续发送下一个报文段。大概数据到达较快而网络速率较慢时,用这样地方法可明显的减少所用地网络带宽。Nagle算法还规定,当到达地数据已达到发送窗口大小地一半或已达到报文段地最大长度时,就立即发送一个报文段。

问题二:糊涂窗口综合症
TCP接收方的缓存已满,而交互式的应用进程一次只从接收缓存中读取一个字节(这样就使接收缓存空间仅腾出一个字节),然后向发送方发送确认,并把窗口设置为1个字节(但发送的数据报时40字节长)。接着,发送方又发来一个字节的数据(请注意,发送方发送的IP数据报时41字节长)。接收方发挥确认,仍然将窗口设置为1个字节。这样进行下去,使网络的效率很低。

要解决这个问题,可以让接收方等待一段时间,使得或者接收缓存已有足够控件容纳一个最长的报文段,或者等到接收缓存已有一半空闲的空间。

拥塞控制

拥塞:是指在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏。这种情况就叫拥塞。

几种拥塞控制的方法
1、慢开始
2、拥塞避免
3、快重传
4、快恢复

慢开始和拥塞避免

慢开始算法:当主机开始发送数据时,如果立即把大量数据字节注入到网络,那么就有可能引起网络拥塞,应为现在并不清楚网络的负荷情况。经验证明,较好的方法时先探测一下,即从小到大逐渐增大发送窗口,也就是说,由小到大逐渐增大拥塞窗口数值


拥塞避免算法:让拥塞窗口cwnd缓慢地增大,即没经过一个往返时间RTT就把发送方地拥塞窗口cwnd+1,而不是加倍。这样,拥塞窗口cwnd按线性规律缓慢增长,比慢开始算法地拥塞窗口增长速率缓慢得多。

慢开始和拥塞避免算法

快重传和快恢复

快重传算法:首先要求接收方每收到一个失序的报文段后就立即发出重复确认(为的是使发送方鸡早知道有报文段没有到达对方)而不要等待自己发送数据时才进行捎带确认。

快重传

快恢复算法:(1)当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把慢开始门限ssthresh减半。这是为了预防网络发生拥塞。请注意,接下来执行慢开始算法。(2)由于发送方现在认为网络很可能没有发生拥塞(如果网络发生了严重的拥塞,就不会一连有好几个报文段连续到达接收方吗就不会导致接收方连续发送重复确认),因此与慢开始不同之处是现在不执行慢开始算法(即拥塞窗口cwnd现在不设置为1),而是把cwnd值设置为慢开始门限ssthresh减半后的数值,然后开始执行拥塞避免算法(“加法增大”),使拥塞窗口缓慢的线性增大。快恢复算法经常和快重传算法搭配使用
从连续收到三个重复的确认转入拥塞避免

随机早期检测RED
网络层的策略对TCP拥塞控制影响最大的就使路由器的分组丢弃策略。这就使发送方出现超时重传,使TCP进入拥塞控制的慢开始状态。会同时影响到很多条TCP连接,结果使这许多TCP连接在同翻译时间突然都进入到慢开始状态。这在TCP的术语中称为全局同步。全局同步使得全网的通信量突然下降了很多,而在网络恢复正常后,其通信量又突然增大很多。为了避免这种情况,可以在路由器采用随机早期检测RED(Random Early Detection)。

RED算法:
(1)、若平均队列长度小于最小门限THmin,则把新到达的分组放入队列进行排队。
(2)、若平均队列长度在最小门限THmin和最大门限THmax之间,则把按照某一概率p将新到达的分组丢弃。
(3)、若平均队列长度大于最大门限THmax,则把新到达的分组丢弃。
RED把路由器的到达队列划分三个区域

RED算法中的值。THmin、THmax、p。
经验证明,使最大门限THmax等于最小门限THmin值的两倍是合适的
p根据下面三条原则来确定:
(1)、当平均队列长度Lav小于最小门限THmin时,分组丢弃概率p = 0;
(2)、当平均队列长度Lav在最小门限THmin和最大门限THmax之间时,分组丢弃概率p应在0和1之间;
(3)、当平均队列长度Lav大于最大门限THmax时,分组丢弃概率p = 1。
分组丢弃概率p与两个门限值THmin和THmax的关系

TCP的传输连接管理

运输连接的三个阶段:连接建立、数据传送、连接释放。

TCP的连接建立(“三次握手”)

三次握手

B的TCP服务器进程先创建传输控制模块TCB(包含一些重要信息,如:TCP链接表,到发送和接收缓存的指针,到重传队列的指针,当前的发送和接收序号,等等),准备接收客户进程的连接请求。然后服务器进程就一直处于LISTEN(收听)状态,等到客户的连接请求。


A的TCP客户进程也是首先创建传输控制模块TCB,然后向B发出连接请求报文段,这时首部中的同步位SYN = 1,同时选择一个初始序号seq = x。TCP规定,SYN=1的报文段不能携带数据,但是消耗掉一个序号。这时,TCP客户进程进入SYN-SENT(同步已发送)状态。


B收到连接请求报文段后,如同意建立连接,则向A发送确认。在确认报文段中应把SYN位和ACK位都置1,确认号是ack = x+1,同时也为自己选择一个初始序号seq = y 。这时TCP服务器进程进入SYN-RCVD(同步收到)状态。


TCP客户端收到B的确认后,还要向B给出确认。确认报文段的ACK置1,确认号ack = y+1,而自己的序号seq = x+1。TCP规定,ACK报文段可以携带数据。但如果不携带数据则不消耗序号,所以,下一个数据报文段的序号仍然是seq = x+1。这时,TCP连接已经建立,A进入ESTABLISHED(已建立连接)状态。
当B收到A的确认的后,也进入ESTABLISHED状态。


为什么A还要再发送一次确认呢?
这主要是为了防止已经失效的连接请求报文段突然又传送到了B,B收到这个失效的连接请求报文段之后,误以为是A又发出一次新的连接请求,于是就向A发出确认报文段,同意建立连接。嘉定不采用三次握手,那么只要B发出发出确认,新的连接就建立了。由于A并没有发出连接i请求,因此不会理睬B的确认,也不会向B发送数据。但B却以为新的运输 连接已经开始了,并一直等待A发来数据。B的许多资源就因此浪费了。

TCP的连接释放 (“四次挥手”)

四次挥手

数据传输结束后,通信的双方都可释放连接。现在A和B都处于ESTABLISHED状态。A的应用进程先向其TCP发出连接释放报文段,并停止再发送数据,主动关闭TCP连接。A把连接释放报文段首部的FIN置1,其序号seq = u,它等于前面已传送过的数据的最后一个字节的序号加1,这时A进入FIN-WAIT-1(终止等待1)状态,等待B的确认。请注意,TCP规定,FIN报文段即使不懈怠数据,它也消耗掉一个序号。


B收到连接释放报文段后即发出确认,确认号是ack = u+1,而这个报文段自己的序号是v,等于B前面已发送过的数据的最后一个字节的序号加1.然后B就进入到CLOSE-WAIT(关闭等待)状态 。TCP服务器进程这时应通知高层应用进程,因而从A到B这个方向的连接就释放了,这时的TCP连接处于半关闭(half-close)状态,即A已经没有数据要发送了,但B发送数据,A仍要接收。也就是说,从B到A这个方向的连接并未关闭。


A收到B的确认后,就进入FIN-WAIT-2(终止等待2)状态,等待B发出的连接释放报文段


若B已经没有要向A发送的数据,其应用进程就通知TCP释放连接。这时B发出的连接释放报文段必须使FIN = 1。现假定B的序号是w(在版关闭状态B可能又发送了一些数据)。B还必须重复上次已经发送过的确认号ack = u+1.这时B就进入LAST-ACK(最后确认)状态,等待A的确认。


A在收到B的连接释放报文段后,必须对此发出确认。在确认报文段中把ACK置1,确认号ack = w+1,而自己的序号是seq = u+1,然后进入TIME-WAIT(时间等待)状态。请注意,现在TCP连接还没有释放掉。必须经过时间等待计时器(TIME-WAIT timer)设置的时间2MSL后,A才进入到CLOSED(关闭)。时间MSL叫做最长报文段寿命。当A撤销响应的传输控制块TCB后,就结束了这次的TCP连接。

为什么A在TIME-WAIT状态必须等待2MSL的时间呢?
第一,为了保证A发送的最后一个ACK报文段能够到达B。
第二,防止之前提到的“已失效的连接请求报文段”出现在本连接中。A在发送完最后一个ACK报文段小时候,再经过2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。

B只要收到A发出的确认,就进入CLOSED状态,同样,B再撤销响应的传输控制块TCB后,就结束了这次的TCP连接。可以注意到,B结束TCP连接的时间要比A早一些。

TCP的有限状态机

TCP的有限状态机

PS:图中粗实线箭头表示对客户进程的正常变迁。
粗虚线箭头表示对服务器进程的正常变迁。
细线箭头表示表示异常变迁。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值