第五章 端到端协议

主要讲解内容

5.1运输层协议概述

5.2多路复用与多路分解

5.3无连接运输协议UDP

5.4面向连接的运输协议TCP

5.5拥塞控制原理

5.6TCP拥塞控制

5.1运输层协议概述

  • 回顾较低的三层

物理层:透明传输比特流。

数据链路层:在两个相邻节点之间透明传输数据。


网路层:完成网络中不同端系统之间(可能存在多条路径)的数据传输。网络层要解决的关键问题--路由选择

  • 运输层的功能

问题:

    网路层能够将源主机发送出的分组按照首部中的目的地址送交到目的主机,那么,为什么还需要运输层呢?

  • 两个主机进行通信实际上就是两个主机中的应用进程互相通信。

为了解决具体的应用问题而运行的进程就称为"应用进程";应用进程为用户进程程序的一次执行。

  • 应用进程之间的通信又称为端到端的通信

运输层提供应用进程间的逻辑通信。或者说运输层提供端到端的逻辑通信。

  • 从通信和信息处理的角度看,运输层向它上面的应用层提供服务,它属于面向通信部分的最高层,同时也是用户功能中的最底层。

  • 当网络的边缘部分中的两个主机利用网络的核心部分的功能进行端到端的通信时,只有主机的协议栈才有运输层,而网络核心部分中的路由器在转发分组时都只用到下三层的功能。
  • 运输层向高层用户屏蔽了下面网络核心部分的细节(如网络拓扑、所采用的路由选择协议等).
  • 它使应用进程看见的就是好像在两个运输层实体之间有一条端到端的逻辑通信信道。

运输层为相互通信的应用进程提供了逻辑通信


  • 运输层协议和网络层协议的主要区别


  • 网络应用对运输服务的要求


  • 运输层的两个主要协议

为了适应以上两种应用类型:

(1)弹性服务

       数据完整性

(2)多媒体应用

       时延敏感性

       容忍丢包

TCP/IP的运输层有两个不同的协议:

(1)传输控制协议TCP(Transmission Control Protocol)

(2)用户数据报协议UDP(User Datagram Protocol)


  • 当运输层采用面向连接的TCP协议时,尽管下面的网络是不可靠的(只提供尽最大努力交付服务),但这种逻辑通信信道就相当于一条全双工的可靠信道
  • 当运输层采用无连接的UDP协议时,这种逻辑通信信道是一条不可靠信道


(1)TCP

  • 面向连接服务
  • 可靠数据传送服务
  • 拥塞控制服务
  • 传送的数据单位是TCP报文段(segment)

(2)UDP

  • 无连接,高效率
  • 传送的数据单位是UDP报文或用户数据报

5.2多路复用与多路分解

  • 回顾

互联网范围内,怎样找到一台主机?

  • IP地址能够标识一台主机,利用IP地址寻址;

一台主机可能运行多个应用进程,如何在互联网范围内找到一个进程?

  • 端口

解决:

  • 使用称为"端口"的抽象定位符。
  • 每个端口有一个端口号,以区分不同端口。
  • 利用全局唯一的IP地址标识本机,用本地唯一的端口号来标识这台主机中的进程。
  • 为了区别是TCP还是UDP服务,还要指明运输层协议类型。


  • 端口实际上是一个抽象的软件结构(包括一些数据结构和I/O缓冲区)。
  • 应用程序(进程)通过系统调用与某端口建立关联(binding)后,相应的应用进程交付给运输层的数据也要通过该端口输出,而运输层交付给该端口的数据都被相应的应用进程所接收。
  • 网络通信是两个进程之间的通信。两个通信的进程构成了一个关联
  • 这个关联应包含两个三元组注意:通信的双方采用的协议必须是相同的。

因此:


  • 什么是运输层多路复用?(源端发送时)

指多个应用进程基于同一个运输层协议发送数据。

  • 什么是运输层多路分用?(目的端接收时)

在接收方,由一个运输层协议将报文中的数据交付给不同的应用进程。

复用和分用都是通过"端口"来实现的。

端口在进程之间的通信中所起的作用


  • 各层地址:


  • 端口号只具有本地意义,及端口号只是为了标志本计算机应用层中的各进程。在因特网中不同计算机的相同端口号是没有联系的。

回顾:

Internet应用程序采用的是"客户/服务器"模型

(1)客户向服务器发送请求;

(2)服务器对客户作出响应;

  • 服务器使用的端口号
  1. 为了方便客户定位服务器,服务器必须使用周知端口号(well-known port number)
  2. 每一个标准服务都拥有一个周知端口号。
  3. 通常,不同主机上相同服务器的端口号是相同的。

  • 客户使用的端口号
  1. 客户发起请求时,需提供源和目的的端口号
  2. 目的端口号是客户请求的服务对应的端口号
  3. 客户进程采用临时端口号,使用时向操作系统申请,由其动态分配,然后该进程再通过系统调用将自己与相应的端口号进行关联操作。使用完后再交由操作系统管理。

  • 端口号类别(https://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers)

(1)周知端口号(Well-known ports)范围:0-1023,也称"常用端口"或"保留端口"。由IANA统一分配,作为公共应用服务的端口,并将分配结果公布于众。

(2)注册端口(Registered ports)范围:1024-49151,被保留用作商业性的应用开发,厂商需要向IANA注册,以避免重复。

(3)临时端口号(Dynamic,private or ephemeral ports)范围:49152-65535,也称"动态端口"或"自由端口"。本地系统随机分配,不能在IANA注册。

  • 套接字

(1)大多数操作系统使用系统调用(system call)的机制在应用程序和操作系统之间传递控制权。

(2)系统调用接口实际上就是应用进程的控制权和操作系统的控制权进行转换的一个接口,即应用编程接口API。


两种可供应用程序使用TCP/IP的API:

  • Berkeley UNIX操作系统定义了一种API,称为套接字接口(socket interface)
  • 微软公司在其操作系统中采用了套接字接口API,形成了一个稍有不同的API,并称之为Windows Socket,简称WinSock。

(1)只要应用程序使用TCP/IP协议进行通信,它就必须通过套接字与操作系统交互。

(2)当应用程序需要使用网络进行通信时就发出系统调用,请求操作系统为其创建"套接字",以便把网络通信所需要的系统资源分配给该应用进程。


操作系统为这些资源的总和用一个叫做套接字描述符的号码来表示,并把此号码返回给应用程序。应用进程所进行的网络操作都必须使用这个号码。

通信完毕后,应用程序通过一个关闭套接字的系统调用,通知操作系统收回与该号码相关的所有资源。


5.3无连接运输协议UDP

  • UDP协议

UDP是最简单的运输层协议

  • UDP和IP协议一样提供无连接服务。它在IP的数据包服务之上增加了进程通信能力。
  • UDP的运行环境应该是高可靠性的网络。
  • 如果运行在不可靠的网络上,则UDP之上的应用程序必须能够解决报文损坏、丢失、重复、失序等可靠性问题。
  • UDP协议的特点

  1. UDP是无连接的,即发送数据之前不需要建立连接。
  2. UDP使用尽最大努力交付,即不保证可靠交付。无需维持复杂的连接状态表。
  3. UDP没有拥塞控制,因此网络拥塞不会使源主机的发送速率降低,允许拥塞造成丢失,不允许大时延。
  4. UDP是面向报文的。

(1)发送方UDP对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。

(2)应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文。

(3)接收方UDP对IP层上交的UDP用户数据报,在去除首部后就原封不动地交付上层的应用进程,一次交付一个完整的报文。

(4)应用程序必须选择合适大小的报文。

     5.UDP支持一对一、一对多、多对一和多对多的交互通信

     6.UDP首部固定8字节,开销少,处理时延小。

UDP数据报格式

首部字段有8个字节,由4个字段组成,每个字段都是两个字节。


在计算检验和时,临时把"伪首部"和UDP用户数据报连接在一起。伪首部仅仅是为了计算检验和。


计算UDP检验和的例子



5.4面向连接的运输协议TCP

TCP协议的特点

  1. TCP是面向连接的运输层协议。

在数据传输之前必须先建立连接,即在两个通信的TCP进程之间相互确认对方是存在的并且处于活动状态,同时为两个进程之间的通信协商一些参数并且预留资源(如缓冲区等).

    2.TCP提供可靠交付的服务。

在数据传输过程中,TCP采用了许多方法和手段,如编号与确认、流量控制、计时器等,来保证在连接上提供可靠的传输服务,因此也增加了协议的开销。

   3.每一条TCP连接只能有两个端点(endpoint),每一条TCP连接只能是点对点的(一对一).

   4.TCP提供全双工通信。

   5.TCP面向字节流。

问:什么是面向字节流?

  • 字节流:是指流入到进程或从进程流出的字节序列。
  • TCP协议把应用层报文看成是一连串无结构的字节流。将其分解为多个TCP报文段进行传输,在目的站再重新装配这些段,必要时需要重新发送没有收到的段。

  • TCP不保证接收进程收到的数据块和发送进程发送的数据块具有对应的大小关系。
  • TCP保证接收进程收到字节流和发送进程发送的字节流完全一致。

TCP根据接收方给出的窗口值和当前网络拥塞的程度来决定一个报文段应该包含多少字节。


TCP报文段的首部格式

TCP报文:


  • 源端口和目的端口字段--各占2字节。端口是运输层与应用层的服务接口。运输层的复用和分用功能都要通过端口才能实现。
  • 序号字段--占4字节,序号范围[0,2^32-1]。TCP连接中传送的数据流中的每一个字节都编上一个序号。
  • "序号"字段也叫做"报文段序号"字段。其值是本报文段的数据部分的第一个字节的序号。
  • 确认号字段--占4字节,是期望收到对方的下一个报文段的数据部分的第一个字节的序号。确认号等于n,则表明:到序号n-1为止的所有数据都已正确收到。

  • 数据偏移--占4bit,它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。"数据偏移"的单位不是字节而是32bit字(4字节为计算单位)。最大值为60字节。
  • 保留字段--占6bit,保留为今后使用,但目前应置为0.
  • 紧急比特URG--当URG=1时,表明"紧急指针"字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。如ctrl+c
  • 紧急指针字段--占16bit。紧急指针指出在本报文段紧急数据共有多少个字节(紧急数据放在本报文段数据的最前面).
  • 紧急指针字段定义了一个数,把这个数加到"序号"上就得出报文段数据部分中最后一个紧急字节。
  • 确认比特ACK--只有当ACK=1时"确认号"字段才有效。当ACK=0时,"确认号"无效。
  • 推送比特PSH(PuSH)--TCP接收方收到推送比特置1的报文段,就尽快将数据交付给接收应用进程,而不再等到整个缓存都填满了后再向上交付。
  • 复位比特RST(ReSeT)--当RST=1时,表明TCP连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。
  • 复位比特RST(ReSeT)--当RST=1时,也用于拒绝非法的TCP报文段或拒绝连接请求。

几种TCP连接中出现RST的常见情况:

(1)端口未打开

例如:服务器程序端口未打开而客户端来连接,服务器会向客户发送一个RST。

(2)接收超时

一个客户端连接服务器,客户端是在收到服务器发出的SYN之后,就莫名其妙的发送了RST。原因可能是:接收超时。

例如:客户设置了recv的超时时间为100ms。从客户发出SYN到接收SYN的时间多达110ms。

(3)提前关闭

例如:服务器程序每次只是读socket的前4096个字节,然后就关闭掉连接。客户程序打开一个socket连接服务器并发送5000个字节。每次服务器端接收4096个字节或发送了ACK进行确认,紧接着服务器向客户端发送了一个RST断开了连接。

(4)在一个已关闭的socket上收到数据

例如:客户端在服务端已经关闭掉socket之后,仍然在发送数据。这时服务端会产生RST。

  • 同步比特SYN--同步比特SYN置为1,就表示这是一个连接请求或连接接受报文。
  • 终止比特FIN(FINaI)--用来释放一个连接。当FIN=1时,表明此报文段的发送端的数据已发送完毕,并要求释放运输连接。
  • 窗口字段--占2字节,值范围[0,2^16-1]。窗口指的是发送本报文段的一方的接收窗口(RWin),是让对方设置发送窗口的依据,单位为字节。
  • 窗口字段明确指出了现在允许对方发送的数据量。窗口值是经常在动态变化着。
  • 检验和--占2字节。检验和字段检验的范围包括首部和数据这两部分。在计算检验和时,也要在TCP报文段的前面加上12字节的伪首部。
  • 选项字段--长度可变。TCP选项可参见http://www.iana.org/assignments/tcp-parameters,每个选项都包含一个字节的类型字段,用于标识选项的具体类型。

需要掌握的几个选项:

(1)MSS

(2)窗口扩大因子

(3)时间戳选型

MSS:

    TCP最初只规定了一种选项,即最大报文段长度MSS(Maximum Segment Size)。实际上TCP报文段中的数据字段的最大长度。数据字段加上TCP首部才等于整个的TCP报文段。MSS=TCP报文段长度-TCP首部长度

    MSS选项只能出现在SYN标志为1的TCP报文中。

    在连接建立阶段,每一方须定义自己在连接期间支持的报文段的MSS值,两个方向的该值可以不同。

    MSS选项占4字节,其中2字节代表MSS值(0-65535之间),如果某一方没有使用这个选项,默认取值为536字节。

    所有Internet主机都要求能够接收536+20=556字节的TCP报文段。


窗口扩大因子:

    窗口扩大因子--占3字节,其中有一个字节表示窗口扩大因子S,也称移位值S

    把窗口值向左移动S位后获得实际的窗口大小:实际的窗口值=首部中定义的窗口值X2^S

    举例:假定窗口扩大因子S是3,一端收到的报文段中窗口值是32768,那么这一端的可以使用的窗口值实际为32768X2^3=262144字节。

    虽然窗口扩大因子S占了一个字节,最大值为255,但是TCP只允许S最大取14,这就表示最大的窗口值可以是2^16X2^14=2^30.

    窗口扩大因子S只能在双方TCP连接建立阶段协商确定,在连接期间它的值不能改变。

时间戳选项:

    时间戳选项--占10字节,其中最主要的字段时间戳值字段(4字节)和时间戳回送应答字段(4字节)。


      功能(1):用于计算往返时间RTT。若发送出报文段t1,收到确认t2,则RTT=t2-t1.

    发送方将t1写入"时间戳",接收方发送确认时,将t1复制到"时间戳回送应答",发送方收到确认时,用当前时间t2减去t1,得到一个RTT。

      功能(2):用于防治序号绕回。用时间戳和序号的组合来标识一个报文段,如:300:1001,700:1001是不同的报文段。

可以了解的选项

    选择确认选项--SACK

  • 填充字段--由0组成的字段,这是为了使整个首部长度是4字节(32)的整倍数。

TCP的流量控制

TCP可靠传输技术

  • TCP所依赖的IP服务是尽最大努力交付、不可靠的服务。
  • TCP可靠传输技术能够确保一个进程收到的数据流是无差错、无丢失、不重复、不失序的
  • TCP提供可靠数据传输而使用的方式涉及序号、确认、超时重传、滑动窗口等可靠传输机制。
  • TCP面对的不再是相邻节点间的链路,而是复杂的网络,TCP不仅要判断接收方的状态,还需要自行推断估计网络状态。
  • TCP的可靠传输机制更加复杂!

TCP流量控制

  • 什么是流量控制:用于防止发送方发送过快,从而使接收方无法接收。
  • 如何实现流量控制:使用序号、确认、超时重传、滑动窗口等可靠数据传输机制。

序号与确认:面向字节的编号

流量控制:大小可变的滑动窗口(以前学习的数据链路层采用固定不变的滑动窗口)

  • TCP流量控制只涉及两个端系统,与网络无关。

  • TCP接收方有1个接收缓冲区:

应用进程从接收缓冲区读数据可能较慢。因此,发送速率需要匹配接收方应用程序的提取速率。

LastByteRcvd-LastByteRead<=RcvBuffer

  • 接收方设置接收窗口RWin

RWin=RcvBuffer-[LastByteRcvd-LastByteRead]

当LastByteRcvd-LastByteRead=RcvBuffer时,会怎么样?

  • 若接收应用程序来不及读取收到的数据,接收缓冲区最终会被填满,使得RWin减小为0;

RWin=RcvBuffer-[LastByteRcvd-LastByteRead]

  • 反之,若接收应用程序能及时从缓存中读取接收到的数据,RWin就可以增大,但最大不能超过接收缓存的大小。即:RWin是可变的。

LastByteRcvd-LastByteRead<=RcvBuffer

  • 发送方为防止接收缓存溢出,则发送量满足:

发送量=LastByteSent-LastByteAcked<=RWin


  • 发送缓存用来暂时存放:

(1)发送应用程序传送给发送方TCP准备发送的数据;

(2)TCP已发送出但尚未收到确认的数据。

  • 接收缓存用来暂时存放:

(1)按序到达的、但尚未被接收应用程序读取的数据;

(2)不按序到达的数据。

  • 以字节为单位的滑动窗口

A:发送方 B:接收方

假定:A收到B发来的确认报文段,该报文段的窗口字段是20(字节),确认号字段是31.据此,A构造出自己的发送窗口。


P3-P1=A的发送窗口(又称为通知窗口)

P2-P1=已发送但尚未收到确认的字节数

P3-P2=允许发送但尚未发送的字节数(又称为有效窗口)




  • 发送端要发送900字节长的数据,假定划分为9个100字节长的报文段,而发送窗口确定为500字节。
  • 每发送一个报文段,指针P2就向前移动一个报文段的距离。


  • 已发送了400字节的数据,但只收到对前200字节数据的确认,同时窗口大小不变。
  • 现在发送端还可发送300字节(即有效窗口为300)


  • 发送端收到了对方对前400字节数据的确认,但对方通知发送端必须把窗口减小到400字节。
  • 现在发送端最多还可发送400字节的数据。


  • 持续计时器(persistence timer)

问题:

B向A发送了RWin=0的报文段后不久,B的接收缓冲区又有了一些存储空间。于是B向A发送了RWin=400的报文段。然而这个报文段丢失了,则A一直等待收到B发送的非零窗口的通知,而B一直等待A发送的数据。

怎样打破僵局?

(1)只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器(persisting timer)。上例A启动持续计时器

(2)若持续计时器设置的时间到期,就发送了窗口探测(window probe)报文段(仅携带1字节的数据).

(3)对方收到这个探测报文段时,会发送确认报文段(其窗口字段正是现在的窗口值)。若窗口值不是零,则死锁的僵局就可以打破了。若窗口值仍然是零,则收到这个报文段的一方就重新设置持续计时器。(若窗口值总是0,会周期性发送探测)

TCP连接管理

  • TCP连接的三个阶段

  • TCP连接有三个阶段,即:连接建立数据传送连接释放。运输连接的管理就是使运输连接的建立和释放都能正常地进行。
  • 连接建立过程中要解决一下三个问题:(1)要使每一方能够确知对方的存在。(2)要允许双方协商一些参数(如最大报文段长度,最大窗口大小,服务质量等)。(3)能够对运输实体资源(如缓存大小,连接表中的项目等)进行分配。
  • TCP连接的建立

  • TCP连接的建立都是采用客户服务器方式。
  • 主动发起连接建立的应用进程叫做客户(client)。
  • 被动等待连接建立的应用进程叫做服务器(server)。



























































猜你喜欢

转载自blog.csdn.net/yongchaocsdn/article/details/80757979
今日推荐