传输层

概述

进程之间的通信:

  • 网络层只把分组发送到目的主机,但是真正通信的并不是主机而是主机中的进程。传输层提供了进程间的逻辑通信,传输层向高层用户屏蔽了下面网络层的核心细节,使应用程序看起来像是在两个传输层实体之间有一条端到端的逻辑通信信道。
  • 传输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最低层。
  • 当网络的边缘部分中的两个主机使用网络的核心部分的功能进行端到端的通信时,只有位于网络边缘部分的主机的协议栈才有运输层,而网络核心部分中的路由器在转发分组时都只用到下三层的功能。

TCP和UDP:

运输层需要有两种不同的运输协议,即面向连接的 TCP 和无连接的 UDP。

  • 用户数据报协议 UDP (User Datagram Protocol):是无连接的,尽最大可能交付,没有拥塞控制,面向报文(对于应用程序传下来的报文不合并也不拆分,只是添加 UDP 首部),支持一对一、一对多、多对一和多对多的交互通信。
  • 传输控制协议 TCP (Transmission Control Protocol):是面向连接的,提供可靠交付,有流量控制,拥塞控制,提供全双工通信,面向字节流(把应用层传下来的报文看成字节流,把字节流组织成大小不等的数据块),每一条 TCP 连接只能是点对点的(一对一)。

传输层的端口:

运行在计算机中的进程是用进程标识符来标志的,为了使运行不同操作系统的计算机的应用进程能够互相通信,就必须用统一的方法对 TCP/IP 体系的应用进程进行标志。解决这个问题的方法就是在运输层使用协议端口号(protocol port number),或通常简称为端口(port)。

  • 端口用一个 16 位端口号进行标志。
  • 端口号只具有本地意义,即端口号只是为了标志本计算机应用层中的各进程。在因特网中不同计算机的相同端口号是没有联系的。
  • 三类端口 :
    1.熟知端口,数值一般为 0-1023;
    2.登记端口号,数值为1024-49151,为没有熟知端口号的应用程序使用的;
    3.客户端口号,数值为49152-65535,留给客户进程选择暂时使用;
  • 常用应用层协议与传输层端口:
    http = TCP + 80;
    https = TCP + 443;
    ftp = TCP + 21;
    SMTP = TCP + 25;
    POP3 = TCP + 101;
    RDP = TCP + 3389;
    SQL = TCP + 1433;
    DNS = UDP + 53 or TCP + 53(极少情况)
  • 计算机服务(对外的服务)运行后在TCP或UDP的某个端口侦听客户端请求。

UDP

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

  • UDP 是无连接的,即发送数据之前不需要建立连接(主要针对短包,实时性要求不高的数据)
  • UDP 使用尽最大努力交付,即不保证可靠交付,同时也不使用拥塞控制
  • UDP 是面向报文。UDP 没有拥塞控制,很适合多媒体通信的要求。
  • UDP 支持一对一、一对多、多对一和多对多的交互通信。
  • UDP 的首部开销小,只有 8 个字节。

面向报文:送方 UDP 对应用程序交下来的报文,在添加首部后就向下交付 IP 层。UDP 对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。应用层交给 UDP 多长的报文,UDP 就照样发送,即一次发送一个报文。接收方 UDP 对 IP 层交上来的 UDP 用户数据报,在去除首部后就原封不动地交付上层的应用进程,一次交付一个完整的报文。应用程序必须选择合适大小的报文。

UDP首部格式:首部字段只有 8 个字节,包括源端口、目的端口、长度、检验和。12 字节的伪首部是为了计算检验和临时添加的。

TCP

TCP 概述:

主要特点:
1.TCP是面向连接的运输层协议;
2.每一条 TCP 连接只能有两个端点,每一条 TCP 连接只能是点对点的(一对一);
3.TCP 提供可靠交付的服务;
4.TCP 提供全双工通信
5.面向字节流

面向字节流的传输过程:

注意:
1.TCP 连接是一条虚连接而不是一条真正的物理连接。
2.TCP 连接的端点不是主机,不是主机的IP 地址,不是应用进程,也不是运输层的协议端口。TCP 连接的端点叫做套接字(socket),端口号拼接到 IP 地址即构成了套接字。
套接字 socket = (IP地址: 端口号);
3.每一条 TCP 连接唯一地被通信两端的两个端点(即两个套接字)所确定。即:
TCP 连接 ::= {socket1, socket2} = {(IP1: port1), (IP2: port2)};

TCP 报文首部格式:

  • 源端口和目的端口字段——各占 2 字节,端口传输层与应用层的服务接口。传输层的复用和分用功能都要通过端口才能实现。
  • 序号字段——占 4 字节,TCP 连接中传送的字节流中的每一个数据段都编上一个序号。序号字段的值则指的是本报文段所发送的数据的第一个字节的序号
  • 确认号字段——占 4 字节,是期望收到对方的下一个报文段的数据的第一个字节的序号
  • 数据偏移(即首部长度)——占 4 位,它表示首部长度,最长60个字节,故可变长度最长40个字节。
  • 保留字段——占 6 位,保留为今后使用,但目前应置为 0。
  • 紧急 URG —— 当 URG = 1 时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送。
  • 确认 ACK —— 只有当 ACK = 1 时确认号字段才有效。当 ACK = 0 时,确认号无效。
  • 推送 PSH —— 接收 TCP 收到 PSH = 1 的报文段,就尽快地交付接收应用进程,而不再等到整个缓存都填满了后再向上交付。
  • 复位 RST —— 当 RST = 1 时,表明 TCP 连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。
  • 同步 SYN —— 同步 SYN = 1 表示这是一个连接请求或连接接受报文。
  • 终止 FIN —— 用来释放一个连接。FIN = 1 表明此报文段的发送端的数据已发送完毕,并要求释放运输连接。
  • 窗口字段 —— 占 2 字节,用来让对方设置发送窗口的依据,单位为字节。
  • 检验和 —— 占 2 字节,检验和字段检验的范围包括首部和数据这两部分。在计算检验和时,要在 TCP 报文段的前面加上 12 字节的伪首部。
  • 紧急指针字段 —— 占 16 位,指出在本报文段中紧急数据共有多少个字节(紧急数据放在本报文段数据的最前面)。
  • 选项字段 —— 长度可变,TCP 最初只规定了一种选项,即最大报文段长度 MSS。MSS 告诉对方 TCP:“我的缓存所能接收的报文段的数据字段的最大长度是 MSS 个字节。”

TCP 可靠传输:

停止等待协议:

使用上述的确认和重传机制,我们就可以在不可靠的传输网络上实现可靠的通信,这种可靠传输协议常称为自动重传请求ARQ(Automatic Repeat reQuest)

TCP 滑动窗口:

  • 停止等待协议的优点是简单,但缺点是信道利用率太低。
  • 针对这一缺点,一般采用滑动窗口(流水线传输)累积确认(接收窗口)的方法提高信道利用率。
    滑动窗口:发送方可连续发送多个分组,不必每发完一个分组就停顿下来等待对方的确认。
    1.如下图所示,根据 B 给出的窗口值A构造出自己的发送窗口;
    2.A 发送了 11 个字节的数据;
    3.A 收到新的确认号后,发送窗口向前滑动;
    4.若A 的发送窗口内的序号都已用完,但还没有再收到确认,必须停止发送;
    累积确认:接收方一般采用累积确认的方式。即不必对收到的分组逐个发送确认,而是对按序到达的最后一个分组发送确认,这样就表示:到这个分组为止的所有分组都已正确收到了

TCP 流量控制:

一般说来,我们总是希望数据传输得更快一些。但如果发送方把数据发送得过快,接收方就可能来不及接收,这就会造成数据的丢失。流量控制(flow control)就是让发送方的发送速率不要太快,既要让接收方来得及接收,也不要使网络发生拥塞。利用滑动窗口机制可以很方便地在 TCP 连接上实现流量控制。

接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。将窗口字段设置为 0,则发送方不能发送数据。

TCP 拥塞控制:

拥塞控制:所要做的都有一个前提,就是网络能够承受现有的网络负荷。拥塞控制是一个全局性的过程,涉及到所有的主机、所有的路由器,以及与降低网络传输性能有关的所有因素。

流量控制:往往指在给定的发送端和接收端之间的点对点通信量的控制。主要是抑制发送端发送数据的速率,以便使接收端来得及接收。

几种拥塞控制方法:慢开始、拥塞避免、快重传、快恢复

慢开始和拥塞避免算法:

1.发送的最初执行慢开始,令 cwnd = 1,发送方只能发送 1 个报文段;当收到确认后,将 cwnd 加倍,因此之后发送方能够发送的报文段数量为:2、4、8 …

2.注意到慢开始每个轮次都将 cwnd 加倍,这样会让 cwnd 增长速度非常快,从而使得发送方发送的速度增长速度过快,网络拥塞的可能性也就更高。设置一个慢开始门限 ssthresh,当 cwnd >= ssthresh 时,进入拥塞避免,每个轮次只将 cwnd 加 1。

3.如果出现了超时,则令 ssthresh = cwnd / 2,然后重新执行慢开始。

注意:发送方需要维护一个叫做拥塞窗口(cwnd)的状态变量,注意拥塞窗口与发送方窗口的区别:拥塞窗口只是一个状态变量,实际决定发送方能发送多少数据的是发送方窗口。

快重传和快恢复:

快重传:在接收方,要求每次接收到报文段都应该对最后一个已收到的有序报文段进行确认。例如已经接收到 M1 和 M2,此时收到 M4,应当发送对 M2 的确认。
在发送方,如果收到三个重复确认,那么可以知道下一个报文段丢失,此时执行快重传,立即重传下一个报文段。例如收到三个 M2,则 M3 丢失,立即重传 M3。

快恢复:在这种情况下,只是丢失个别报文段,而不是网络拥塞。因此执行快恢复,令 ssthresh = cwnd / 2 ,cwnd = ssthresh,注意到此时直接进入拥塞避免。

注意:慢开始和快恢复的快慢指的是 cwnd 的设定值,而不是 cwnd 的增长速率。慢开始 cwnd 设定为 1,而快恢复 cwnd 设定为 ssthresh。

TCP 链接管理:

运输连接就有三个阶段,即:连接建立数据传送连接释放。运输连接的管理就是使运输连接的建立和释放都能正常地进行。

TCP建立连接的三次握手:
TCP 连接的建立都是采用客户服务器方式:
• 主动发起连接建立的应用进程叫做客户(client)
• 被动等待连接建立的应用进程叫做服务器(server)

三次握手:

  1. A 的 TCP 向 B 发出连接请求报文段,其首部中的同步位 SYN = 1,并选择序号 seq = x,表明传送数据时的第一个数据字节的序号是 x。
  2. B 的 TCP 收到连接请求报文段后,如同意,则发回确认. B 在确认报文段中应使 SYN = 1,使 ACK = 1,其确认号ack = x + 1,自己选择的序号 seq = y。
  3. A 收到此报文段后向 B 给出确认,其 ACK = 1,确认号 ack = y + 1。
  4. A 的 TCP 通知上层应用进程,连接已经建立。

注意:三次握手的原因:第三次握手是为了防止失效的连接请求到达服务器,让服务器错误打开连接。如果不进行三次握手,那么服务器就会打开两个连接。导致连接失败,如果有第三次握手,客户端会忽略服务器之后发送的对滞留连接请求的连接确认。

TCP连接释放的四次挥手:

四次挥手:

  1. A 把连接释放报文段首部的 FIN = 1,其序号seq = u,等待 B 的确认。
  2. B 发出确认,确认号 ack = u + 1,而这个报文段自己的序号 seq = v。TCP 服务器进程通知高层应用进程。从 A 到 B 这个方向的连接就释放了,TCP 连接处于半关闭状态。B 若发送数据,A 仍要接收。
  3. 若 B 已经没有要向 A 发送的数据,其应用进程就通知 TCP 释放连接。
  4. A 收到连接释放报文段后,必须发出确认。在确认报文段中 ACK = 1,确认号 ack = w + 1,自己的序号 seq = u + 1。
  5. TCP 连接必须经过时间 2MSL(最大报文存活时间)后才真正释放掉。

注意:客户端A的TIME-WAIT状态必须等待2MSL的原因:
第一,为了保证 A 发送的最后一个 ACK 报文段能够到达 B。
第二,防止 “已失效的连接请求报文段”出现在本连接中。A 在发送完最后一个 ACK 报文段后,再经过时间 2MSL,就可以使本连接持续的时间内所产生的所有报文段,都从网络中消失。这样就可以使下一个新的连接中不会出现这种旧的连接请求报文段。