嵌入式linux网络线程之——5年程序员给你讲解TCPIP七层

<code>本文主要给大家分享网络七层概念之传输层,前边的章节已经给大家讲述了链路层、物理层、网络层、应用层等,欢迎学习嵌入式网络编程的朋友关注、转载和发表评论!
(绝对的好文,建议先收藏和转载!)/<code> 

本文主要讲述如下内容:

1 传输层概述

1.1传输层的地位

1.2传输层功能

1.3支持可靠通信

2端口号

2.1概念

2.2端口的作用

2.3 TCP 与 UDP 对于端口号的使用规定

2.4端口的分类

2.5主机的连接的查看 netstat

3 TCP

3.1 TCP 所支持的服务类型

3.2 TCP 报头格式

3.3 TCP 连接的建立与终止(三次握手)

3.4 TCP 窗口确认

3.5 TCP 重传

4 UDP

4.1 UDP 协议特性

4.2 UDP 数据报组成

4.3 UDP 应用

4.4 UDP 数据重组

4.5 UDP 在 C/S 模式的应用


6.1传输层 概述

传输层(Transport Layer)是 OSI 中最重要, 最关键的一层,是唯一负责总体的数据传输和数据控制的一层.传输层提供端到端的交换数据的机制.传输层对会话层等高三层提供可靠的传输服务,对网络层提供可靠的目的地站点信息。

传输层也称为运输层.传输层只存在于端开放系统中,是介于低3 层通信子网系统和高3 层之间的一层,但是很重要的一层.因为它是源端到目的端对数据传送进行控制从低到高的最后一层。


6.1.1 传输层的地位

传输层是整个协议层次结构的核心,是惟一负责总体数据传输和控制的一层。 在 OSI 七层模型中传输层是负责数据通信的最高层,又是面向网络通信的低三层和面向信息处理的高三层之间的中间层。 因为网络层不一定保证服务的可靠,而用户也不能直接对通信子网加以控制,因此在网络层之上,加一层即传输层以改善传输质量。

传输层利用网络层提供的服务,并通过传输层地址提供给高层用户传输数据的通信端口,使系统间 高层资源的共享不必考虑数据通信方面和不可靠的数据传输方面的问题。它的主要功能是:对一个进行 的对话或连接提供可靠的传输服务,在通向网络的单一物理连接上实现该连接的复用,在单一连接上提 供端到端的序号与流量控制、差错控制及恢复等服务。

嵌入式linux网络线程之——5年程序员给你讲解TCPIP七层

图 6-1 OSI 与 TCP/IP 比较


6.1.2 传输层功能

传输层在终端用户之间提供透明的数据传输,向上层提供可靠的数据传输服务。传输层在给定的链 路上通过流量控、分段/重组和差错控制。一些协议是面向链接的。这就意味着传输层能保持对分段的跟踪,并且重传那些失败的分段。

(1) 分割与重组数据

(2) 按端口号寻址

(3) 连接管理

(4) 差错控制和流量控制

(5)开始一个会话


传输层要向会话层提供通信服务的可靠性,避免报文的出错、丢失、延迟时间紊乱、重复、乱序等差错。

(1)跟踪各个会话

每台主机上都可以有多个应用程序同时在网络上通信。这些应用程序将与远程主机上的一个或多个 应用程序相互通信。传输层负责管理这些应用程序间的多道通信流。

如下图所示,假设某台连入网络的计算机正在收发电子邮件、使用即时消息、浏览网站和进行 VoIP 电话呼叫,那么这些应用程序将同时通过网络发送和接收数据。但是,电话呼叫的数据不会传送到 Web 浏览器上;同样,即时消息的内容也不会显示在电子邮件中。


嵌入式linux网络线程之——5年程序员给你讲解TCPIP七层

图 6-2 传输层确保设备上的应用程序能够通信


嵌入式linux网络线程之——5年程序员给你讲解TCPIP七层

图 6-3 跟踪会话

(2)分段数据

应用程序向传输层传递大量数据。传输层必须将数据拆分成小的片段,更适合传送。这些小的片段 被称为分段。

这一过程包括必须在传输层上为每段应用程序添加报头,以显示关联与该段数据相关的通信。

如下图所示的数据分段,与传输层的协议相关,在计算机上同时运行多个程序时提供数据发送与接 收。没有分段,只有一个应用程序,例如视频流,才能接收数据。在观看视频时,你将不能接收电子邮 件,用即时消息软件聊天或浏览网页。


嵌入式linux网络线程之——5年程序员给你讲解TCPIP七层

图 6-4 分段

(3)重组数据段

由于网络能提供不同的传输路径,数据可能以错误的顺序到达。通过编号与排序分段,传输层能保 证这些分段能以正确的顺序重组。

在接收主机,数据的每个分段必须按正确的顺序重组,然后传给适当的应用程序。

传输层的协议描述了传输层的头信息如何用于重组数据片段成为正确的数据流传给应用程序。

(4)标识应用程序

为了将数据流传送到适当的应用程序,传输层必须要标志目的应用程序。因此,传输层将向应用程 序分配标识符。TCP/IP 协议族称这种标识符为端口号。在每台主机中,每个需要访问网络的软件进程都将被分配一个唯一的端口号。该端口号将用于传输层报头中,以指示与数据片段关联的应用程序。

在传输层中,源应用程序和目的应用程序之间传输的特定数据片段集合称为会话。将数据分割成若 干小块,然后将这些小的数据段从源设备发往目的设备,那么网络中可以同时交叉收发(多路传输)很 多不同的通信信息。

传输层负责网络传输,是应用层和网络层之间的桥梁。它从不同的会话接收信息后,将数据划分成 最终能在介质上多路传输的一些便于管理的数据片段,然后再向下层传送数据。

应用程序不需要了解所用网络的详细运作信息,它们只需生成从一个应用程序发送到另一个应用程 序的数据,而不必理会目的主机类型、数据必须要流经的介质类型、数据传输的路径以及链路上的拥塞 情况或网络的规模。

同时,OSI 模型的下层也不需要知道有多少应用程序在通过网络发送数据。它们只需负责将数据传送到适当的设备。然后,传输层将对这些数据段排序,并将其传送到相应的应用程序。

(5)流量控制

网络主机只有有限的资源,如内存或带宽。当传输层得知这些资源已经过载,一些协议能够要求发 送程序减小数据流的流量。这些传输层是通过减少数据源的传送数据组的大小实现的。流量控制能防止 在网络上丢失分段并且避免重传。

(6)错误恢复

出于多种原因,数据片段在通过网络传输时可能被破坏,从而丢失。传输层通过重传任何丢失的数 据确保所有的片段都能到达目的地。

(7)开始会话

传输层通过在应用程序间建立一个会话提供面向连接的定位服务。这些连接在传送任何数据之前准 备好应用程序间的通信。在这些会话中,在两个应用程序通信的数据可以被严格地管理。

(8)数据要求各不相同

由于不同的应用程序有不同的要求,所以传输层协议也有很多种。

例如,只有接收和显示完整的电子邮件或 Web 网页,用户才能使用其中的信息。因此,为确保接收和显示的信息的完整性而导致的轻微延迟是可以接受的。

相比之下,在电话交谈的过程中偶尔丢失小部分内容是可以接受的。通话人可以从交谈过程推断出丢失的语音内容,否则可以直接请对方复述刚才的话。显然,这种方式要比请求网络来管理并重发丢失的数据段更好,因为可以减少延迟。在此例中,由用户而不是网络来管理丢失信息的重发或替换工作。

在当今的融合的网络中,声音、视频、数据都在相同的网络上通信,不同传输层协议所包含的规则 各不相同,因此设备可以处理各种各样的数据要求。

有些协议,例如 UDP(用户数据报协议),只提供在相应的应用程序之间高效传送数据片段所需的一些基本功能。这类协议适用于那些对数据延迟极敏感的应用程序。

其他传输层协议,例如 TCP(传输控制协议)描述的进程提供了一些附加功能确保应用程序之间可靠传输。虽然这些附加功能可以在传输层上提供更为健全的应用程序间数据通信,但同时也产生了额外 的开销并增加了对网络的要求。

为了识别每段数据,传输层向每个数据段添加包含二进制数据的报头。报头含有一些比特字段。不 同的传输层协议通过这些字段值执行各自的功能。


6.1.3 支持可靠通信

通过前面的学习,我们了解到传输层的主要功能就是管理主机会话过程中的应用程序数据。但由于 不同的应用程序对数据有不同的要求,因此需要开发不同的传输层协议来满足这些要求。

在网络术语中,可靠性指从源设备发送的每段数据都能够到达目的设备。在传输层中,有三项基本 的可靠性操作:

· 跟踪已发送的数据;

· 确认已接收的数据;

· 重新传输未确认的数据

这就要求源主机的传输层进程持续跟踪每个会话过程中的所有数据片段,并重新传输未被目的主机 确认的数据。为了支持这种可靠性操作,需要在收发主机之间交换更多的控制数据。控制数据位于传输 层(第 4 层)的报头中。

这样,可靠性和网络负载之间就达成了平衡。应用程序开发人员必须根据他们应用程序的需求,选择适合的传输层协议类型,如下图所示。在传输层中,既有规定可靠保证传输的协议,也有规定尽力传输的协议。在网络环境中,尽力传输被称为不可靠传输,因为它缺乏目的设备对所收到数据的确认机制。


嵌入式linux网络线程之——5年程序员给你讲解TCPIP七层

图 6-5 传输层协议

像数据库、Web 网页及电子邮件等应用程序都要求发送的数据以原始状态到达目的设备,这样才能够为目的程序所使用。任何数据的丢失都可能导致通信失败,要么不能完成通信,要么通信的信息不可 读。因此,这些应用程序都设计成使用能满足可靠性要求的传输层协议,同时也会考虑这些程序所需的

额外网络开销。

其他应用程序允许丢失少量的数据。例如,如果视频数据流中的一段或者两段数据未到达目的地, 就只会造成数据流的短暂中断。这可能表现为图像失真,用户也许不会察觉。

对于这种应用程序而言,增加开销一方面确保了应用程序的可靠性,但另一方面却降低了应用程序 的实用性。如果视频流目的设备必须获得完整的数据,则等待丢失数据所导致的延迟将使图像质量严重 下降。最好采用当时收到的数据段来尽可能提供好的图像质量,而忽略可靠性。如果出于某种原因而需 要确保可靠性时,可以通过应用程序自身来提供检查错误和请求重新发送机制。


6.2 端口号

6.2.1 概念

在网络技术中,端口(Port)大致有两种意思:一是物理意义上的端口,比如,ADSL Modem、集线器、交换机、路由器用 于连接其他网络设备的接口,如 RJ-45 端口、SC 端口等等。二是逻辑意义上的端口,一般是指 TCP/IP 协议中的端口,端口号的范围从 0 到 65535,比如用于浏览网页服务的 80 端口, 用于 FTP 服务的 21 端口等等。我们这里将要介绍的就是逻辑意义上的端口。


6.2.2 端口的作用

一台拥有 IP 地址的主机可以提供许多服务,比如 Web 服务、FTP 服务、SMTP 服务等,这些服务完全可以通过 1 个 IP 地址来实现。那么,主机是怎样区分不同的网络服务呢?显然不能只靠 IP 地址,因为 IP 地址与网络服务的关系是一对多的关系。实际上是通过"IP 地址+端口号"来区 分不同的服务的。

服务器一般都是通过知名端口号来识别的。例如,对于每个 TCP/IP 实现来说,FTP 服务器的 TCP 端口号都是 21,每个 Telnet 服务器的 TCP 端口号都是 23,每个 TFTP(简单文件传送协议)服务器的 UDP 端口号都是 69。任何 TCP/IP 实现所提供的服务都用知名的 1~1023 之间的端口号。这些知名端口号由Internet 号分配机构(Internet Assigned Numbers Authority, IANA)来管理。


6.2.3 TCP 与 UDP 对于端口号的使用规定

TCP 与 UDP 段结构中端口地址都是 16 比特,可以有在 0---65535 范围内的端口号。对于这 65536 个端口号有以下的使用规定:

(1)端口号小于 256 的定义为常用端口,服务器一般都是通过常用端口号来识别的。任何 TCP/IP实现所提供的服务都用 1---1023 之间的端口号,是由 IANA 来管理的;

(2)客户端只需保证该端口号在本机上是惟一的就可以了。客户端口号因存在时间很短暂又称临时端口号;

(3)大多数 TCP/IP 实现给临时端口号分配 1024---5000 之间的端口号。大于 5000 的端口号是为其他服务器预留的。


端口的分类

公认端口(Well-Known Ports)

逻辑意义上的端口有多种分类标准,下面将介绍常见的按端口号分布的分类:

知名端口即众所周知的端口号,范围从 0 到 1023,这些端口号一般固定分配给一些服务。比如 21 端口分配给 FTP(文件传输协议)服务,25 端口分配给 SMTP(简单邮件传输协议)服务,80 端口分配给

HTTP 服务,135 端口分配给 RPC(远程过程调用)服务等等。

网络服务是可以使用其他端口号的,如果不是默认的端口号则应该在 地址栏上指定端口号,方法是在地址后面加上冒号":"(半角),再加上端口 号。比如使用"8080"作为 WWW 服务的端口,则需要在地址栏里输入"[1]"。

但是有些系统协议使用固定的端口号,它是不能被改变的,比如 139 端口专门用于 NetBIOS 与

TCP/IP 之间的通信,不能手动改变。


嵌入式linux网络线程之——5年程序员给你讲解TCPIP七层

图 6-6 公认端口

注册端口

已注册端口(端口 1024 到 49151)分配给用户进程或应用程序。这些进程主要是用户选择安装的

一些应用程序,而不是已经分配了公认端口的常用应用程序。这些端口在没有被服务器资源占用时,可 由客户端动态选用为源端口。下表列出了 TCP 和 UDP 使用的注册端口号。

嵌入式linux网络线程之——5年程序员给你讲解TCPIP七层

图 6-7 注册端口

动态或私有端口

动态或私有端口(端口 49152 到 65535),也称为临时端口。这些端口往往在开始连接时被动态分

配给客户端应用程序。客户端一般很少使用动态或私有端口连接服务(只有一些点对点文件共享程序使 用)。


一些应用层协议,往往同时使用 TCP 和 UDP


嵌入式linux网络线程之——5年程序员给你讲解TCPIP七层

图 6-8 动态或私有端口


主机的连接的查看 netstat

有些时候,需要了解联网主机中开放并运行了哪些活动的 TCP 连接。Netstat 是一种重要的网络实用程序,可用来检验此类连接。Netstat 可列出正在使用的协议、本地地址和端口号、外部地址和端口号以及连接的状态。

不明的 TCP 连接可能表示某程序或某人正连接到本地主机,这可能是一个重大的安全威胁。此外, 不必要的 TCP 连接会消耗宝贵的系统资源,降低主机性能。当性能出现下降时,就应该使用 netstat 命令检查主机上开放的连接。

Netstat 命令有许多有用的选项。下图显示了 linux 系统 netstat 的输出。


嵌入式linux网络线程之——5年程序员给你讲解TCPIP七层

图 6-9 Netstat –ant

Netstat 命令详细见第 8 章。


6.3 TCP

TCP:Transmission Control Protocol 传输控制协议 TCP 是一种面向连接(连接导向)的、可靠的、基于字节流的运输层(Transport layer)通信协议,由 IETF 的 RFC 793 说明(specified)。在简化的计算机网络 OSI 模型中,它完成第四层传输层所指定的功能。

6.3.1 TCP 所支持的服务类型

TCP/IP 是一个协议集。为应用提供一些"低级"功能,这些包括 IP、TCP、UDP。其它是执行特定任

务的应用协议,如计算机间传送文件、发送电子邮件、或找出谁注册到另外一台计算机。

TCP/IP 服务有:

FTP 文件传送(File Transfer)

文件传送协议 FTP(File TransferProtocol)允许用户从一台计算机到另一台取得文件, 或发送文件到另外一台计算机。从安全性方面考虑, 需要用户指定一个使用其它计算机的用户名和口令。它不同于 NFS(Network File System)和 Netbios 协议。一旦你要访问另一台系统中的文件, 任何时刻都要运行 FTP。而且你只能拷贝文件到自己的机器中去来使用它。RFC 959 中有关于 FTP 的详尽说明。


RLogin 远程登录(Remote login)

网络终端协议 TELNET 允许用户登录到网络上任一计算机上。你可启动一个远程进程连接到指定的计算机, 直到进程结束, 期间你所键入的内容被送到所指定的计算机。值得注意的是, 这时你实际上是与你的计算机进行对话。TELENET 程序使得你的计算机在整个过程中不见了,所敲的每一个字符直接送到所登录的计算机系统。一般的说, 这种远程连接是通过类式拨号连接的,也就是,拨通后,远程系统提示你输入注册名和口令,退出远程系统,TELNET 程序也就退出,你又与自己的计算机对话了。微电脑中的 TELNET 工具一般含有一个终端仿真程序


SMTP POP3 电子邮件(Mail)

允许你发送消息给其它计算机的用户。通常,人们趋向于使用指定的一台或两台计算机。计算机邮件系统只需你简单地往另一用户的邮件文件中添加信息,但随之产生问题,使用的微电脑的环境不同,还有重要的是宏(MACRO)不适合于接受计算机邮件。为了发送电子邮件,邮件软件希望连接到目的计算机,如果是微电脑,也许它已关机,或者正在运行另一个应用程序呢?出于这种原因,通常由一个较大的系统来处理这些邮件, 也就是一个一直运行着的邮件服务器。邮件软件成为用户从邮件服务器取回邮件的一个界面。

任何一个的 TCP/IP 工具提供上述这些服务。这些传统的应用功能在基于 TCP/IP 的网络中一直扮演非常重要的角色。目前情况有点变化, 这些功能使用也发生变化, 如老系统的改造, 计算机的发展等, 出现了各种安装版本, 如: 微电脑、工作站、小型机、和巨型机等。这些计算机好像在一起完成指定的任务, 尽管有时看来像是只用到某个指定的计算机, 但它是通过网络得到其它计算机系统的服务。服务器 Server 是为网络上其它提供指定服务的系统,客户 Client 是得到这种服务的另外计算机系统。(值得注意的是, 服务/客户机不一定是不同的计算机, 有可能是同一计算机中的不同运行程序)。以下是几种目前计算机上典型的一些服务,这些服务可在 TCP/IP 网络上调用。


NFS 网络文件系统(Network File System)

这种访问另一计算机的文件的方法非常接近于流行的 FTP。网络文件系统提供磁盘或设备服务, 而无需特定的网络实用程序来访问另一系统的文件。可以简单地认为它是一个外加的磁盘驱动器。这种额外"虚拟"磁盘驱动器就是其它计算机系统的磁盘。这非常有用。你只需加大几台计算机的磁盘容量, 就可使网络上其他用户访问它, 且不说所带来的经济效益, 它还能够让几台工作的计算机共享相同的文件。它也使得系统维护和备份易如反掌, 因为再不必为大量的不同机器上的文件的升级和备份而担。


远程打印(Remote Printing)

允许你使用其它计算机上的打印机, 好像这些打印机直接连到你的计算机上。远程执行(Remote Execution)允许你请求运行在不同计算机上的特殊程序。当你在一个很小的计算机上运行一个需要大机系统资源的程序时,这时候远程执行非常有用。


TCP 报头格式


嵌入式linux网络线程之——5年程序员给你讲解TCPIP七层

图 6-10 tcp 报文头

TCP 的头部各字段含义

源端口和目的端口: 字段长度均为 16 位,它们标识了源和目的应用程序。我们通常所说的端口 号是指目的端口来说的,而源端口一般来说是个随机的值。

序列号: 字段长度为 32 位,序列号用来确定发送方发送的数据流中被封装的数据所在的位置。 打个比方:如果当前这段数据的序列号为 1000,且数据段长 100 个字节,那么下一段数据段的序列号就应该为 1000+100+1=1101。

确认号: 字段长度为 32 位,确认号确定了源点下一次希望从目标接受的序列号。报头长度: 长度为 4 位,报头长度和 ip 的首部长度相类似, 同样是包含 4 字节的位数, 这里不 做描述。

保留:4 位,保留的东西

标记:8 位,后 6 位分别是 URG(紧急指针)、ACK(确认序号有效)、PSH(接收方应 该尽快将这个报文段交给应用层)、RST(重建连接)、SYN( 同步序号用来发起一个连接)、

FIN(发送端完成发送任务)。

窗口大小:窗口大小为 16 位,这个值是接收端正期望接受的字节。因为窗口大小是一个 16bit 字段,因而窗口大小最大为 65535 字节。

校验和:16 位,覆盖了 TCP 的报头和数据部分。紧急指针:这个字段只有当 URG 标记置位时才被使用。

可选项:此字段指明 TCP 的发送进程要求的选项。常用的可选项是最大段长度,用来指明本端 所能接收的最大长度的报文段。


TCP 连接的建立与终止(三次握手)

当两台主机采用 TCP 进行通信时,在交换数据前将建立连接。通信完成后,将关闭会话并终止连接。连接和会话机制保障了 TCP 的可靠性功能。


三次握手

主机将跟踪会话过程中的每个数据段,并使用 TCP 报头中的信息了解每台主机所接收到的数据。

每个连接都代表两股单向通信数据流或者会话。若要建立连接,主机应执行"三次握手"。TCP 报头中的控制位指出了连接的进度和状态。


在 TCP 连接中,充当客户端的主机将向服务器发起该会话。TCP 连接创建的过程分为以下三个步骤。

1.客户端向服务器发送包含初始序列值的数据段, 开启通信会话。

2. 服务器发送包含确认值的数据段, 其值等于收到的序列值加 1, 并加上其自身的同步序列值。该值比序列号大 1,因为 ACK 总是下一个预期字节或二进制八位数。通过此确认值,客户端可以将响应和上一次发送到服务器的数据段连接起来。

3. 发送带确认值的客户端响应, 其值等于接受的序列值加 1。这便完成了整个建立连接的过程。

下图显示了建立一个 TCP 连接的步骤。

嵌入式linux网络线程之——5年程序员给你讲解TCPIP七层

图 6-11 TCP 连接的建立:SYN ACK

为了理解"三次握手"的过程,必须考察两台主机间交换的不同值。在 TCP 数据段报头中,有

6 个包含控制信息的 1 比特字段,用于管理 TCP 进程。这些字段分别是:

URG-紧急指针;

ACK-确认字段;

PSH-推送功能;

RST-重置连接;

SYN-同步序列号;

FIN-发送方已传输完所有数据

这些字段用作标志,由于它们都只有 1 比特大小,所以它们都只有两个值:1 或者 0。当值设为 1 时,表示数据段中包含控制信息。


下一部分描述"三次握手"每一步的细节

一、 步骤 1: SYN

TCP 客户端发送带 SYN(同步序列号)控制标志设置的数据段, 指示包含在报头中的序列号字段的初始值, 用以开启"三次握手"。序列号的初始值称为初始序列号( ISN), 由系统随机选取, 并用于跟踪会话过程中从客户端到服务器的数据流。在会话过程中, 每从客户端向服务器发送一个字节的数据,数据段报头中包含的 ISN 值就要加 1。SYN 控制标志被置位并且相应的序列号设定为 0。


二、步骤 2:SYN 和 ACK

TCP 服务器需要确认从客户端处收到 SYN 数据段,从而建立从客户端到服务器的会话。为了达到此目的, 服务器应向客户端发送带 ACK 标志设置的数据段, 表明确认编号有效。客户端将这种带确认标志设置的数据段理解为确认信息,即服务器已收到从 TCP 客户端发出的 SYN 信息。

确认编号字段的值等于客户端初始序列号加 1。此时创建从客户端到服务器的会话。ACK 标志将在会话期间保持平衡设置。客户端和服务器之间的会话实际上是由两个单向的会话组成的: 一个是从客户端到服务器的会话, 另一个则正好相反。在"三次握手"过程的第二步中, 服务器必须发起从服务器到客户端的响应。为开启会话, 服务器应采用与客户端同样的方法使用 SYN 标志。该操作设置报头中的 SYN 控制标志,从而建立从服务器到客户端的会话。SYN 标志表明序列号字段的初始值已包含在报头中, 且该值将用于跟踪会话过程中从服务器返回客户端的数据流。


三、步骤 3:ACK

最后,TCP 客户端发送包含 ACK 信息的数据段,以示对服务器发送的 TCP SYN 信息的响应。在该数据段中,不包括用户数据。确认号字段的值比从服务器接收的初始序列号值大 1。一旦在客户端和服务器之间建立了双向会话,该通信过程中交换的所有数据段都将包含 ACK 标志设置。

通过以下方式,你可以加强数据网络的安全性:

拒绝建立 TCP 会话;

只允许建立特定服务的会话;

只允许已建立会话之间的通信。

你可以将安全策略应用于所有 TCP 会话,也可以仅应用于某些选定的会话。


TCP 会话终止

若要关闭连接,应设置数据段报头中的 FIN(结束)控制标志。为终止每个单向 TCP 会话,

需采用包含 FIN 数据段和 ACK 数据段的二次握手。因此, 若要终止 TCP 支持的整个会话过程, 需要实施 4 次交换, 以终止两个双向会话:

1.当客户端的数据流中没有其他要发送的数据时, 它将发送带 FIN 标志设置的数据段;

2.服务器发送 ACK 信息,确认收到从客户端发出的请求终止会话的 FIN 信息;

3.服务器向客户端发送 FIN 信息,终止从服务器到客户端的会话

4.客户端发送 ACK 响应信息,确认收到从服务器发出的 FIN 信息。

如下图显示了终止一个 TCP 连接所使用的步骤。

嵌入式linux网络线程之——5年程序员给你讲解TCPIP七层

图 6-12 TCP 会话终止:FIN ACK

注 意 :

在本部分中,为了更容易理解,采用了客户端和服务器端进行说明。实际上,终止的过程可以在任意两台完成会话的主机之间展开。

当会话中的客户端没有其他要传输的数据时, 它将在数据段报头中设置 FIN 标志。然后,会话中的服务器端将发送包含 ACK 标志设置的一般数据段信息, 通过确认号确认已经收到所有数据。当所有数据段得到确认后,会话关闭。

另一方向的会话采用相同的方式关闭。接收方在数据段的报头中设置 FIN 标志,然后发送到发送方, 表明没有其他需要发送的数据。返回的确认信息确定已接收所有数据, 随即该方向的会话关闭。

也可以通过"三次握手"方式关闭连接。当客户端没有其他要传输的数据时,它将向服务器发送 FIN 信息。如果服务器也没有其他要传输的数据, 它将发送同时包含 FIN 和 ACK 标志设置的响应信息,将两步并作一步。最后, 客户端返回 ACK 信息。


TCP 窗口确认

TCP 的一项功能是确保每个数据段都能到达目的地。位于目的主机的 TCP 服务对接收到的数据进行确认,并向源应用程序发送确认信息。

使用数据段报头序列号以及确认号来确认已收到包含在数据段中的相关的数据字节。这个序列号表明在这个会话中被传送的已经接收到的字节数和当前分段中包含的字节。TCP 在发回源设备的数据段中使用确认号,指示接收设备期待接收的下一字节。该过程称为期待确认。

收到确认信息后,源设备即得知目的设备已收到数据流中确认号之前的所有字节,但不包括确认号所指示的字节。随后,源主机将继续发送数据段,且数据段的序列号应等于该确认号。

请记住,每个连接都实际包含两个单向会话,且两个方向上都在进行序列号和确认号的交换。在下图中, 左侧主机正在向右侧主机发送数据。它发送的数据段包含 10 字节的会话数据,数据段报头中的序列号等于 1。


嵌入式linux网络线程之——5年程序员给你讲解TCPIP七层

图 6-13 TCP 数据段的确认

主机 B 在网络层接收数据段,并确认其序列号为 1,且数据字节数为 10。主机 B 随即向主机A 发送数据段, 确认收到数据。在确认数据段中, 该主机将确认号设为 11, 表明它期望下一接收数据的字节数为 11。

当主机 A 接收到该确认信息时, 它可以立即发送字节编号为 11 的下一会话数据段。

在本例中,如果主机 A 需要等待每个 10 字节数据段的确认信息,网络将负担很多额外开销。为减少这些确认信息的开销, 可以预先发送多个数据段, 并在相反方向上采用单一 TCP 消息进行确认。这种确认消息中包含基于所接收的所有会话字节的确认号。

例如当序列号从 2000 起算时,如果已接收到 10 个 1000 字节的数据段,则可以向源设备发送一条编号为 12001 的确认消息。

源主机在收到确认消息之前可以传输的数据大小称为窗口大小。窗口大小是 TCP 报头中的一个字段, 用于管理丢失数据和流量控制。


TCP 重传

无论网络设计得如何完美,都可能发生数据丢失现象。因此,TCP 提供了管理数据段丢失的方法,其中一个方法就是重新发送未确认的数据。

使用 TCP 的目的主机服务通常只确认相邻序列的数据。如果一个或多个数据段丢失,只确认已完成数据流中的数据段。

例如,如果接收到序列号为 1500 到 3000 以及 3400 到 3500 的数据段,那么确认号应为 3001。

这是因为未收到序列号为 3001 到 3399 之间的数据段。

如果源主机上的 TCP 未在规定时间内收到确认消息,它将根据收到的最后一个确认号重新发送数据。

RFC793 中未对重新发送过程进行说明,这属于 TCP 的特殊实施过程。

TCP 的标准实施流程是:主机传输数据段,并将数据段的副本列入重新发送队列,然后启动计时器。当接收到数据确认信息时, 主机将从队列中删除对应数据段; 如果到计时器超时还没有收到确认信息,将重新传输数据段。

现在,主机还拥有一项备选功能:选择性确认。如果两台主机都支持选择性确认功能,目的主机便可以确认间断数据段中的数据,那么源主机就只需要重新传输丢失的数据。


UDP

UDP 是 OSI 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。

UDP 协议基本上是 IP 协议与上层协议的接口。UDP 协议适用端口分别运行在同一台设备上的多个应用程序。

UDP 是一种简单协议, 提供了基本的传输层功能。与 TCP 相比, UDP 的开销极低, 因为 UDP 是无连接的,并且不提供复杂的重新传输、排序和流量控制机制。


UDP 协议特性

(1)UDP 是一个无连接协议,传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。在发送端,UDP 传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收端,UDP 把每个消息段放在队列中,应用程序每次从队列中读一个消息段。

(2) 由于传输数据不建立连接, 因此也就不需要维护连接状态, 包括收发状态等, 因此一台服务机可同时向多个客户机传输相同的消息。

(3)UDP 信息包的标题很短,只有 8 个字节, 相对于 TCP 的 20 个字节信息包的额外开销很小。

(4) 吞吐量不受拥挤控制算法的调节, 只受应用软件生成数据的速率、传输带宽、源端和终端主机性能的限制。

(5)UDP 使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的链接状态表(这里面有许多参数)。

(6)UDP 是面向报文的。发送方的 UDP 对应用程序交下来的报文,在添加首部后就向下交付给 IP 层。既不拆分,也不合并,而是保留这些报文的边界,因此,应用程序需要选择合适的报文大小。


虽然 UDP 是一个不可靠的协议,但它是分发信息的一个理想协议。例如,在屏幕上报告股票市场、在屏幕上显示航空信息等等。UDP 也用在路由信息协议 RIP ( Routing Information Protocol) 中修改路由表。在这些应用场合下, 如果有一个消息丢失, 在几秒之后另一个新的消息就会替换它。UDP 广泛用在多媒体应用中, 例如, Progressive Networks 公司开发的RealAudio 软件,它是在因特网上把预先录制的或者现场音乐实时传送给客户机的一种软件,该软件使用的 RealAudio audio-on-demand protocol 协议就是运行在 UDP 之上的协议,大多数因特网电话软件产品也都运行在 UDP 之上。


UDP 数据报组成

嵌入式linux网络线程之——5年程序员给你讲解TCPIP七层

图 6-14 UDP 数据报

源端口字段: 发送进程的端口号。

目的端口字段:接收进程的端口号。

长度字段: UDP 数据报的总长度(字节),最小值为 8(报头的长度)。

校验和字段: 简单的差错检测。如果有差错,通常是将 UDP 数据报丢弃。


UDP 应用

既然 UDP 是一种不可靠的网络协议,那么还有什么使用价值或必要呢? 其实不然,在有些情况下 UDP 协议可能会变得非常有用。因为 UDP 具有 TCP 所望尘莫及的速度优势。虽然 TCP 协议中植入了各种安全保障功能, 但是在实际执行的过程中会占用大量的系统开销, 无疑使速度受到严重的影响。反观 UDP 由于排除了信息可靠传递机制, 将安全和排序等功能移交给上层应用来完成, 极大降低了执行时间,使速度得到了保证。

关于 UDP 协议的最早规范是 RFC768,1980 年发布。尽管时间已经很长,但是 UDP 协议仍然继续在主流应用中发挥着作用。包括视频电话会议系统在内的许多应用都证明了 UDP 协议的存在价值。因为相对于可靠性来说, 这些应用更加注重实际性能, 所以为了获得更好的使用效果

(例如,更高的画面帧刷新速率) 往往可以牺牲一定的可靠性(例如,画面质量)。这就是 UDP 和 TCP 两种协议的权衡之处。根据不同的环境和特点, 两种传输协议都将在今后的网络世界中发挥更加重要的作用。


UDP 的几个应用

域名系统 (DNS)

简单网络管理协议 (SNMP)

动态主机配置协议 (DHCP)

路由信息协议 (RIP)

简单文件传输协议 (TFTP)

网络游戏


UDP 数据重组

与 TCP 的通信机制不同,由于 UDP 是无连接协议,因此通信发生之前不会建立会话。UDP 是基于事务的,换言之, 应用程序要发送数据时,它仅是发送数据而已。

很多使用 UDP 的应用程序发送的数据量很小,用一个数据段就够了。但是也有一些应用程序需要发送大量数据,因此需要用多个数据段。UDP PDU 的实际意义是数据报,尽管数据段和数据报可以互换使用来描述某个传输层 PDU。

将多个数据报发送到目的主机时,它们可能使用了不同的路径,到达顺序也可能跟发送时的顺序不同。与 TCP 不同,UDP 不跟踪序列号。UDP 不会对数据报重组,因此也不会将数据恢复到传输时的顺序。

因此,UDP 仅仅是将接收到的数据按照先来后到的顺序转发到应用程序。如果数据的顺序对应用程序很重要,那么应用程序只能自己标志数据的正确顺序, 并决定如何处理这些数据。


嵌入式linux网络线程之——5年程序员给你讲解TCPIP七层

图 6-15 UDP 数据重组


6.4.5 UDP 在 C/S 模式的应用

与基于TCP 的应用程序相同的是,基于UDP 的服务器应用程序也被分配了公认端口或已注册的端口。

当上述应用程序或进程运行时,它们就会接受与所分配端口相匹配的数据。当 UDP 收到用于某个端口的数据报时,它就会按照应用程序的端口号将数据发送到相应的应用程序。

对于 TCP 而言,客户端/服务器模式的通信初始化采用由客户端应用程序向服务器进程请求数据的形式。而 UDP 客户端进程则是从动态可用端口中随机挑选一个端口号,用来作为会话的源端口。而目的端口通常都是分配到服务器进程的公认端口或已注册的端口。

采用随机的源端口号的另一个优点是提高安全性。如果目的端口的选择方式容易预测,那么网络入 侵者很容易就可以通过尝试最可能开放的端口号访问客户端。

由于 UDP 不建立会话,因此一旦数据和端口号准备就绪,UDP 就可以生成数据报并递交给网络层, 并在网络上寻址和发送。

需要谨记的是,客户端选定了源端口和目的端口后,通信事务中的所有数据报文头都采用相同的端 口对。对于从服务器到达客户端的数据来说,数据报头所含的源端口和目的端口作了互换。


嵌入式linux网络线程之——5年程序员给你讲解TCPIP七层

图 6-16 发送 UDP 请求的客户端


分享到:


相關文章: