计算机网络与互联网知识点总结(五)(面试重点部分)

本文深入解析TCP协议的关键特性,包括连接建立与释放的过程、拥塞控制、流量控制、可靠传输的实现机制,以及运输层的端口和协议数据单元。探讨了TCP如何确保数据的有序、无损传输,介绍了滑动窗口、超时重传、选择确认SACK等技术。

第五章 运输层

1、运输层协议概述

1.1 进程之间的通信

  • 运输层向上面的应用层提供通信服务,属于面向通信部分的最高层,同时也是用户功能中的最低层。
    在这里插入图片描述
  • 两个主机进行通信,就是两个主机中的应用进程互相通信。从运输层看,通信的真正端点并不是主机,而是主机中的进程端到端的通信是应用进程之间的通信。
  • 运输层的一个重要功能:复用分用
  • 运输层提供应用进程间的逻辑通信网络层为主机之间提供逻辑通信,运输层为应用进程之间提供端到端的逻辑通信
  • 运输层要对收到的报文进行差错检测。网络IP数据报首部中的检测和字段,只检测首部是否出错,不检查数据部分。
  • 运输层的两种不同的运输协议:面向连接的TCP无连接的UDP
  • 运输层采用面向连接的TCP协议时,尽管下面的网络是不可靠的,逻辑通信就相当于一条全双工的可靠信道
  • 当运输层采用无连接的UDP协议时,这种逻辑同喜仍然是一条不可靠的信道。

1.2 运输层的两个主要协议

  • 用户数据报协议UDP(User Datagram Protocol)
  • 传输控制协议TCP(Transmission Control Protocol)
  • 两个对等运输实体在通信时传送的数据单位叫做运输协议数据单元TPDU。分为:TCP报文段UDP报文段
  • UDP在传送数据之前不需要先建立连接
  • TCP提供面向连接的服务

在这里插入图片描述

1.3 运输层的端口

  • 在运输层时候协议端口号,简称为端口。虽然通信的终点是应用进程,我们只要把要传送的报文交到目的主机的某一个合适的目的端口,剩下的工作(最后交付的进程)就由TCP来完成。
  • 这种 在协议栈层间的抽象的协议端口是软件端口,区分于路由器和交换机上的硬件端口。硬件端口是不同硬件设备进行交互的接口,而软件端口是应用层的各种协议进程与运输实体进行层间交互的一种地址
  • UDP和TCP的首部格式中,有源端口目的端口。TCP/IP运输层有16位端口号来标志一个端口,端口号只具有本地意义,16位的端口号可允许有65 535个不同的端口号,足够用。
  • 因特网上计算机通信采用客户-服务器方式。客户在发起通信请求时,必须先知道对方服务器的IP地址和端口号。
  • 运输层的端口号分两大类:(1)服务器端使用的端口号分两类:最重要是:熟知端口号系统端口号,0~1023。另一类是:登记端口号,1024~49151。(2)客户端使用的端口号,49152~65535。又叫短暂端口号

2、用户数据报协议UDP

2.1 UDP概述

  • 只是在IP数据报上增加了复用、分用、差错检验功能。
  • 主要特点:(1)无连接。减少开销和数据延迟。(2)使用最大努力交付,不保证可靠交付。(3)面向报文的。应用层交给UDP多长的报文,UDP照样发送,一次交付完整报文。(4)没有拥塞控制。网络出现拥塞不会使降低源主机发送速率。(5)支持一对一、一对多、多对一、多对多的交互通信。(6)首部开销小。比TCP小。

2.2 UDP的首部格式

  • UDP有两个字段:数据字段首部字段(8字节)。
    在这里插入图片描述

  • (1)源端口 需要对方回信时选用,不需要全0.

  • (2)目的端口 交付时必须用到。

  • (3)长度 最小值是8。

  • (4)检验和 检验是否有错。

  • UDP的检验和是将首部和数据部分一起都检验

3、传输控制协议TCP

3.1 TCP主要特点

  • (1)TCP是面向连接的运输层协议。好像是打电话:通话前拨号,通话后挂机。

  • (2)每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的

  • (3)TCP提供可靠交付的服务。无差错、不丢失、不重复、按序到达。

  • (4)TCP提供全双工通信。任何时候都能发送数据,两端设有缓存。

  • (5)面向字节流。TCP中的“流”是指流入到进程或从进程流出的字节序列
    在这里插入图片描述

  • 上图,TCP连接是逻辑连接,将报文传到IP层,加上IP首部后,传入到数据链路层。再加上数据链路层首部和尾部后,发送到物理层。

3.2 TCP的连接

  • TCP把连接作为最基本的抽象。TCP连接的端点叫做套接字插口。端口号 拼接到 IP地址即构成了套接字。
  • 套接字cocket=(IP地址:端口号)套接字 cocket=(IP地址:端口号)cocket=(IP:)
  • 每一条TCP连接唯一地被通信两端的两个端点所确定
  • TCP连接::={socket1,socket2}={(IP1:port1),(IP2,port2)}TCP连接::=\{socket_1,socket_2\}=\{(IP_1:port_1),(IP_2,port_2)\}TCP::={socket1,socket2}={(IP1:port1),(IP2,port2)}
  • 这里的IP1IP_1IP1IP2IP_2IP2分别是两个端点主机的IPIPIP地址,而port1port_1port1port2port_2port2分别是两个端点主机中的端口号。TCP连接的两个套接字就是socket1socket_1socket1socket2socket_2socket2
  • socket 表示多个不同的概念:(1)允许应用程序访问连网协议的应用编程接口API。即应用层和运输层之间的接口。(2)在socket API中的一个函数名。(3)调用socket函数的端点称为socket。(4)调用socket函数,返回值称为socket描述。(5)操作系统内核中联网协议Berkeley实现称为socket实现。

4、可靠传输的工作原理

  • 理想传输条件两点:(1)传输信道不产生差错。(2)接收方来得及处理对方任何速度发送的数据。

4.1 停止等待协议

  • 下面仅讨论A发送数据,B接收数据并确认的情况。A是发送方,B是接收方
1. 无差错情况
  • 停止等待协议,(a)无差错情况。
    在这里插入图片描述
2. 出现差错
  • 上图(b)A进行超时重传,得有超时计时器
  • 注意三点:(1)A在发完分组后,必须保留已发送的分组的副本。(2)分组和确认分组都必须进行编号,才能保证哪一个收到确认。(3)超时计时器设置的重传时间应当比数据在分组传输的平均往返时间更长一些
3. 确认丢失和确认迟到
  • 假设B对A发送的对M1的确认 丢失了,A在超时重传时间内没收到确认,需要重传M1,B又收到了重传分组M1,应采取两个行动。
    在这里插入图片描述

  • (1)丢弃这个重复的分组M1,不向上交付。

  • (2)向A发送确认。

  • 这样就实现了在不可靠的传输网络上实现可靠的通信

  • 上述可靠的传输协议常称为自动重传请求ARQ

4.信道利用率
  • 停止等待的优点是简单,缺点是信道利用率太低。
    在这里插入图片描述

  • 信道利用率:U=TDTD+RTT+TAU=\frac{T_D}{T_D+RTT+T_A}U=TD+RTT+TATD.

  • 采用流水线传输,提高信道利用率:
    在这里插入图片描述

  • 使用流水线传输,就要使用连续ARQ协议滑动窗口协议

4.2 连续ARQ协议

在这里插入图片描述

  • 接收方使用累计确认的方式,收到几个分组后,对按序到达的最后一个分组发送确认
  • 优点:容易实现。缺点:不能向发送方反映出接收方已经正确收到的的信息。叫做Go-back-N。

5、TCP报文段的首部格式

在这里插入图片描述

  • (1)源端口目的端口 各占2字节。
  • (2)序号 占 4字节。共2322^{32}232个序号。序号增加到最大后,变成0。TCP连接中传送的字节流中的每一个字节都按顺序编号
  • (3)确认号 占4字节。是期望收到对方下一个报文段的第一个数据字节的序号
  • 若确认号=N,表明:到序号N-1为止的所有数据都已经正确收到
  • (5)数据偏移 占4位,TCP报文段的数据起始点距离TCP报文段的起始处有多远。即TCP首部最大长度不超过60字节。
  • (6)保留。 占 6 位。
  • (7)紧急URG URG=1,报文中有紧急数据,尽快传送。(Ctrl + C就是紧急命令)。紧急指针。
  • (8)确认ACK 连接时, ACK=1。
  • (9)推送PSH PSH=1,将报文尽快地交付接收应用进程。
  • (10)复位RST RST=1,TCP连接出现严重差错。
  • (11)同步SYN
  • (12)终止FIN FIN=1,释放运输连接。
  • (13)窗口 占2字节。是发送本报文段的一方的接收窗口。作为接受方让发送方设置其发送窗口的依据。
  • (14)检验和 占2字节。 在TCP报文前加12字节的伪首部。
  • (15)紧急指针 2字节。
  • (16)选项 长度可变 最长是 40字节。

6、TCP可靠传输的实现

  • 先介绍已字节为单位的滑动窗口,假定数据传输只在一个方向进行。即只有发送方A的发送窗口和接收方B的接收窗口。

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

  • 下图,A收到了B发来的确认报文段,窗口号是20字节,确认号是31(表明B期望收到的下一个序列号是31,序列号30为止的数据已经收到了)。
    在这里插入图片描述

  • 发送方A的发送窗口:在没收到B的确认情况下,A可以连续发出窗口的数据。凡是发出去的数据,在没有收到B的确认下,暂时保留。

  • 发送窗口里面的序号表示允许发送的序号。窗口越大,发送方可以在收到对方确认之前连续发送更多的数据,获得更高的效率。

  • 发送窗口后沿的后面部分表示已经发送且接收到了确认。前沿的前面部分表示不允许发送的,因为接收方没有为这部分数据存放缓存空间。

  • 窗口后沿变化有两种情况:不动(没有收到新的确认)和前移(收到新的确认)。窗口后沿不会后移,窗口前沿可能向后收缩,TCP强烈不赞成这样做。

  • 下图,A发送了序号31~41的数据,需要三个指针:P1,P2,P3P_1,P_2,P_3P1,P2,P3

  • B只能对按序收到的数据中的最高序号给出确认,因此B发送的确认报文段的确认号仍然是31,不是32或者是33。
    在这里插入图片描述

  • B收到了序号31的数据,并把31~33数据交付主机,并删除,将窗口向前移动3个序号,同时给A发送确认,窗口值仍为20,确认号是34。此时A的窗口可以增大。
    在这里插入图片描述

  • P2P_2P2指针向前移动和P3P_3P3重合。A的发送窗口已满,停止发送。存在以下可能:所有数据已达到B,B发出了确认。但是确认没有到达A,A经过一段时间就会重传,知道B确认为止。如果A收到B的确认,则继续发送。
    在这里插入图片描述

  • TCP缓存和窗口的关系,下图:

  • 声明两点:(1)缓存空间和序列号都是有限的,循环使用。(2)实际上缓存非常大,无法标注清楚。

  • 发送缓存用来暂时存放:(1)发送应用程序传送给发送方TCP准备发送的数据;(2)TCP已发送出但尚未收到确认的数据。

  • 接收缓存用来存放:(1)按序到达的、但尚未被接收应用程序读取的数据。(2)为按序到达的数据。
    在这里插入图片描述

  • 强调三点:(1)A窗口并不一定和B窗口一样大,A可能根据网络拥塞情况调整。(2)不按序到达的数据处理,TCP没有明确规定,一般先放到接收窗口中,等到字节流中缺少的字节收到后,再按序交付上层的应用进程。(3)TCP要求接收方必须有积累确认的功能,可以减小开销。

6.2 超时重传时间的选择

  • 设置重传时间是个复杂的事。
  • 采用自适应算法,记录一个报文段发出的时间和收到相应的确认的时间。两个时间差就是报文段的往返时间RTT。TCP保留了RTT的加权平均往返时间RTTSRTT_SRTTS
  • 新的TRRS=(1−α)×α(新的RTT样本)新的TRR_S=(1-\alpha)\times\alpha(新的RTT样本)TRRS=(1α)×α(RTT)
  • 超时计时器设置的超时重传时间RTO应略大于加权平均往返时间。
  • RTO=TRRS+4×RTTDRTO=TRR_S+4\times RTT_DRTO=TRRS+4×RTTDRTTDRTT_DRTTD是RTT的偏差的加权平均值。
  • 新的RTTD=(1−β)×(旧的RTTD)+β×∣RTTS−新的RTT样本∣新的RTT_D=(1-\beta)\times(旧的RTT_D)+\beta\times|RTT_S-新的RTT样本|RTTD=(1β)×(RTTD)+β×RTTSRTT
  • 重传报文后,收到报文确认,如何判断是对发送报文段的确认还是对后来重传报文段的确认
  • 为此,Karn提出一个算法:在计算加权平均RTTSRTT_SRTTS时,只要报文段重传了,就不采用其往返时间的样本。这样得出的加权平均RTTSRTT_SRTTS和RTO就比较准确
  • 改进方法:报文段每重传一次,就把超时重传时间RTO增大一些。

6.3 选择确认SACK

  • 一个问题:收到的报文段无差错,只是未按序号,中间缺少一些序号数据,能否只传送缺少的数据?使用选择确认

在这里插入图片描述

  • 如果要使用选择确认SACK,建立TCP连接时,就要在TCP首部的选项中加上“允许SACK”选项。

7、TCP的流量控制

7.1 利用滑动窗口实现流量控制

  • 流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收
  • 利用滑动窗口机制可以很方便地在TCP连接上实现对发送方的流量控制。
  • 通过下图,说明如何利用滑动窗口机制进行流量控制:
  • 设A向B发送数据。B告诉A:“我的接收窗口rwnd = 400”(rwnd是接收窗口)。因此,发送方的发送窗口不能超过接收方给出的接收窗口的数值。TCP的窗口单位是字节,不是报文段。设每一个报文段为100字节长,数据报文段序号的初始值设为1(seq = 1)。图中,大写ACK表示首部的确认位ACK,小写ack表示确认字段的值。
  • 接收方B进行了三次流量控制。第一次将窗口减少rwnd = 300,第二次rwnd = 200,第三次rwnd = 100,最后减少至0。
  • B向A发送了零窗口的报文段后不久,B的接收缓存又有了一些新的存储空间。于是B向A发送了rwnd = 400的报文段。如果这个报文段在传输的过程中丢失了,A一直等待B的通知,B也一直等待A发送的数据,是死锁。
  • 为解决这个问题,TCP为每一个连接设有一个持续计时器。只要TCP一方收到对方的零窗口通知,就启动持续计时器。时间到,就发送一个零窗口探测报文段(禁携带一个字节数据),对方就在确认这个探测报文段时给出了现在的窗口值。如果窗口还是零,重置持续计时器,直到窗口不是零,死锁僵局打破。
    在这里插入图片描述

7.2 必须考虑传输效率

  • 应用进程将数据传送到TCP的发送缓存,剩下的发送任务就是由TCP来控制。可以使用不同的机制来控制TCP报文段的发送时机。
  • 第一种机制是TCP维护一个变量,等于最大报文段长度MSS。是要缓存中存放的数据达到MSS字节,组装成TCP发送。
  • 第二种机制是由发送方的应用进程指明要求发送报文段,即TCP支持的推送操作。
  • 第三种机制是发送方的一个计时器期限到了,这时就把当前已有的缓存数据装入报文段(长度不超过MSS)发送。
  • 如何控制TCP报文的发送时机,是一个复杂的问题,使用Nagle算法:将第一个数据字节发送过去,其余缓存,收到确认,再发送其余数据发送。当数据达到已发送窗口一般或者达到报文段的最大长度,立即发送报文段。
  • 糊涂窗口综合症:接收方不要再缓存刚刚有了一点的小空间就急忙把这个很小的窗口大小信息通知给发送方。

8、TCP的拥塞控制

8.1 拥塞控制的一般原理

  • 计算机网络的链路容量(带宽)、交换结点缓存、处理机,是网络的资源。网络某一资源需求超过了该资源所能提供的可用部分,就是拥塞
  • ∑对资源的需求>可用资源\sum对资源的需求>可用资源>
  • 拥塞控制就是防止过多的数据注入网络中,这样可以使网络中的路由器或链路不至过载。拥塞控制是一个全局性过程
  • 流量控制是指点对点通信量的控制,是个端到端的问题。
  • 拥塞控制是一个动态的问题

8.2 几种拥塞控制方法

  • 四种方法:慢开始、拥塞避免、快重传、快恢复
  • (具体内容暂时不写)

9、TCP的运输连接管理(面试重点

  • 运输连接有三阶段:连接建立、数据传送、连接释放
  • TCP连接过程要解决三个问题:(1)要使每一方都知道对方的存在。(2)要允许双方写上一些参数。(3)能够对运输实体资源进行分配。
  • TCP连接的建立采用客户服务器方式。主动发起连接建立的应用进程叫做客户(client),被动等待连接建立的应用进程叫做服务器(server)

9.1 TCP的连接建立(重点

  • 下图是建立连接的过程。假定主机A运行的是TCP客户程序,B运行TCP服务器程序。最初两端的TCP进程处于CLOSED状态。A主动打开连接,B被动被打开连接

  • B的TCP服务器进程先创建传输控制块 TCB,准备接受客户进程的连接请求。然后服务器处于LISTEN(收听)状态。如有客户连接,作出响应。

  • A的TCP客户进程也是首先创建传输控制模块TCB,然后向B发出连接请求报文,这时首部中的同步位SYN = 1,同时选择一个初始序号seq = x。TCP规定,SYN报文段(即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。

  • 已失效的连接请求报文段的理解:A发出连接请求报文丢失未收到确认,于是A再次发送收到了确认,建立连接。A发送了两次连接请求。假设第一次没丢失,延误时间又到达了B那里,B又发出了确认,又建立了新的连接。但是A并没有建立请求,所以B一直在等待,浪费了资源。

  • 采用三次握手的方法就可以防止上述事情发生:上述情况,A不会向B的确认发出确认,B收不到确认,就知道A并没有要求建立连接。

9.2 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进入CLOSED-WAIT(关闭等待)状态。

  • A到B这个方向的连接就释放了,TCP连接处于半关闭状态,即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(前面发送过的FIN报文段要消耗一个序号)。然后进入到TIME-WAIT(时间等待)状态。但现在TCP的连接还没有释放掉。必须经过时间等待计时器设置的时间2MSL后,A才进入CLOSED状态。时间MSL叫做最长报文段寿命。当A撤销相应的传输控制块TCB后,就结束了这次TCP连接。
    在这里插入图片描述

  • 重点)为什么A在TIME-WAIT状态必须等2MSL?两个理由:

  • (1)保证A发送的最后一个ACK报文段能够到达B。如果ACK报文段丢失使得B一直处于LAST-ACK状态,B会重传FIN+ACK报文段,而A就能在2MSL时间内收到这个重传的FIN+ACK报文段。最后A和B进入CLOSED状态。如果A在TIME-WAIT不等待一段时间,而在发送完ACK报文段后立即释放连接,则无法收到B重传的FIN + ACK报文段,B无法进入CLOSED。

  • (2)为防止“已失效的连接请求报文段”出现在本连接中。A在发送完最后一个ACK报文段后,再经过时间2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。使得下一次新的连接中不会出现这种旧的连接请求报文段。

  • 只要B收到A发送的确认,就进入CLOSED状态。B在撤销相应的传输控制块TCB后,结束了TCP连接。B结束TCP要早于A一些。

  • 上述过程称为TCP释放过程是四次握手

  • 重点)除了时间等待计时器外,TCP还设置一个保活计时器:客户已经主动与服务器建立了TCP连接。后来客户端主机出现问题。服务器每收到一次客户的数据,就重新设置保活计时器,通常2个小时。2小时收不到客户的响应,服务器就发送一个探测报文段,以后每隔75分钟发送一次,一天内1次仍无客户响应,服务器认为客户端出现故障,关闭连接。

9.3 TCP的有限状态机

  • 下图,粗实线箭头表示对客户进程的正常变迁。组虚线箭头表示对服务器进程的正常变迁。细线箭头表示异常变迁。
    在这里插入图片描述
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值