博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【计算机网络】传输层
阅读量:3926 次
发布时间:2019-05-23

本文共 5083 字,大约阅读时间需要 16 分钟。

  • 微信搜索:编程笔记本
  • 微信搜索:编程笔记本
  • 微信搜索:编程笔记本

点击上方蓝字关注我,我们一起学编程

欢迎小伙伴们分享、转载、私信、赞赏

小伙伴儿们看完以后可不可以帮我点亮一下在看呀~

传输层概述

文章目录

1 传输层协议概述

1.1 进程之间的通信

从通信和信息处理的角度看,传输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最底层。当网络的边缘部分中的两台主机使用网络的核心部分的功能进行端到端的通信时,只有主机的协议栈才有传输层,而网络核心部分中的路由器在转发分组时都只用到下三层的功能。

下图说明了传输层的作用。设局域网 LAN1 上的主机 A 和局域网 LAN2 上的主机 B 通过互连的广域网 WAN 进行通信。我们知道,IP 协议能把源主机 A 发送出的分组,按照首部中的目的地址,送交到目的主机 B 。那么,为什么还需要传输层?

图1

**从 IP 层来说,通信的两端是两台主机。**IP 数据报的首部明确地标志了这两台主机的 IP 地址。但“两台主机之间的通信”这种说法还不够清楚。这时因为,真正进行通信的实体是在主机中的进程,是这台主机中的一个进程和另一台主机中的一个进程在交换数据(即通信)。因此严格地讲,两台主机进行通信就是两台主机中的应用进程互相通信

IP 协议虽然能把分组送到目的主机,但是这个分组还停留在主机的网络层而没有交付到主机中的应用进程。从传输层的角度看,通信的真正端点并不是主机而是主机中的进程。也就是说,端到端的通信实际上是应用进程之间的通信。

在一台主机中,经常有多个应用程序同时分别和另一台主机中的多个应用程序通信。例如上图中,主机 A 的应用进程 AP1 和主机 B 的应用进程 AP3 通信,与此同时,应用进程 AP2 也和对方的应用进程 AP4 通信。

这表明传输层有一个很重要的功能——复用(multiplexing)和分用(demultiplexing)。这里的“复用”是指发送方不同的应用进程都可以使用同一个传输层协议传送数据(加上适当的首部),而“分用”是指接收方的传输层在剥去报文的首部后能够把这些数据正确交付给目的应用进程。

上图中两个传输层之间有一个双向粗箭头,写明“运输层提供应用程序间的逻辑通信”。

逻辑通信的意思是:从应用层来看,只要把应用层的报文交给下面的传输层,传输层就可以把这个报文传送到对方的传输层,就好像这种通信就是沿水平方向直接传送数据。但事实上这两个传输层之间并没有一条水平方向的物理连接。数据的传送是沿着图中的虚线方向(经过多个层次)传送的。

图2

从上图可以看出网络层和传输层有明显的区别。网络层为主机之间提供逻辑通信,而传输层为应用进程之间提供端到端的逻辑通信。另外,传输层还需要对报文进行差错检测,提供面向连接的 TCP无连接的 UDP

1.2 传输层的两个主要协议

TCP/IP 传输层的两个主要协议分别是:

  • 用户数据报协议(UDP, User Datagram Protocol)
  • 传输控制协议(Transmission Control Protocol)

下图给出了这两种协议在协议栈中的位置。

图3

**UDP 在传送数据之前不需要建立连接。**远地主机的传输层在收到 UDP 报文后,不需要给出任何确认。虽然 UDP 不提供可靠交付,但在某些情况下 UDP 却是一种最有效的工作方式。

**TCP 提供面向连接的服务。**在传送数据之前必须先建立连接,数据传送结束后要释放连接。TCP 不提供广播或多播服务。由于 TCP 提供可靠的、面向连接的传输服务,因此不可避免地增加了许多开销,如确认、流量控制、计时器及连接管理等。这不仅使协议数据单元的首部增大很多,还要占用许多的处理机资源。

下图给出了一些应用和应用层协议主要使用的传输层协议(UDP 或 TCP)。

图4

1.3 传输层的端口

应用层所有的应用进程都可以通过传输层再传送到网络层,这就是复用。传输层从网络层收到发送给各个应用进程的数据后,必须分别交付给指明的各应用进程,这就是分用。显然,给应用层的每个应用进程赋予一个明确的标志是至关重要的。

解决这个问题的方法就是在传输层使用协议端口号(protocol port number),或通常简称为端口(port)。这就是说,虽然通信的终点是应用进程,但只要把所传送的数据交到目的主机的某个合适的目的端口,剩下的工作(即最后交付给目的进程)就由 TCP 或 UDP 来完成。

注意:这种在协议栈层间的抽象的协议端口是软件端口,和路由器或交换机上的硬件端口是完全不同的概念。

硬件端口是不同硬件设备进行交互的接口,而软件端口是应用层的各种协议进程与传输实体进行交互的一种地址。
不同的系统具体实现端口的方法可以是不同的。

TCP/IP 的传输层用一个 16 位端口号来标志一个端口。16 位端口号可允许有 65535 个不同的端口号,这个数目对一个计算机来说是足够用的。

注意:端口号只具有本地意义,它只是为了标志本计算机应用层中的各个进程在和传输层交互时的层间接口。在互联网不同的计算机中,相同的端口号是没有关联的。

由此可见,两个计算机中的进程要互相通信时,不仅必须知道对方的 IP 地址(为了找到对方的计算机),而且要知道对方的端口号(为了找到对方计算机中的应用程序)。互联网上的计算机通信采用客户端-服务器模式。客户端在发起通信请求时,必须先知道对方服务器的 IP 地址和端口号。因此传输层的端口号分为下面两大类。

  • 服务端使用的端口号
    这里又分为两类,最重要的一类叫做熟知端口号(well-known port number)或系统端口号,数值为 0~1023 。IANA 把这些端口号指派给了 TCP/IP 最重要的一些应用程序,让所有的用户都知道。另一类叫做登记端口号,数值为 1024~49151 。这类端口号是为没有熟知端口号的应用程序使用的。

图5

  • 客户端使用的端口号
    数值为 49152~65535 。由于这类端口号仅在客户端进程运行时才动态选择,因此又叫短暂端口号。这类端口号留给客户端进程选择暂时使用。当服务器进程收到客户端进程的报文后,就知道了客户端所使用的端口号,因而可以把数据发送给客户进程。通信结束后,刚才已经使用过的客户端口号就不复存在,这个端口号就可以供其他客户端进程使用。

2 用户数据报协议 UDP

2.1 UDP 概述

用户数据报协议 UDP 只在 IP 的数据报服务之上增加了很少一点的功能,这就是复用分用的功能以及差错检测的功能。UDP 的主要特点是:

  • UDP 是无连接的
    即发送数据之前不需要建立连接(数据发送结束也不需要释放连接),因此减少了开销和发送数据之前的时延。
  • UDP 使用最大努力交付
    即不保证可靠交付,因此主机对应用程序交下来的报文,在添加首部后就向下交付给网络层。**UDP 对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。**这就是说,应用层交给 UDP 多长的报文,UDP 就照样发送,即一次发送一个报文。

如下图所示,在接收方的 UDP,对 IP 层交上来的 UDP 用户数据报,在除去首部后就原封不动地交付给上层的应用进程。也就是说,UDP 一次交付一个完整的报文

因此,应用程序必须选择合适大小的报文。若报文太长,UDP 把它交给 IP 层后,IP 层在传送时可能要进行分片,这会降低 IP 层的效率。反之,若报文太短,UDP 把它交给 IP 层后,会使 IP 数据报首部的相对长度太大,这也降低了 IP 层的效率。

图6

  • 微信搜索:编程笔记本

  • 微信搜索:编程笔记本

  • 微信搜索:编程笔记本

  • UDP 没有拥塞控制

    因此网络出现的拥塞不会使源主机的发送速率降低,这对某些实时应用是很重要的。

很多的实时应用(IP 电话、实时视频会议等)要求源主机以恒定的速率发送数据,并且允许在网络发生拥塞时丢失一些数据,但不允许数据有太大的时延。UDP 正好适合这种要求。

  • UDP 支持一对一、一对多、多对一和多对多的交互通信
  • UDP 的首部开销小
    只有 8 个字节,比 TCP 的 20 个字节的首部要短。

2.2 UDP 的首部格式

用户数据报 UDP 有两个字段:首部字段数据字段。首部字段很简单,只有 8 个字节,由四个字段组成,每个字段的长度为 2 个字节。如图所示。

图7

各字段意义如下:

  • 源端口
    源端口号,在需要对方的回信时选用,不需要时可用全 0 。
  • 目的端口
    目的端口号,这在终点交付报文时必须使用。
  • 长度
    UDP 用户数据报的长度,其最小值是 8(仅有首部,无数据部分)。
  • 检验和
    检测 UDP 用户数据报在传输中是否有错,有错就丢弃。

当传输层从网络层收到 UDP 数据报时,就根据首部中的目的端口,把 UDP 数据报通过相应的端口,上交最后的终点——应用进程。

下图是 UDP 基于端口分用的示意图。

图8

如果接收方 UDP 发现收到的报文中的端口号不正确(即不存在对应该端口号的应用进程),就丢弃该报文,并由网际控制报文协议 ICMP 发送**“端口不可达”差错报文**给发送方。

注意:虽然 UDP 之间的通信要用到其端口号,但由于 UDP 的通信是无连接的,因此不需要使用套接字(TCP 之间的通信必须要在两个套接字之间建立连接)。

UDP 用户数据报首部中检验和的计算方法有些特殊。在计算检验和时,要在 UDP 用户数据报之前增加 12 个字节的伪首部。所谓伪首部,是因为这种伪首部不是 UDP 用户数据报真正的首部。只是在计算检验和时,临时添加到 UDP 用户数据报前面,得到一个临时的 UDP 用户数据报。检验和就是按照这个临时的 UDP 用户数据报来计算的。伪首部既不向下传递也不向上递交,而仅仅是为了计算检验和。

UDP 计算检验和的方法和计算 IP 数据报首部检验和的方法类似。但不同的是,IP 数据报的检验和只检验 IP 数据报的首部,但 UDP 的检验和是把首部和数据部分一起都检验的。

3 传输控制协议 TCP 概述

3.1 TCP 最主要的特点

TCP 是 TCP/IP 体系中非常复杂的一个协议。下面介绍 TCP 最主要的特点。

  • TCP 是面向连接的传输层协议
    这就是说,应用程序在使用 TCP 协议之前,必须先简历 TCP 连接。在传送数据完毕后,必须释放已经建立的 TCP 连接。
  • 每一条 TCP 连接只能有两个端点(endpoint)
    每一条 TCP 连接只能是点对点的(一对一)。
  • TCP 提供可靠交付的服务
    通过 TCP 连接传送的数据,无差错、不丢失、不重复,并且按序到达。
  • TCP 提供全双工通信**
    TCP 允许通信双方的应用进程在任何时候都能发送数据。TCP 连接的两端都设有发送缓存和接收缓存,用来临时存放双向通信的数据。

在发送时,应用程序在把数据传给 TCP 的缓存后,就可以做自己的事,而 TCP 在合适的时候把数据发送出去。

在接收时,TCP 把收到的数据放入缓存,上层的应用进程在合适的时候读取缓存中的数据。

  • 面向字节流
    TCP 中的“流”指的是流入到进程或从进程流出的字节序列。“面向字节流”的含义是:虽然应用程序和 TCP 的交互是一次一个数据块(大小不等),但 TCP 把应用程序交下来的数据仅仅看成是一连串的无结构字节流。TCP 并不知道所传送的字节流的含义。

3.2 TCP 的连接

**TCP 把连接作为最基本的抽象。**TCP 的许多特性都与 TCP 是面向连接的这个基本特性有关。

前面我们说过,每一条 TCP 连接有两个端点,这个端点就叫做套接字(socket)或插口。套接字的表示方法是在点分十进制的 IP 地址后面写上端口号,中间用冒号或逗号隔开。

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

由于每一条 TCP 连接唯一地被通信两端的两个端点(即两个套接字)所确定,则有:

TCP 连接 := { socket1, socket2 } = { (IP1 : port1), (IP2 : port2) }

注意:同一个 IP 地址可以有多个不同的 TCP 连接,而同一个端口号也可以出现在多个不同的 TCP 连接中。

  • 微信搜索:编程笔记本
  • 微信搜索:编程笔记本
  • 微信搜索:编程笔记本
你可能感兴趣的文章
codeforces 394A Counting Sticks(题目虽简单,但是考虑的情况多,需仔细)
查看>>
codeforces 394 B. Very Beautiful Number(思路较难,优化的地方多)好题。。。
查看>>
poj 3225 Help with Intervals(线段树+区间的交集,差集,补集,并集)好难的题目,一天了,真是纠结
查看>>
poj 1664 放苹果(递推,记忆化搜索)简单题
查看>>
poj 1436 Horizontally Visible Segments(线段树成段覆盖问题+简单hash),好题,覆盖问题想法较难
查看>>
hdu 3308 LCIS(线段树单点更新+区间合并)中等难度的题目
查看>>
poj 3042 Grazing on the Run(区间DP,三维DP)
查看>>
poj 1991 Turning in Homework(区间DP,大区间推出小区间的思想)好题,想法很独特
查看>>
codeforces 395 B1. iwiwi(待续)
查看>>
hdu 4283 You Are the One(区间DP)题目转换难,状态难,。。。
查看>>
poj 2299 Ultra-QuickSort(树状数组+离散化的题目)据说是简单题,不过还是觉得好难。。。
查看>>
poj 2352 Stars(简单树状数组)此题也可以用线段树来做
查看>>
树状数组详细解释
查看>>
hdu 1596 find the safest road(最短路求最大值的题目,有两种稍微不同的处理方式)
查看>>
poj 1195 Mobile phones(二维的树状数组)得好好看。。。
查看>>
poj 2481 Cows(树状数组)题目有陷阱,转换后与stars类似
查看>>
poj 3067 Japan(树状数组,注意题目向树状数组的转换)
查看>>
A. On Segment's Own Points
查看>>
codeforces 397B. On Corruption and Numbers
查看>>
问题 E : 坤哥的难题 (题目本来觉得很难,但是数据很水,居然简单的for就AC)
查看>>