05 运输层

5.1 运输层协议概述

进程之间的通信

运输层属于面向通信部分的最高层,同时也是用户功能中的最底层。

网络层为主机之间提供逻辑通信,而运输层为应用进程之间提供端到端的逻辑通信。

运输层还要对收到的报文进行差错检测。IP数据报首部中的检验和字段,只检验首部是否出现差错,不检查数据部分。

运输层的端口

注意路由器或交换机上的硬件端口是完全不同的概念。硬件端口是不同硬件设备进行交互的接口。软件端口则是应用层的各种协议进程与运输实体之间交互的一种地址。

TCP/IP的运输层采用16位的端口号标志端口。分为两类:

  • 服务器使用的端口号 这里又分两类:

    • 熟知端口号:0-1023。IANA把这些端口号给了TCP/IP最重要的一些应用程序。

    • 登记端口号:1024-49151。这类端口号的使用需要在IANA登记,防止重复。

  • 客户端使用的端口号 数值为49152-65535。这类端口号仅在客户进程运行时才动态选择。当服务器进程收到客户进程的报文时。就知道了客户进程的端口号,因而可以把数据发送给客户进程。通信结束后,客户端口号就不存在,可以供其他进程使用。

5.2 用户数据报协议 UDP

用户数据报协议只在IP的数据报服务至上增加了很少一点功能:复用和分用、差错检测。UDP的主要特点:

  • 无连接

  • 尽最大努力交付,即不保证可靠交付

  • 面向报文。直接把应用层交下来的报文加上头部后给网络层,网络层自己再拆分。因此应用程序最好选择合适大小的报文。

  • 没有拥塞控制

  • 支持一对一、一对多、多对一、多对多

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

UDP首部一共四个字段,每个字段两个字节,分别是:

  • 源端口

  • 目的端口

  • 长度,包括了数据的总长度

  • 检验和。注意IP首部的检验和只检验首部,UDP的检验和检验首部+数据

虽然UDP之间的通信要用到其端口号,但由于UDP的通信是无连接的,因此不需要使用套接字

5.3 传输控制协议TCP概述

TCP最主要的特点

  • 面向连接

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

  • 提供可靠交付的服务

  • 提供全双工通信。TCP允许通信双方的应用进程在任何时候都能发送数据。TCP在连接的两端都设有发送缓存和接受缓存

  • 面向字节流。TCP把应用进程交下来的数据仅仅看做是一连串无结构的字节流。

另外,TCP并不关心应用进程一次把多长的报文发送到TCP缓存中,而是根据对方给出的窗口值和当前网络拥塞的程度来决定一个报文应该包含多少字节。

TCP的连接

TCP连接的端点为套接字。一个套接字就是一个IP和端口号的组合。

5.4 可靠传输的工作原理

停止等待协议

含义

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

出现差错

出现差错的两种情况:

  • 分组在传输过程中丢失

  • 分组在检查时检查出错

接受方在出现上面两种情况时不做任何反应。发送方有一个超时计时器,超过一段时间后没有收到接收方的确认,便重传。

注意三点:

  • 发送方在发送完一个分组后,需要暂时保留分组的副本,以备重传使用

  • 分组和确认分组都必须编号。这样才能知道确认的是哪个分组

  • 超时计时器的重传时间应当比平均往返时间长一些。因为要考虑拥塞等情况。

通常A总是能收到对所有发出的分组的确认。如果A不断重传但是没有收到确认,说明通信线路太差,不能通信。

像上述的这种可靠传输协议常称为自动重传协议ARQ(Automatic Repeat reQuest),即意味着重传的请求是自动进行的,接收方不需要主动发重传请求。

信道利用率

停止等待协议的信道利用率较低。为了提高利用率,可以使用流水线传输。即发送反连续发送多个分组,不必每发送完一个分组就停下来等待对方确认。

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

连续ARQ协议

滑动窗口比较复杂,是TCP协议的精髓所在。在5.6节介绍

连续ARQ协议中,发送方维持一个发送窗口,并一次发送整个窗口的内容。每收到一个确认,就把方法窗口向前移动相应的位置。

接收方一般采用累积确认的方式。即在收到几个分组之后,对按顺序到达的最后一个组分进行确认。表示:到这个分组为止的所有分组都已经正确收到了。

5.5 TCP报文段的首部格式

TCP虽然是面向字节流的,但是传送的数据单元是报文段。报文段首部的前20个字节时固定的,后面有4n个可选字节。首部最长60字节。

下面说明首部字段的含义:

  • 源端口和目的端口:各两个字节,同UDP

  • 序号:4个字节。TCP字节流中每个字节都按顺序编号。这个序号的值就是本报文段发送的数据的第一个字节的编号。

  • 确认号:4个字节。期望收到对方下一个报文段的第一个数据字节的序号。如A给B发送的报文段序号为501,数据长度为200。则B给A发送的报文段的确认号就应该是701。

  • 数据偏移:4位。实际上就是TCP报文总长度。单位是字节。2^4=15,因此TCP首部总长度最大为60字节。

  • 保留位:6位。目前应置为0

下面是六个控制位:

  • URG URGent:当URG为1时,会把紧急数据插到当前报文段中数据的前面。并把紧急指针置为紧急数据的字节数。

  • ACK ACKnowledgement:仅当ACK=1时确认号才有效。在连接建立后的所有报文中,ACK都应该是1。

  • PSH PuSH:发送方把PSH置为1时,立即创建一个报文段并发送出去。接收方接收到的报文段中PSH为1时,立即交付应用层,不再等缓存满。

  • RET RsEeT:RST=1表名TCP连接出现严重错误。必须释放连接,然后重新建立连接。

  • SYN SYNchronization:在连接建立时用来同步序号。SYN=1,ACK=0时,表明这是一个连接请求报文段。接收方若同意建立连接,则在响应报文中置SYN=1,ACK=1。因此SYN=1就表示这一个连接请求或连接接受报文。

  • FIN:终止。FIN=1时释放连接。

除上面的字段之外,还有窗口、检验和和紧急指针等字段

5.6 TCP可靠传输的实现

5.7 TCP的流量控制

5.8 TCP的拥塞控制

5.9 TCP的运输连接管理

三个阶段:

  • 连接建立

  • 数据传送

  • 连接释放

TCP连接的建立采用客户服务器方式,主动发起连接的一方为客户,被动等待连接建立的应用进程为服务器。

TCP连接的建立

需要交换三个TCP报文。

  • 双方进程都会创建传输控制块TCB,存储连接中的重要信息

  • 客户进程的两个状态:SYN-SENT,ESTABLISHED

  • 服务进程的三个状态:LISTEN,SYN-RCND,ESTABLISHED

TCP连接的释放

通信的双方都可以释放连接。

  • 释放时有一个半关闭状态。这时客户已经没有数据要发送,但是如果服务一方要发送,客户一方需要接收。对应客户的状态为FIN-WAIT-2,服务的状态为CLOSE-WAIT

  • 客户最后还有一个TIME—WAIT