计算机基础-计算机网络(五)

Author Avatar
wshunli 10月 07, 2017
  • 在其它设备中阅读本文章

计算机网络-运输层 部分读书笔记

运输层协议概述

运输层提供应用进程间的逻辑通信。

运输层-运输层和网络层

网络层为主机之间提供逻辑通信(网络核心部分),运输层为应用进程之间提供端到端的逻辑通信(网络边缘部分)。
从运输层来看,通信是两主机应用进程之间相互通信。不同进程可以使用同一运输层协议传输数据。

运输层要对收到的报文进行差错检测。
在网络层,IP数据报首部的检验和字段,只检验首部而不检查数据部分。

传输层的两个主要协议

(1) 用户数据报协议 UDP (User Datagram Protocol)
(2) 传输控制协议 TCP (Transmission Control Protocol)

在 OSI 中,两个对等实体在通信时传达的数据单元叫做传输协议数据单元 TPDU 。
在 TCP/IP 中,根据协议不同分别称之为TCP报文段、UDP数据段 。

UDP 传输数据之前不需要先建立连接,不提供可靠交付。
TCP 提供面向连接的服务,传输之前先建立连接,结束后要释放连接。不提供广播或者多播服务。

运输层的端口

为了使运行在不同操作系统的计算机应用程序能够相互通信,使用统一的方法(在运输层使用协议端口号)对 TCP/IP 体系的应用进程进行标志。

在运输层使用协议端口使软端口,软件端口使应用层的各协议进程与传输实体进行层间交互的一种地址。
硬件端口使不同硬件设备进行交互的接口。

用户数据报协议 UDP

UDP 只在 IP 的数据报服务之上增加了很少一点的功能,即端口的功能和差错检测的功能。

UDP 的主要特点:

  • UDP 是无连接的,即发送数据之前不需要建立连接。
  • UDP 使用尽最大努力交付,即不保证可靠交付。
  • UDP 是面向报文的,对应用层交下来的报文、IP层交上来的UDP数据报,不合并也不拆分。
  • UDP 没有拥塞控制,很适合多媒体通信的要求。
  • UDP 支持一对一、一对多、多对一和多对多的交互通信。
  • UDP 的首部开销小,只有 8 个字节。

UDP 的首部格式:

运输层-UDP报文段

  • 源端口字段:源端口是一个大于1023的16位数字,由基于UDP应用程序的用户进程随机选择。
  • 目的端口字段:目的端口号,在终点交付报文使用。
  • 长度字段:指明了包括首部在内的UDP报文段长度。UDP长字段的值是UDP报文头的长度(8字节)与UDP所携带数据长度的总和。
  • 校验和字段:指整个UDP报文头和UDP所带的数据的校验和(也包括伪报文头)。

伪首部不包括在真正的UDP报文头中,但是它可以保证UDP数据被正确的主机收到了。因在校验和中加入了伪头标,故ICMP除能防止单纯数据差错之外,对IP分组也具有保护作用。

传输控制协议 TCP

TCP 的主要特点:

  • TCP 是面向连接的运输层协议。使用之前先建立建立连接,使用后释放。
  • 每一条 TCP 连接只能有两个端点(endpoint),每一条 TCP 连接只能是点对点的(一对一)。
  • TCP 提供可靠交付的服务,使用 TCP 连接传达的数据,无差错、不丢失、不重复,并且按序到达。
  • TCP 提供全双工通信。TCP 连接的两端都设有缓存,允许通信双方的应用进程在任何时候都能发送数据。
  • 面向字节流。TCP 把应用程序交下来的数据仅仅看成一串无结构的字节流。不保证接收方和发送方的数据块具有对应的大小关系,但是字节流完全一样,由接收方应用程序还原成有意义的应用层数据。

运输层-TCP面向字节流

  • TCP 连接是一条虚连接(逻辑连接)而不是一条真正的物理连接。
  • TCP 对应用进程一次把多长的报文发送到 TCP 的缓存中是不关心的。
  • TCP 根据对方给出的窗口值和当前网络拥塞的程度来决定一个报文段应包含多少个字节(UDP 发送的报文长度是应用进程给出的)。
  • TCP 可把太长的数据块划分短一些再传送。TCP 也可等待积累有足够多的字节后再构成报文段发送出去。

TCP 的连接

TCP 把连接作为最基本的抽象。
一条 TCP 连接有两个端点,又叫嵌套字(socket)或插口,由端口号拼接IP地址组成。

嵌套字 socket = IP地址 : 端口号

每条 TCP 连接唯一地被通信两端的两个端点所确定。即:

TCP 连接 = {socket1,socket2} = {(IP1:port1),(IP2:port2)}

TCP 连接的端点是个很抽象的嵌套字。同一 IP 地址可以有多个 TCP 连接,同一端口号也可以出现在不同的 TCP 连接中。

TCP 与 UDP 的区别

  • TCP 提供面向连接的服务。
  • TCP 不提供广播或多播服务。
  • TCP 协议数据单元的首部增大很多,还要占用许多的处理机资源。
  • UDP 在传送数据之前不需要先建立连接。
  • 对方收到 UDP 报文后,不需要给出任何确认。
  • 在某些情况下 UDP 是一种最有效的工作方式。

可靠传输的工作原理

TCP 发送的报文段是交给 IP 层传递的,但是 IP 层只能提供尽最大努力服务。也就是说,TCP下面的网络所提供的是不可靠的传输。

理想状态下的传输条件有两个特点:

  • 传输信道不产生差错。
  • 不管发送方以多快的速度发送数据,接收方总是来得及处理收到的数据。

停止等地协议 ARQ

ARQ 协议(自动重传请求)是 OSI 模型中数据链路层和传输层的错误纠正协议之一。它通过使用 确认和超时 这两个机制,在不可靠服务的基础上实现可靠的信息传输。

1、无差错情况
“停止等待” 即每发送完一个分组就停止发送,等待对方确认。在收到确认后再发送下一个分组。

运输层-停止等待协议

2、出错情况
B 接收分组使检测出差错就丢弃,其他什么也不做(不通知A收到有差错的分组),也可能发送过程中丢失了。
A 超过一段时间没有收到确认就认为分组丢失了,因而重传前面发送过的分组。

3、确认丢失和确认迟到
B 发送的确认丢失,A 又重传分组,此时B放弃重复的分组并再次向 A 发送确认。

运输层-停止等待协议-确认迟到和重复

A 收到重复的确认分组就放弃。

为了提高传输效率,发送方可以连续发送多个分组,不必每发完一个分组就停下来等待确认,即流水线传输。

流水线传输使用 连续ARQ协议和滑动窗口协议。

连续 ARQ 协议

接收方采用累计确认的方式。即接收方不必对收到的分组逐个发送确认,而是在收到几个分组后,对按需到达的最后一个分组确认,这就表示:到这分组为止的所有分组都已正确收到了。

TCP 报文段

TCP(Transmission Control Protocol)传输控制协议是一种面向连接的、可靠的、基于字节流的传输层协议

运输层-TCP报文段

  • 源端口和目标端口:和 UDP 类似,源端口号和目的端口号实现分用功能;
  • 序号:本报文段所发送的数据项目组第一个字节的序号。在TCP传送的数据流中,每一个字节都有一个序号。例如,一报文段的序号为300,而起数据共100字节,则下一个报文段的序号就是400。
  • 确认号:是期望收到对方下次发送的数据的第一个字节的序号,也就是期望收到的下一个报文段的首部中的序号。例如,B收到报文段序号字段是501,数据长度为200(字节的序号501-700),则表明B收到了A发送的到700为止的数据。因此B期望的数据序号是701,在确认报文段中确认号置为701。
  • 数据偏移:数据起始处离TCP报文段的起始处有多远。实际上是TCP报文段首部的长度,因为首部长度不固定,所以数据偏移字段是必要的。数据偏移的单位是4个字节,即首部最大长度为 4*15。
  • 保留字段: 供今后使用,目前置为0。

控制位,用来说明本报文的性质:

  • 紧急URG(URGent):当URG=1时,此报文应尽快传送,而不要按本来的列队次序来传送。与 “紧急指针” 字段共同应用,紧急指针指出在本报文段中的紧急数据的最后一个字节的序号,使接管方可以知道紧急数据共有多长;
  • 确认ACK(ARKnowledge):只有当ACK=1时,确认序号字段才有意义
  • 推送PSH(PuSH):当PSH=1时,希望接收方T尽快将本报文段传送给其应用层,而不要比及全部缓存都填满了之后再向上交付。
  • 复位RST(ReSeT):当RST=1时,表明TCP连接呈现严重错误,必须释放连接,然后再重建传输连接。复位比特还用来拒绝一个不法的报文段或拒绝打开一个连接;
  • 同步比特SYN(SYNchronization):在建立连接时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若接受建立连接,在响应的报文段中使SYN=1和ACK=1。所以,SYN=1默示这是一个连接请求或连接接受报文,而ACK的值用来区分是哪一种报文;
  • 终止FIN(FINis):用来释放一个连接,当FIN=1时,表示发送方的字节串已经发完,并请求释放传输连接;

其他:

  • 窗口:指出现在允许对方发送的数据量,窗口值从本报文段的确认号算起,总是动态变化着。
  • 检验和:检验和覆盖了整个的TCP报文段: TCP首部和TCP数据。这是一个强制性的字段,一定是由发端计算和存储,并由收端进行验证。
  • 紧急指针:参考标志字段的URG位。
  • 选项:为了适合复杂网络环境和更好地服务于应用层设计的。TCP选项最长是40字节。
  • 数据:无任何数据的TCP段也是合法的,通常用于确认和控制信息。

TCP 报文段的 选项 字段。

最大报文段长度 MSS :TCP报文段中的 数据字段 的最大长度。
窗口扩大:就是为了建立TCP连接时协商扩大窗口。
时间戳:包含时间戳值和时间戳回送回答字段。计算往返时间、防止序号重复使用时序号绕回。
选择确认:见下节。

TCP 可靠传输的实现

TCP 可靠传输 的实现:确认和重传、数据校验、数据合理分片和排序、流量控制、拥塞控制。

TCP 连接的每一端都必须设有两个窗口——一个发送窗口和一个接收窗口。
TCP 的可靠传输机制用字节的序号进行控制。TCP 所有的确认都是基于序号而不是基于报文段。

运输层-TCP可靠传输

发送过的数据未收到确认之前必须保留,以便超时重传时使用。

发送窗口后沿变化有两种可能:发送窗口不动(没收到确认)和前移(收到新的确认)。
前沿通常时不断向前移动,但也有可能不动(没有收到新的确认;收到确认但对方通知的窗口变小了)。

运输层-TCP缓存与窗口

发送缓存用来暂时存放: 发送应用程序传送给发送方 TCP 准备发送的数据;TCP 已发送出但尚未收到确认的数据。
接收缓存用来暂时存放:按序到达的、但尚未被接收应用程序读取的数据; 不按序到达的数据。

必须强调三点:

  • A 的发送窗口并不总是和 B 的接收窗口一样大(因为有一定的时间滞后)。
  • TCP 标准没有规定对不按序到达的数据应如何处理。通常是先临时存放在接收窗口中,等到字节流中所缺少的字节收到后,再按序交付上层的应用进程。
  • TCP 要求接收方必须有累积确认的功能,这样可以减小传输开销。

超时重传时间的选择

TCP 采用一种自适应算法。
TCP的发送方在规定的时间内没有收到确认就要重传已发送的报文段。但是由于TCP的下层互联网环境,发送的报文段可能只经过一个高速率的局域网,也可能经过多个低速率的网络,并且每个IP数据报所选择的路由还可能不同,因此注定超时重传时间要动态变化。

选择确认 SACK

选择确认是针对没有出错但是未按序到达的报文段,如果中间只是缺少一些报文段,那么发送方就可以不重传已发送的所有数据,而只是重传缺少的数据。

TCP 的流量控制

流量控制就是让发送方的发送速率不要太快,让接收方来得及接受。利用滑动窗口机制就可以实施流量控制。
原理这就是运用TCP报文段中的窗口大小字段来控制,发送方的发送窗口不可以大于接收方发回的窗口大小。

运输层-TCP流量控制

考虑一种特殊的情况,就是接收方若没有缓存足够使用,就会发送零窗口大小的报文,此时发送放将发送窗口设置为0,停止发送数据。之后接收方有足够的缓存,发送了非零窗口大小的报文,但是这个报文在中途丢失的,那么发送方的发送窗口就一直为零导致死锁。
解决这个问题,TCP为每一个连接设置一个持续计时器(persistence timer)。只要TCP的一方收到对方的零窗口通知,就启动该计时器,周期性的发送一个零窗口探测报文段。对方就在确认这个报文的时候给出现在的窗口大小。

注意:TCP规定,即使设置为零窗口,也必须接收以下几种报文段:零窗口探测报文段、确认报文段和携带紧急数据的报文段。

TCP 的拥塞控制

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

拥塞控制设计

拥塞控制是很难设计的,因为它是一个动态的问题,许多情况下,甚至正式拥塞控制机制本身成为引起网络性能恶化甚至死锁的原因。
从控制理论的角度来看拥塞控制这个问题,可以分为 开环控制和闭环控制 两种方法。

开环控制 就是在设计网络时事先将有关拥塞发生的所有因素考虑周到,一旦系统运行起来就不能在中途改正。

闭环控制 是基于反馈环路的概念,包括如下措施:

  1. 监测网路系统以便检测拥塞在何时何地发生;
  2. 把拥塞发生的信息传送到可采取行动的地方;
  3. 调整网络系统的行动以解决出现的问题。

拥塞控制的方法

TCP 拥塞控制的算法有四种,即慢开始(Slow-start),拥塞避免(Congestion Avoidance),快重传(Fast Restrangsmit)和快恢复(Fast Recovery)。

我们假定:
1)数据是单方向传送,而另外一个方向只传送确认。
2)接收方总是有足够大的缓存空间,因为发送窗口的大小由网络的拥塞程度来决定。

1. 慢开始和拥塞避免

发送方维持一个拥塞窗口(cwnd)的状态变量。其大小取决于网络的拥塞程度,并且动态的在变化。发送方让自己的发送窗口小于或等于拥塞窗口。

慢开始原理:

当主机开始发送数据时,如果立即将较大的发送窗口的全部数据字节都注入到网络中,那么由于不清楚网络的情况,有可能引其网络拥塞。比较好的方法是试探一下,即从小到达逐渐增大发送端的拥塞控制窗口数值。通常在刚刚开始发送报文段时可先将拥塞窗口cwnd(拥塞窗口)设置为一个最大报文段的MSS的数值。

在每收到一个对新报文段确认后,将拥塞窗口增加至多一个MSS的数值,当rwind(接收窗口)足够大的时候,为了防止拥塞窗口cwind的增长引起网络拥塞,还需要另外一个变量— 慢开始门限 ssthresh。

运输层-慢开始和拥塞避免

拥塞避免算法的思路是:让拥塞窗口cwnd线性缓慢增长。

2. 快重传和快恢复

快重传的算法思路是:

  • 要求接收方每收到一个时序的报文段后就立即发出重复确认,而不是等待发送数据时才进行捎带确认
  • 发送方只要一连收到三个重复确认,就应当立即重传对方尚未收到的报文段,而不必等待设置的重传计时器到期

快恢复的算法思路是:

  • 当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把慢开始阀值ssthresh减半
  • 接着不执行慢开始,而是从新阀值ssthresh开始执行拥塞避免算法(加法增大)

TCP拥塞控制和流量控制的差别

拥塞控制就是防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。拥塞控制所要做的都有一个前提,就是网络能承受现有的网络负荷。
拥塞控制是一个全局过程,涉及所有主机、所有路由器,以及降低网络传输性能有关的所有因素。

流量控制往往指的是点对点通信量的控制,是个端到端的问题。流量控制所要做的就是控制发送端发送数据的速率,以便使接收端来得及接受。

TCP 的运输连接管理

TCP是面向连接的协议,运输连接是用来传送TCP报文段的。运输连接有三个阶段:连接建立、数据传送、连接释放

在TCP连接建立过程中要解决三个问题:

  • 要使每一方知道对方的存在。
  • 要允许双方协商一些参数(如最大窗口值、是否使用窗口扩大选项和时间戳选项以及服务质量等)。
  • 能够对运输实体资源(如缓存大小、连接表中的项目等)进行分配。

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

TCP 的连接建立

假定主机A运行的是TCP客户程序,而B运行的是TCP服务器程序。最初两端的TCP都是处于CLOSED状态。A主动打开连接,B被动打开连接。

运输层-TCP连接建立

B的TCP服务器进程先创建传输控制块TCB,准备接受客户进程A的请求。然后服务器出于LISTEN状态,等待客户A的连接请求。

  • A的客户端进程首先创建TCB,然后向B发送连接请求报文段。这时首部中的同不好SYN = 1,同时选择一个初始序号seq = x。TCP规定,SYN(SYN = 1)报文段不能携带数据,但是要消耗一个序号。这时客户机A进入同步已发送状态(SYN-SENT)。
  • B收到连接请求的报文段后,如果同意建立连接,则向A发送确认。在确认报文段中应当把SYN和ACK的值都置为1,确认号是ack = x + 1,同时也为自己初始化一个序号seq = y。注意该报文也不能携带数据,但是需要消耗掉一个序号。此时TCP服务器进程进入同步收到状态(SYN-RCVD)。
  • TCP客户进程收到服务器端的确认后,还要想B发送确认。报文段的ACK置为1,确认号ack = y + 1,而自己的序号为seq = x + 1。TCP的标准规定,ACK报文段可以携带数据,如果不携带数据则不消耗序号,在这种情况下,下一个报文段的序号仍是seq = x + 1.这时TCP连接已经建立,此时A已经进入ESTABLISHED状态。当B收到确认后,也进入ESTABLISHED状态。

至此,A与B已经建立连接,我们称作“三报文握手”或者“三次握手”。

TCP 的连接释放

当数据传输结束后,通信的上方都可以释放连接。现在A和B都处于ESTABLISHED状态。

运输层-TCP连接释放

  • A的应用进程先向其TCP发出连接释放报文段,然后停止发送数据,主动关闭TCP连接。A的连接释放报文段把FIN置为1,其序号为seq = u,它等于前面已传送过的最后一个字节的序号加1。此时A进入FIN-WAIT-1状态,等待B的确认。TCP规定,FIN不携带数据,但是要消耗掉一个序号。
  • B收到连接释放报文段后向A发出确认,确认号是ack = u + 1,这个报文段自己的序号是v,等于B前面已传送数据的最后一个字节的序号加1。然后B进入CLOSE-WAIT状态。TCP服务器进程这时通知高层应用进程,因而从A到B这个方向的连接就释放了,这时TCP的连接处于半关闭状态,即A已经没有数据向B发送了,但是若B仍要发送数据,A依旧要接受。也就是说从B到A这个方向的连接并未关闭。
  • A收到来自B的报文段后进入FIN-WAIT-2状态,等待B的连续释放报文。
  • 如果B已经没有数据向A发送了,其应用进程就会通知TCP释放连接。这时B发送连续确认报文段必须使FIN = 1,现在B的序号为w(在半关闭状态,B可能又发送了一段数据)B还必须重复已经发送过的确认号ack = u + 1。这时B进入了LAST-ACK状态,等待A的确认。
  • A在收到B的报文段后进行确认,其确认号为w + 1(TCP规定,FIN报文段需要消耗一个序号),其自己的序号为seq = u + 1。然后进入到TIME-WAIT状态。这时需要注意的是TCP连接还没有释放掉,必须经过时间等待计时器(TIME-WAIT timer)设置的2MSL(Maximum Segment Lifetime),A才进入关闭状态。MSL叫做最大报文段寿命。

上述的TCP的释放过程我们称为“四报文握手”或者“四次挥手”。

TCP 的有限状态机

运输层-TCP有限状态机

可以非常清楚地看出 TCP 连接各种状态之间的关系。

  • 粗实线箭头表示客户机进程的正常变迁。
  • 粗虚线箭头表示服务器进程的正常变迁。
  • 细虚线表示异常变迁。

如果本文对您有所帮助,且您手头还很宽裕,欢迎打赏赞助我,以支付网站服务器和域名费用。 https://paypal.me/wshunli 您的鼓励与支持是我更新的最大动力,我会铭记于心,倾于博客。
本文链接:https://www.wshunli.com/posts/c86dd6b.html