6.5 TCP层
传输层位于通信子网与资源子网之间,对下面隔离通信子网的实现细节,对
上面提供源主机与目的主机间的端对端通信连接服务。即从传输层开始,将进
入主机级通信,而传输层的下面是网络级通信。
在TCP/IP的传输层中,有两个并行的独立协议:传输控制协议TCP和用户
数据报协议UDP。
6.5.1 TCP协议
TCP是传输层的一个主要协议,图6.22说明了TCP与IP的关系。图中,两
台主机通过两个网络和一个路由器进行通信。从TCP来看,只是两台主机间的
一种连接,两台主机间的数据传输是通过调用IP来完成的。也就是说,TCP除了
提供多个端口保证多进程通信外,主要提供端到端的面向连接的可靠的流服务。
图6.22 TCP与IP的关系示例
· 0 7 1 · 第2篇 计算机网络体系结构
1.TCP服务特征
从应用程序的角度看,TCP提供的服务有如下特征。
(1)点对点的通信
TCP是在网络层提供的服务基础上,提供一个直接从一台计算机上的应用
到另一台远程计算机上的应用的连接。由于每一个TCP连接有两个端点,所以
是一种端对端的协议。
(2)虚电路连接
TCP提供面向连接的服务,一个应用程序必须首先请求一个到目的地的连
接,然后才能使用该连接传输数据。由于该连接是通过软件实现的,所以是虚连
接(VirtualConnection)。
(3)全双工通信
一个TCP连接允许任何一个应用程序在任何时刻发送数据,使数据在该
TCP的任何一个方向上流动。因此,TCP连接是由两个“半连接”组成的。
(4)面向数据流的服务
当两个应用程序(用户进程)传输大量数据时,是以8位一组的数据流形式
进行的。这种数据流是无结构的,既不提供记录式的表示法,也不确保数据传递
到接收端应用进程时保持与发送端有同样的尺寸。因此,使用数据流的应用程
序必须在开始连接之前就了解数据流的内容并对格式进行协商。
(5)有缓冲的传输
当建立一个TCP连接时,连接的每一端分配一个缓冲区来保存输入的数
据。通常把缓冲区中的空闲部分称为窗口。当交付的数据不够填满一个缓冲区
时,流服务提供“推(Push)”机制,应用程序可以用其进行强迫传送。
(6)完全可靠性
完全可靠性包括:
�可靠连接的建立———当两个应用创建一个新连接时,两端必须遵从该新
连接,旧的连接不影响新的连接;
�可靠数据传输———TCP确保通过一个连接发送的数据会同发送时一样
正确地传送,而不发生数据丢失或乱序;
�从容关闭———确保关闭连接之前传递所有的数据。
2.TCP协议的主要功能
大致地讲,TCP协议通过下面的功能来获得可靠性。
(1)TCP连接的建立/释放与三次握手
所谓三次握手,就是通信双方在建立连接或释放连接时要经过三次交互。
· 1 7 1 · 第6章 Internet与TCP/IP体系结构
TCP采用三次握手来建立连接:
第一次握手———源主机发一个带本次连接序号的请求。
第二次握手———目的主机收到请求后,如同意连接,则发回一个带本次连接
序号和源主机连接序号的确认。
第三次握手———源主机收到含两次初始序号的应答后,再向目的主机发一
个带两次连接序号的确认。
目的主机收到确认,双方建立连接。由于连接是由软件完成的,所以称为虚
连接。图6.23为TCP连接的三次握手示意图。其中,第一、第二次连接后,形成
的是半连接。
图6.23 三次握手连接
同样,在释放连接时,TCP也要采用三次握手方式。
下面通过释放时的情形来说明三次握手的必要性。
正常的释放连接是通过断连请求及断连确认实现的。但是,在某些情况下,
没有经过断连确认,也可以释放连接。断连不当就有可能造成数据丢失。图
6.24所示为一种断连不当引起数据丢失的情形:A方连续发送两个数据后,发送了
断连请求;B方在收到第一个数据后,先发出了断连请求。结果第二个数据丢失。
图6.24 断连不当引起数据丢失
为了防止因断连不当引起的数据丢失,断连应选择在确信对方已经收到自
己发送的数据并且自己和对方不再发送数据时。换句话说,就是要在征得对方
· 2 7 1 · 第2篇 计算机网络体系结构
同意之后,才能执行断连操作。为了进行可靠的连接释放,比较有效的方法是三
次握手(Three-WayHandShake)方法。
由于TCP连接由两个“半连接”组成,在撤销时,一方发起撤销连接但连接
依然存在,所以TCP采用三次握手的方法来撤销这两个“半连接”:
①A方发送断连请求DR(DISCONNECT.request)TPDU(传输协议数据单
元),并启动定时器;
②(DR到达B)B送回断连证实DC(DISCONNECT.confirm)TPDU,并启动定
时器;
③(DC到达A)A再送回一个ACKTPDU,并删除连接;B收到ACK后,删除
连接。
图6.25(a)是三次握手的示意图。其中,A和B都进行了一个操作———启动
定时器。那么,定时器有什么用途呢?它是在不正常情况下才起作用的,请看图
6.25(b)、(c)、(d)。
图6.25 三次握手方法的连接释放
(2)确认和超时重传机制
确认就是目的主机每收到一个正确分组,即向源主机回送一个确认。
· 3 7 1 · 第6章 Internet与TCP/IP体系结构
超时重传的基本思想是,设定一个时间片,如果一个TCP段在规定的时间
片内收不到确认,就重传该分组。
(3)流量与拥塞控制
TCP协议采用滑动窗口进行流量和拥塞控制。TCP的流量控制“窗口”是一
种可变窗口。当接收方用户由于没有及时取走滞留在TCP缓冲区数据时,由于
占用了系统资源,窗口将变小;当接收方用户取走在TCP缓冲区中的数据时,由
于释放了系统资源,窗口将变大。也就是说,TCP允许随时改变窗口大小。这样
不仅可以提供可靠传输,还可以提供很好的流量控制。
与可变窗口相配套的是窗口通告(WindowAdvertisement)。即每个确认中,
除了要指出已经收到的8位组序号外,还包括一个窗口通告,用于说明接收方窗
口(接收缓冲区)还有多大———能接收多少个8位组数据。发送方要以当前记录
的接收方最新窗口大小为依据决定发送多少8位组。
3.TCP报文格式
TCP的报文格式如图6.26所示。
图6.26 TCP的报文格式
下面分别介绍各段的意义。
(1)源端口(SourcePort)
源端口即本地通信端口,支持TCP的多路复用机制。
(2)目的端口(DestinationPort)
目的端口即远地通信端口,支持TCP的多路复用机制。
(3)序号(SequenceNumber)
序号是数据段的第1个数据字节(除含有SYN的段外)。在SYN段中,该域
是SYN的序号,即建立本次连接的初始序号,在该连接上发送的第1个数据字
节的序号为初始序号+1。
(4)数据偏移(DataOffset)
· 4 7 1 · 第2篇 计算机网络体系结构
占4位。指出该段中数据的起始位置,以4字节为单位(TCP头总以32位
边界对齐)。
(5)控制位(ControlBits)
控制位共6位:
URG———紧急指针域有效,即该段中携有紧急数据。
ACK———确认字段有效。
RST———连接复位,要求异常终止通信连接。
SYN———序号同步。
FIN———发送方字节流结束。
PSH———本报文段请求“推(Push)”操作。即认定该段为“推进”段,段中数据
是发送方当时发送缓冲区中的全部数据。对于收到这种数据的接收方来讲,应
当把“推进”段中的数据尽快交给用户,并结束一次用户接收请求。
(6)确认号(AcknowledgmentNumber)
当TCP段头控制位中的ACK置位时,确认号域才有效。它表示本地希望接
收的下一个数据字节的序号。对于收到有效确认号的发送者来说,其值表示接
收者已经正确接收到了该序号以前的数据。
(7)窗口(Window)
表明该段的接收方当前能够接收的从确认号开始的最大数据长度,该值主
要向对方通告本地接收缓冲区的使用情况。
(8)校验和(Checksum)
校验对象包括协议伪头、TCP报头和数据。
(9)选项(Options)
选项位于TCP头的尾端,有单字节和多字节两种格式。单字节格式只有选
项类型;多字节格式由一个字节的选项类型、多字节的实际选项数据和一个字节
的选项长度(三部分的长度)组成。下面说明TCP协议必须实现的选项。
(a)选项表尾选项:KIND=0。表示TCP头中由全部选项组成的选项表结
束。其格式为:
00000000
(b)无操作选项:KIND=1。该选项可能出现在两个选项之间,作为一个选
项分隔符,或提供一种选项字边界对齐的手段,本身无任何意义。其格式为:
00000001
(c)最大段长选项:KIND=2,LENGTH=4。该选项主要用于通知通信连接
的对方本地能够接收的最大段长。它只出现在TCP的初始建链请求中(SYN
· 5 7 1 · 第6章 Internet与TCP/IP体系结构
段)。如果在TCP的SYN段中没有给出该选项,就意味着有能力接收任何长度
的段。其格式为:
0000001000000100 最大段长
(10)填充(Padding)
当TCP头由于含有了选项而无法以32位边界对齐时,将会在TCP头的尾部
出现若干字节的全0填充。
(11)URG位和紧急指针(UrgentPointer)
传输层协议使用带外数据(Out-Of-Band,OOB)机制来传输一些重要数据,
如通信的一方有重要的事情通知对方,需要加速传送这些通知数据。TCP支持
一个字节的带外数据,并提供了一种紧急模式:在数据分组中设置URG=1,表
示进入紧急模式,同时用紧急指针表明从该段序号开始的一个正向位移,指向紧
急数据的最后一个字节。
6.5.2 UDP协议
UDP是一个无连接的协议,在发送时无须建立连接,仅仅向应用程序提供了
图6.27 UDP数据报格式
一种发送封装的原始IP数据报的方法。图
6.27所示为UDP数据报格式。其中,校验和
是可选的,当不进行校验时,这个域为0。
UDP是一个基于不可靠通信子网的不可
靠传输层协议。因此,基于UDP的应用程序
必须自己解决可靠性问题,如报文丢失、报文
重复、报文失序、流量控制等。
应用程序可以使用UDP协议进行通信。不同的进程用不同的端口号进行
标识。端口号分为公认(众所周知)端口号和自由端口号两种。
在UNIX系统中,一个UDP端口是一个可读和可写的软件结构,UDP协议为
每个端口维护一个接收缓冲区。发送数据时,UDP协议将数据内容生成一个
UDP数据报,然后交给网络层的IP协议发送。接收数据时,UDP协议从网络层
IP协议接收到UDP,然后根据目的端口号将其放在相应的接收缓冲区中。如果
没有匹配的端口号,UDP协议将丢弃该数据报,并向发送主机返回一个“不可到
达”的ICMP消息;如果匹配端口号已满,UDP协议也丢弃该数据报,但不回送错
误消息,将来靠超时重发。
UDP的优点在于高效率,通常用于交易型应用,一次交易只有一来一往两次
报文交换。
· 6 7 1 · 第2篇 计算机网络体系结构
6.5.3 TCP/UDP端口号的分配方法
TCP使用协议端口号(通常也简称端口号)来标识一台机器上的多个目的进
程,每个协议端口号都是一个小的整数。协议端口号的分配有两种基本方式。
一种称为统一分配(UniversalAssignment),是静态分配方式,由中央管理机
构分配端口号。这些端口号要求所有的软件在设计时都要遵从。所以这些端口
常被称为众所周知端口分配(Well-knownPortAssignment)。TCP与UDP的标准
端口号是各自独立编号的。这两组标准端口号是所有采用TCP/IP协议的标准
服务器必须遵守的,因而是固定的、全局性的公认端口,即“众所周知的端口”,也
称“保留端口”。表6.5列出了一些当前分配的TCP和UDP端口号。
表6.5 一些当前分配的TCP和UDP端口号
端口号 关键字 UNIX关键字 说明 UDPTCP
7 ECHO echo 回显 Y
13 DAYTIME daytime Y Y
19 CHARACTERGENERATORCharactergenerator Y Y
20 FTPDATA ftpdata 文件传输协议(数据) Y
21 FTPCONTROL ftp 文件传输协议(命令) Y
22 SSH ssh 安全命令解释程序 Y
23 TELNET telnet 远程连接 Y
25 SMTP smtp 简单邮件传输协议 Y
37 TIME time 时间 Y Y
42 NAMESERVER name 主机名服务器 Y Y
43 NICNAME whois 找人 Y Y
53 DOMAIN nameserver DNS(域名服务器) Y Y
69 TFTP tftp 简单文件传输协议 Y
70 GOPHER gopher Gopher Y
79 FINGER finger Finger Y
80 WWW www WWW服务器 Y
101 HOSTNAME hostname NIC主机名服务器 Y
103 X400 x400 X.400邮件服务 Y
104 X400SND x400snd X.400邮件发送 Y
110 POP3 pop3 邮局协议版本3 Y
111 RPC rpc 远程过程调用 Y Y
119 NNTP nntp USENET新闻传输协议 Y Y
123 NTP ntp 网络时间协议 Y Y
161 SNMP snmp 简单网络管理协议 Y
179 BGP 边界网关协议 Y
520 RIP 路由信息协议 Y
· 7 7 1 · 第6章 Internet与TCP/IP体系结构
保留端口之外的其他端口称为自由端口。自由端口号是局部的,由本地主
机随机地分配,用于区别一台主机中的多个进程。当一个进程发生时,本地主机
的操作系统即给该进程分配一个自由端口号以与本主机上的其他进程相区别;
该进程终止,此端口号即被释放,可以再分配给其他进程。而要知道另一台机器
上的端口号,就必须送出一个请求报文询问,目的主机回答后,把正确的端口号
送回来。这种分配方式称为动态绑定(DynamicBinding)。
实际上,TCP/IP采用混合方式进行端口号的管理:分配某些端口号的同时,
为本地网点和应用程序留下较大的端口号空间。
TCP是建立在所谓的“连接抽象”之上的,它所对应的对象是一个虚电路连
接,而不是仅仅一个端口(UDP才将端口作为一个可供协议软件放置收到的数据
报的队列)。TCP用一对整数(Host,Port)来标识一个虚电路连接。这一对整数
称为端地址(EndpointAddress)。其中,Host为主机的IP地址,Port为该主机上的
协议端口号。