本篇博客将讲解我在计算机网络课程上学到的相关概念以及总结理解,今天将介绍运输层方面的知识,希望能帮助大家理解计算机网络中的一些概念
首先看一下我们第一章讲过的五层协议体系结构,想了解第一章的博客可以戳这里 ,本系列的博客也将按照这五层的顺序进行介绍
1. 运输层协议概述
运输层的作用就是进程之间的通信 ,运输层向它上面的应用层提供通信服务,它属于面向通信部分 的最高层,同时也是用户功能中的最低层。只有位于网络边缘部分的主机的协议栈才有运输层
进程之间的通信
主机A与主机B通信有两种含义:
- 通信的两端是两台主机(从IP角度来看)
- 通信的的真正端点并不是主机而是主机中的进程
运输层为相互通信的应用进程提供了逻辑通信
运输层的端口
由于在互联网上使用的计算机的操作系统种类很多,而不同的操作系统又使用不同格式的进程标识符。此外,每次软件运行的进程标识符是可能会发生变化的。
解决这个问题的方法就是在运输层使用协议端口号,或通常简称为端口 (port)。
区分软件端口和硬件端口
- 软件端口是在协议栈层间的抽象的协议端口,是应用层的各种协议进程与运输实体进行层间交互的一种地址。
- 硬件端口是路由器或交换机上的端口,是不同硬件设备进行交互的接口
TCP/IP 运输层端口
用一个 16 位端口号进行标志,端口号只具有本地意义,即端口号只是为了标志本计算机应用层中的各进程。在互联网中,不同计算机的相同端口号是没有联系的。
两大类端口
2. 用户数据报协议 UDP
特点
在 IP 的数据报服务之上增加了运输层协议复用和分用的功能和差错检测的功能
- UDP 是无连接的 ,发送数据之前不需要建立连接,这样做的好处是减少了开销和发送数据之前的时延。 2.UDP 使用尽最大努力交付 ,即不保证可靠交付,因此主机不需要维持复杂的连接状态表。
- UDP 是面向报文的 。UDP 对应用层交下来的报文 ,既不合并,也不拆分,而是保留这些报文的边界。UDP 一次交付一个完整的报文。即应用层交给 UDP 多长的报文,UDP 就照样发送。
- UDP 没有拥塞控制,因此网络出现的拥塞不会使源主机的发送速率降低。这对某些实时应用是很重要的。很适合多媒体通信的要求。
- UDP 支持一对一、一对多、多对一和多对多的交互通信。
- UDP 的首部开销小,只有 8 个字节,比 TCP 的 20 个字节的首部要短。
首部格式
8字节的首部,分别有如下内容
源端口 | 目的端口 | 长度 | 检验和 |
---|---|---|---|
2字节 | 2字节 | 2字节 | 2字节 |
3. 传输控制协议 TCP
特点
- TCP 是面向连接的运输层协议。
- 每一条 TCP 连接只能有两个端点 ,每一条 TCP 连接只能是点对点的(一对一),不能进行多播和广播(一对多)。
- TCP 提供可靠交付的服务(无差错、不丢失、不重复并且按序到达)。
- TCP 提供全双工通信。
- 面向字节流:虽然应用程序和 TCP 的交互是一次一个数据块,但 TCP 把应用程序交下来的数据看成仅仅是一连串无结构的字节流。
套接字
TCP 连接的端点叫做套接字 (socket),端口号拼接到 IP 地址即构成了套接字。每一条 TCP 连接唯一地被通信两端的两个端点(即两个套接字)所确定。 以下是一个套接字的例子
IP地址 | : | 端口号 |
---|---|---|
119.75.217.109 | : | 2028 |
可靠传输的工作原理
IP 网络所提供的是不可靠的传输,TCP要采取对应的措施,使得网络传输变得可靠
停止等待协议
"停止等待"就是每发送完一个分组就停止发送,等待对方的确认。在收到确认后再发送下一个分组。
在无差错的情况
A 发送分组 M1,发完就暂停发送,等待 B 的确认 (ACK)。B 收到了 M1 向 A 发送 ACK。A 在收到了对 M1 的确认后,就再发送下一个分组 M2。
出现差错的情况
在接收方 B 会出现两种情况:
- B 接收 M1 时检测出了差错,就丢弃 M1,其他什么也不做(不通知 A 收到有差错的分组)。
- M1 在传输过程中丢失了,这时 B 当然什么都不知道,也什么都不做。
在这两种情况下,B 都不会发送任何信息。 但A都必须重发分组,直到B正确接收为止,这样才能实现可靠通信。
A通过超时重传的方式来确认是否需要重传
要点总结
- 停止等待。发送方每次只发送一个分组。在收到确认后再发送下一个分组。
- 编号。对发送的每个分组和确认都进行编号。
- 自动重传请求。发送方为每个发送的分组设置一个超时计时器。若超时计时器超时,发送方会自动重传分组。
- 简单,但信道利用率太低。
连续ARQ协议
基本思想
- 发送方一次可以发出多个分组。
- 使用滑动窗口协议控制发送方和接收方所能发送和接收的分组的数量和编号。
- 每收到一个确认,发送方就把发送窗口向前滑动。
- 接收方一般采用累积确认的方式。
- 采用回退N(Go-Back-N)方法进行重传。
累积确认的方式。即不必对收到的分组逐个发送确认,而是对按序到达的最后一个分组发送确认,这样就表示:到这个分组为止的所有分组都已正确收到了。
TCP 可靠通信的具体实现
- TCP 连接的每一端都必须设有两个窗口------一个发送窗口和一个接收窗口。
- TCP 的可靠传输机制用字节的序号进行控制。TCP 所有的确认都是基于序号而不是基于报文段。
- TCP 两端的四个窗口经常处于动态变化之中。
- TCP连接的往返时间 RTT 也不是固定不变的。需要使用特定的算法估算较为合理的重传时间。
两种协议的对比
连续ARQ协议 | 停止等待协议 | |
---|---|---|
发送分组数量 | 一次发送多个分组 | 一次发送一个分组 |
传输控制 | 滑动窗口协议 | 停止-等待 |
确认 | 单独确认+累积确认 | 单独确认 |
超时定时器 | 每个发送的分组 | 每个发送的分组 |
编号 | 每个发送的分组 | 每个发送的分组 |
重传 | 回退N,多个分组 | 一个分组 |
首部格式
- 源端口和目的端口字段------各占 2 字节。端口是运输层与应用层的服务接口。运输层的复用和分用功能都要通过端口才能实现。
- 序号字段------占 4 字节。TCP 连接中传送的数据流中的每一个字节都编上一个序号。序号字段的值则指的是本报文段所发送的数据的第一个字节的序号。
- 确认号字段------占 4 字节,是期望收到对方的下一个报文段的数据的第一个字节的序号。说明这之前的都发了。
- 数据偏移(即首部长度)------占 4 位,它指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远。"数据偏移"的单位是 32 位字(以 4 字节为计算单位)。
- 紧急 URG ------ 当 URG=1 时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。
- 确认 ACK ------ 只有当 ACK =1 时确认号字段才有效。当 ACK =0 时,确认号无效。
- 推送 PSH (PuSH) ------ 接收 TCP 收到 PSH = 1 的报文段,就尽快地交付接收应用进程,而不再等到整个缓存都填满了后再向上交付。
- 复位 RST (ReSeT) ------ 当 RST=1 时,表明 TCP 连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接
- 同步 SYN ------ 同步 SYN = 1 表示这是一个连接请求或连接接受报文。
- 终止 FIN (FINish) ------ 用来释放一个连接。FIN=1 表明此报文段的发送端的数据已发送完毕,并要求释放运输连接。
- 窗口字段 ------ 占 2 字节,用来让对方设置发送窗口的依据,单位为字节。
- 检验和 ------ 占 2 字节。检验和字段检验的范围包括首部和数据这两部分。
- 紧急指针字段 ------ 占 16 位,指出在本报文段中紧急数据共有多少个字节(URG=1,紧急数据放在本报文段数据的最前面)。
- 选项字段 ------ 长度可变。TCP 最初只规定了一种选项,即最大报文段长度 MSS。MSS 告诉对方 TCP:"我的缓存所能接收的报文段的数据字段的最大长度是 MSS 个字节。"
- 填充字段 ------ 这是为了使整个首部长度是 4 字节的整数倍。
4. TCP 的流量控制和TCP 的拥塞控制
流量控制
流量控制 (flow control) 就是让发送方的发送速率不要太快,既要让接收方来得及接收,也不要使网络发生拥塞。利用滑动窗口机制可以很方便地在 TCP 连接上实现流量控制。
为解决死锁问题,TCP 为每一个连接设有一个持续计时器。
- 只要 TCP 连接的一方收到对方的零窗口通知,就启动该持续计时器。
- 若持续计时器设置的时间到期,就发送一个零窗口探测报文段(仅携带 1 字节的数据),而对方就在确认这个探测报文段时给出了现在的窗口值。
- 若窗口仍然是零,则收到这个报文段的一方就重新设置持续计时器。
- 若窗口不是零,则死锁的僵局就可以打破了。
糊涂窗口综合症
每次仅发送一个字节或很少几个字节的数据时,有效数据传输效率变得很低的现象。
发送方糊涂窗口综合症
发送方 TCP 每次接收到一字节的数据后就发送。 这样,发送一个字节需要形成 41 字节长的 IP 数据报。效率很低。 解决方法:使用 Nagle 算法。
接收方糊涂窗口综合症
解决方法:让接收方等待一段时间,使得或者接收缓存已有足够空间容纳一个最长的报文段,或者等到接收缓存已有一半空闲的空间。只要出现这两种情况之一,接收方就发出确认报文,并向发送方通知当前的窗口大小。
拥塞控制
在某段时间,若对网络中某资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏。这种现象称为拥塞 (congestion)。 最坏的结果会导致系统崩溃
拥塞控制所起的作用
开环控制
在设计网络时,事先考虑周全,力求工作时不发生拥塞;
闭环控制
在发生拥塞后,采取措施进行控制,消除拥塞。
属于闭环控制的有以下几种措施:
- 监测网络系统,以便检测到拥塞在何时、何处发生。
- 将拥塞发生的信息传送到可采取行动的地方。
- 调整网络系统的运行以解决出现的问题。
TCP的拥塞控制的方式
TCP 采用基于窗口的方法进行拥塞控制。该方法属于闭环控制方法。
- TCP发送方维持一个拥塞窗口 cwnd
- 发送端利用拥塞窗口根据网络的拥塞情况调整发送的数据量。
- 发送窗口大小不仅取决于接收方窗口,还取决于网络的拥塞状况,
真正的发送窗口值 = Min (接收方窗口值,拥塞窗口值)
慢开始和拥塞避免算法的实现举例
5. TCP 的运输连接管理
TCP 连接有三个阶段: 连接建立 数据传送 连接释放
而TCP 连接的管理就是使 TCP 连接的建立和释放都能正常地进行
连接的建立
TCP 建立连接的过程叫做握手。 握手需要在客户和服务器之间交换三个 TCP 报文段。称之为三报文握手。
- A 的 TCP 向 B 发出连接请求报文段,其首部中的同步位 SYN = 1,并选择序号 seq = x,表明传送数据时的第一个数据字节的序号是 x。
- B 的 TCP 收到连接请求报文段后,如同意,则发回确认。 B 在确认报文段中应使 SYN = 1,使 ACK = 1,其确认号 ack = x + 1,自己选择的序号 seq = y。
- A 收到此报文段后向 B 给出确认,其 ACK = 1,确认号 ack = y + 1。 A 的 TCP 通知上层应用进程,连接已经建立。
- B 的 TCP 收到主机 A 的确认后,也通知其上层应用进程:TCP 连接已经建立。
连接的释放
数据传输结束后,通信的双方都可释放连接。 TCP 连接释放过程是四报文握手。
-
现在 A 的应用进程先向其 TCP 发出连接释放报文段,并停止再发送数据,主动关闭 TCP 连接。 A 把连接释放报文段首部的FIN = 1,其序号seq = u,等待 B 的确认。
-
B 发出确认,确认号 ack = u+1,而这个报文段自己的序号 seq = v。 TCP 服务器进程通知高层应用进程。 从 A 到 B 这个方向的连接就释放了,TCP 连接处于半关闭状态。B 若发送数据,A 仍要接收。
-
若 B 已经没有要向 A 发送的数据, 其应用进程就通知 TCP 释放连接。
-
A 收到连接释放报文段后,必须发出确认,确认报文段中ACK = 1,确认号 ack = w + 1,自己的序号 seq = u + 1