05 - 运输层

170 阅读10分钟

这是我参与更文挑战的第6天,活动详情查看: 更文挑战

运输层通信概述

进程通信

从IP层来说, 通信的两端是两台主机

从运输层来看, 通信的真正端点并不是主机而是主机中的进程

主机A和主机B进行通信, 实际上是指: 运行在主机A上的某个程序和运行在主机B上的另一个程序进行通信

可靠信道

当运输层采用面向连接的TCP协议时, 相当于一条可靠信道

不可靠信道

当运输层采用无连接的UDP协议时, 相当于一条不可靠信道

UDPTCP
无连接的协议, 提供无连接的服务; 其传送的数据单元是UDP报文或用户数据报; 支持单播, 多播, 广播; 不提供可靠交付; 简单, 适用于很多应用.面向连接的协议, 提供面向连接的服务; 其传送的数据单元是TCP报文; 支持单播, 不支持多播和广播; 提供可靠服务; 复杂, 用于大多数应用

使用UDP的协议

  • DNS - 域名解析协议
  • DHCP - 动态主机配置协议
  • RIP - 路由选择协议

使用TCP的协议

  • HTTP - 超文本传输协议
  • SMTP - 电子网上传播传输协议
  • FTP - 文件传输协议

软件端口与硬件端口

在协议栈间的抽象的协议端口是软件端口

路由器或交换机上的端口是硬件端口

硬件端口是不同硬件设备进行交互的接口

软件端口是应用层的各种协议进程与运输实体进行层间交互的一种地址

端口用一个16位端口进行标志, 允许有65535个不同的端口号.

端口是为了标志本计算机应用层中的各个进程.

不同计算机的相同端口号是没有联系的

因此, 两个计算机中的进程要互相通信, 既要知道对方的IP地址, 找到对方的计算机, 又要知道对方的端口号, 找到对方计算机中的应用进程.

常用的熟知端口号

53: DNS

25: SMTP

20/21: FTP

23: Telnet

80: HTTP

443: HTTPS

用户数据报协议UDP

UDP的功能

复用和分用的功能

差错检测的功能

UDP的特点

  1. 无连接, 发送数据之前不需要建立连接, 减少了开销和发送数据之前的时延

  2. 尽最大努力交付, 不保证可靠交付

  3. 面向报文, UDP对应用层交下来的报文, 即不合并, 也不拆分, 一次交付一个完整的报文

  4. 没有拥塞控制, 网络出现的拥塞不会使源主机的发送速率降低

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

  6. 首部开销小, 只有8个字节

传输控制协议TCP

TCP的特点

  1. 面向连接
  2. 保证可靠交付
  3. 只支持一对一
  4. 提供全双工通信
  5. 面向字节流

套接字 socket = (IP地址:端口号)

socket = (192.168.1.10:8080)

TCP连接, IP地址和套接字的关系

TCP连接是由协议软件提供的一种抽象

TCP连接的端点是个很抽象的套接字, 即(IP地址:端口号)

同一个IP地址可以有多个不同的TCP连接

同一个端口号也可以出现在多个不同的TCP连接中

可靠传输的工作原理

停止等待协议

停止等待. 每发送完一个分组就停止发送, 等待对方的确认. 在收到确认后再发送下一个分组.

编号. 对发送的每个分组和确认都进行编号

自动重传请求. 发送方为每个发送的分组设置一个超时计时器. 若超时计时器超时, 发送方会自动重传分组.

简单, 但是信道利用率太低

连续ARQ协议

发送方一次可以发出多个分组

使用滑动窗口协议控制发送方和接收方所能发送和接收的分组数量和编号

每收到一个确认, 发送方就把发送窗口向前滑动

接收方一般采用累积确认的方式

采用回退N方法进行重传

TCP报文段的首部格式

TCP首部.png

源端口 - 占2字节.

目的端口 - 占2字节.

序号字段 - 占4字节. TCP连接数据流中的每一个字节都编上一个序号. 序号字段的值则指的是本报文段所发送的数据的第一个字节的序号.

确认号字段 - 占4字节, 期望收到对方的下一个报文段的数据的第一个字节的序号

数据偏移- 占4位. 指出TCP报文段的数据起始处距离TCP报文段的起始处有多远.

保留字段 - 占6位. 保留为今后使用, 目前为0

紧急URG - 当为1时, 表明紧急指针字段有效. 它告诉系统此报文段中有紧急数据, 就尽快传送

确认ACK - 当为1时, 确认号字段才有效. 当为0时, 确认号无效

推送PSH - 接收TCP收到PSH=1时的报文段, 就尽快交付接收应用进程, 而不再等到整个缓存都填满了后再向上交付.

复位RST - 当为1时, 表示TCP连接出现严重差错, 必须释放连接, 然后再重新建立连接

同步SYN - 当为1时, 表示这是一个连接请求或连接接受报文.

终止FIN - 用来释放一个连接. 当为1时表示此报文段的发送端的数据已发送完毕, 并要求释放运输连接.

窗口字段 - 占2字节. 用来让对方设置发送窗口的依据.

检验和 - 占2字节. 检验和字段检验的范围包括首部和数据这两部分. 在计算检验和时, 要在TCP报文段的前面加上12字节的伪首部.

紧急指针字段 - 占16位. 指出在本报文段中紧急数据共有多少个字节.

选项字段 - 长度可变. TCP最初只规定了一种选项, 即最大报文段长度MSS.

填充字段 - 这是为了使首部长度是4字节的整数倍

TCP可靠传输的实现

发送窗口表示: 在没有收到确认的情况下, 可以连续把窗口内的数据全部发送出去

接收窗口表示: 只允许接收落入窗口内的数据

发送缓存: 发送方的应用进程把字节流写入TCP的发送缓存

​ 发送窗口通常只是发送缓存的一部分

发送缓存的作用

  1. 发送应用程序传送给发送方TCP准备发送的数据
  2. TCP已发送出但尚未收到确认的数据

接收缓存: 接收方的应用进程从TCP的接收缓存中读取字节流

接收缓存的作用

  1. 按序到达的, 但尚未被接收应用程序读取的数据
  2. 不按序到达的数据

TCP的流量控制

让发送方的发送速率不要太快, 既要让接收方来得及接收, 也不要使用网络发生拥塞

利用滑动窗口机制在TCP连接上实现流量控制

控制TCP报文段的发送时机

  1. 第一种机制是TCP维持一个变量, 它等于最大报文段长度MSS. 只要缓存中存放的数据达到MSS字节时, 就组装成一个TCP报文段发送出去
  2. 第二种机制是由发送方的应用进程指明要求发送报文段, 即TCP支持的推送操作
  3. 第三种机制是发送方的一个计时器期限到了, 就把当前已有的缓存数据装入报文段(长度不超过MSS)发送出去.

TCP的拥塞控制

引起网络拥塞的因素

  • 点缓存的容量太小
  • 链路的容量不足
  • 处理机处理的速率太慢
  • 拥塞本身会进一步加剧拥塞

拥塞控制与流量控制的区别

拥塞控制: 防止过多的数据注入到网络中, 使网络中的路由器或链路不致过载; 是一个全局性的过程, 涉及到与降低网络传输性能有关的所有因素

流量控制: 抑制发送端发送数据的速率, 以使接收端来得及接收; 是点对点通信量的控制, 是端到端的问题

开环控制与闭环控制

开环控制: 在设计网络时, 事先考虑周全, 力争避免发生拥塞

闭环控制: 基于反馈环路的概念; 根据网络当前的运行状态采取相应控制措施.

属于闭环控制的几种措施

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

监测网络拥塞的指标

  1. 由于缺少缓存空间而被丢弃的分组的百分数
  2. 平均队列长度
  3. 超时重传的分组数
  4. 平均分组时延
  5. 分组时延的标准差

解决拥塞的思路

增加网络可用资源

减少用户对资源的需求

TCP的拥塞控制方法

TCP采用基于窗口的方法进行拥塞控制.

TCP发送方维持一个拥塞窗口

发送方利用拥塞窗口根据网络的拥塞情况调整发送的数据量

发送窗口的大小不仅取决于接收窗口, 还取决于网络的拥塞状况

真正的发送窗口值 = Min(接收方窗口值, 拥塞窗口值)

控制拥塞窗口的原则

只要网络没有出现拥塞, 拥塞窗口就可以再增大一些, 以便把更多的分组发送出去, 以提高网络的利用率

只要网络出现拥塞或有可能出现拥塞, 就把拥塞窗口减小一些, 以减少注入到网络中的分组数, 以便缓解网络出现的拥塞

拥塞的判断

重传定时器超时 - 网络已经发生了拥塞

收到三个重复的ACK - 预示网络可能会出现拥塞

TCP拥塞控制算法

慢开始

拥塞避免

快重传

快恢复

TCP的运输连接管理

TCP连接的三个阶段

连接建立

数据传送

连接释放

客户-服务器方式

TCP连接的建立采用客户服务器方式

主动发起连接建立的采用进程叫做客户

被动等待连接建立的应用进程叫做服务器

建立连接的三次握手

  1. 客户端首先发送一个带有SYN标志的数据包给服务器端
  2. 服务器端接收后, 回传一个带有SYN和ACK标志的数据包传递确认信息, 表示收到了
  3. 客户端再回传一个带有ACK标志的数据包, 代表我知道你收到了

释放连接的四次挥手

  1. 客户端发送一个FIN, 表示我要关闭连接了
  2. 服务器端收到客户端的FIN后, 发送一个ACK给客户端, 表示我知道你要关闭连接了
  3. 服务器端发送一个FIN, 表示我也要关闭连接了
  4. 客户端收到服务器的FIN后, 发送一个ACK给服务器端, 表示我也知道你要关闭连接了, 至此连接释放