当在Windows XP中同时运行多个网络应用程序时,每个应用程序都会产生自己的
数据流,传输层是用什么方法区分不同应用程序的数据流呢?
在数据流被分段(分组)以后,传输层依靠什么来重新组装这些数据流呢?
如果某个数据段在传输过冲中丢失了或重复了,可靠的传输协议依据什么去要求
重传这些数据或丢弃多余的数据呢?
带着这些问题,下面来谈论传输层所提供的服务。
传输层的主要功能是分割并重新组装上层提供的数据流,为数据流提供端对端的
传输服务。
在TCP/IP协议中,有两个传输层协议:传输控制协议(TCP)和用户数据包协议(UDP)
TCP是一个可靠的面向连接的协议,UDP是不可靠的或非连接的协议。这种面向连接和
非连接的通信方式的区别,就像打电话和寄明信片一样。打电话的双方在正式通话之
前都会说“喂”,确定对方在线以后才开始通话,会话结束时都要说“再见”,然后
才挂下电话。而寄明信片却没有这种机制,寄出去了但不管对方是否收到。
端口号
每个应用程序都会产生自己的数据流,这些数据流可以把目标主机上相应的服务程序
看作自己的目的地,对于传输层来说,它只需要知道目标主机上的哪个服务程序来响
应这应用程序,而不需要知道这个服务程序具体是干什么的。因此,传输层使用一个
抽象的端口号来标识这些应用程序和服务程序。
端口号的功能及应用特点
端口号用来跟踪网络间同时发生的不同会话。TCP和UDP可以同时接收多个应用程序送
来的数据流,用端口号来区分他们,然后送给适当的应用程序处理。这时多路分解技
术的体现,它可以确保正确的用户程序收到正确的数据。因此,每个应用程序发送数
据前都会与操作系统进行协商,获得响应的源端口号和目标端口号。
在主机发送应用程序的数据之前,都必须确认端口号,如何分配这些端口号呢?一般
有两种情况,使用中央管理机构统一分配的端口号和使用动态绑定。
使用中央管理机构统一分贝的端口号。应用程序的开发者们都默认在RFC1700中定义的
特殊端口号,在进行软件设计时,都要遵从RFC1700中定义的规则,不能随便使用已经
定义的端口号,那么系统将在一个特定的取值范围随机地为应用程序分配一个端口号。
例如,任何Telnet应用中的会话都应用标准端口号23。
使用动态绑定。如果一个应用程序的会话没有涉及到特殊的端口号,那么系统将在一个
特定的取值方位内随机地为应用程序分配一个端口号。在应用程序进行通信以前,如果
不知道对方的端口号,就必须发送请求以获得对方的端口号。
RFC(Request for Comments,征求意见资料)是一个资料系列,始创于1969年,其中描述
了关于Internet的协议实验,并不是所有RFC资料都是描述Internet标准的,但所有
Internet标准都是作为RFC资料编写的。RFC资料中提交的协议都是Internet研究人员和
开发人员根据自己的情况建立、修改和扩充的,因此不同于CCITT(国际电报电话咨询委
员会) 和ANSI(美国国家标准协会)等组织所倡导的并经过正式评审和标准化处理的协议
Internet RFC有3种状态:Proposed(提案)、Draft(草案)和Full(标准)。
TCP/IP的设计者们采用一种混合方式实现端口号地址的管理,终端系统利用源系统端口
号来选择合适的应用程序,但是源系统的源端口号由源系统动态分配。
常用的端口号介绍
目前的端口号的分配情况大致如下:
小于255的端口号用于公共应用
255~1023是特定供应商应用程序的注册端口号
高于1023的端口号未作规定。
|
UPP
|
TCP
|
FTP
|
-
|
21
|
Telnet
|
-
|
23
|
SMTP
|
-
|
25
|
DNS
|
53
|
-
|
TFTP
|
69
|
-
|
SNMP
|
161
|
-
|
HTTP
|
-
|
80
|
DHCP
|
-
|
67
|
RPC(远程调用)
|
-
|
135
|
下面举例说明端口号的使用过程。
主机A要Telnet到主机B。主机A首先向TCP请求一个可用端口,假如TCP分配一个为1088
的端口,主机A将目标端口号置为23。A和B通信以后,B看到A过来的端口号为23,就知
道这时Telnet应用,它就会为此创建一个Telnet会话。
假如同一系统中有多个Telnet用户,会发生什么情况呢?当主机A上第二个用户要Telne到
主机B时(其实是在主机A与主机B之间建立第二个Telnet进程),主机A的第二个用户向TCP
TCP会选出另外一个可使用的端口号,假如为10099,给第二个用户。主机B上便会创建
第二个Telnet会话。
所以在统一IP地址上具有不同端口号的两个连接是不同的。IP地址和端口号被用来唯一地
确定数据连接的途径。
UDP
UDP是TCP/IP的另一个非常重要的协议。
UDP数据域的头部共占用了8个字节
UDP数据域的头格式描述
名称
|
描述
|
源端口
|
调用的端口号
|
目的端口
|
被调用的端口号
|
报文长度
|
记录UDP数据包中的8位组数目包括UDP数据的长度
最小值为8(数据部分为0时)
|
校验和
|
头标和数据域计算的校验和,这一项是可选的,为的
是在高可靠性的网路上尽量减少开销
|
数据
|
上层协议的数据
|
UDP为应用程序提供的是一种不可靠的、非连接的分组交付服务,UDP报文可能出现
丢失、重复、时延、乱序、连接失效的问题。但是正式由于它不提供这种可靠性,所
以它的开销很小。换句话说,UDP提供了一种在高效可靠的网络上传输数据而不用消
耗不必要的网络资源和处理时间的通信方式。使用UDP的协议包括TFTP、SNMP、DNS
DHCP。UDP很适合这种客户机像服务器发送简单服务请求的环境,因为这种服务的开
销本来就很小,如果在喀什或者结束时加入类似TCP三次握手的过程,网络的实际利用
将会变得很低。
UDP还可以用于操作信息的登录。例如,像日志服务器 syslog发送日志信息,采用UDP
不会导致多台设备向一台服务器发送日志信息而引起过载。
UDP依靠上层协议提供可靠性,包括处理报文的丢失、重复、时延、乱序、连接失效
等问题。如Real流格式媒体就是使用应用程序协议来保证数据的正确传输。
TCP
在上文中已经提到UDP为应用程序提供的是一种不可靠的、非连接的分组的交付服务。当网络硬件失效
或者负担太重时,数据段可能会产生丢失、重复、时延、乱序等现象,这些都会导致通信不正常。如果
让应用程序来负担差错检测和恢复的工作,将给程序员带来很多复杂的工作,所以使用独立的通信协议
来保证通信的可靠性是非常必要的。[page]
传输控制协议TCP是在RFC793中定义的,它是一个面向连接的可靠的通信协议。总的来说,TCP主要提
供主要提供一下服务。
面向连接的虚电路:这有些和打电话相似,在开始传输之前,通信双方要进行三次握手来建立连接,以保
证连接的可靠性。在传输过程中,通信双方的协议模块继续进行通信,以确保正确到达(例如,接收会用
ACK应答发送方的报文段,发送方对未被应答的报文段提供重传)。如果在传输过程中通信失败了(例如传
输路径上的某个网络接口失效),通信双方都会收到错误报告。在通信结束时,通信双方会使用改进的三次
握手来关闭连接。
面向流:当通信双方传输大量数据时,TCP将数据流看作可分为字节的流,进行分段(分组),接收方将收到
的报文段按原有顺序复原。
流量控制,避免拥塞;为了提高传输效率和减少网络通信量(协议之间的通信),TCP会尽量一次传输足够多
的数据。
多路分解技术(多路复用技术):用端口号来实现。
全双工连接:TCP提供全双工连接,可以在一条连接上同时传输两个独立的、流向相反的数据流。
TCP头格式
TCP头共占用了20个字节
名称
|
描述
|
源端口
|
调用的端口号
|
目的端口
|
被调用的端口号
|
序号
|
确保数据到达的序列正确的编号
|
应答号
|
期望下一个TCP数据段
|
数据偏移(头长度)
|
以32位为单位的报头长度
|
保留
|
置为0
|
编码号
|
开始、终止会话之类的控制功能
|
窗口
|
用来控制流量
|
校验和
|
头标和数据域计算的校验和
|
紧急
|
指示紧急数据的末端
|
可选项
|
当前定义项:TCP端的最大值
|
数据
|
上层协议的数据
|
建立TCP连接:三次握手
TCP是面向连接的,在面向连接的环境中,开始传输数据之前,在两个终端之间必须先建立一个连接。建立
连接的过程可以却确保通信双方在发送应用数据包之前静静准备好了传送和接收数据。对于一个要建立的连
接,通信双方必须用彼此的初始化序列号seq和来自对方成功传输确认的应答号ack来同步。(ack号致命希望收
到的下一个八位组的编号)习惯上将同步信号写为SYN,应答信号为ACK。整个同步的过程称为三次握手。
1)主机A发送SYN给主机B:我的序列号seq是X。
2)主机B发送SYN、ACK给主机A:我的序列号seq是X+1,应答号是X+1(等待接收第X+1号八位组)。
3)主机B发送SYN、ACK给主机B:我的序列号seq是X+1,应答号是Y+1.
通过以上3个步骤(三次握手),TCP连接连接建立,开始传输数据。任何机器上的TCP都能被动地
等待握手或主动地发起握手。一旦连接建立,数据可以对等地双向流动。
如果TCP使用1作为每次建立连接的初始化序列号,当本地系统重启后,远程系统会认为以前的连接依然存
在。所以每次连接时,主机都会随机选择一个初始化序列号,用它来辨别所传输的八位组在数据流中的位
置。然后双方要对各自的序列号进行协商,因为接收收到第一个SYN时,他并不知道这是否一个被延迟的
旧信号。所以它必须要求发送验证这个SYN。
一般情况下,TCP使用最少信息的报文段来实现三次握手,这对减少网络通信流量是有效的。总之,三次握
手使通信双方做好了传输数据的准备,并且使通信通信双方统一了初始化序列号。
关闭TCP连接:改进的三次握手
对于一个已经建立的连接,TCP使用改进的三次握手来结束通话(使用一个带有FIN附加标记的报文段)。
1)当主机A的应用程序通知TCP数据已经完毕时,TCP向主机B发送一个带有FIN附加标记的报文段(FIN理解为
finish)。
2)主机B收到这个FIN报文段之后,并不立即用FIN报文段回复主机A,而是向主机A发送一个确认ACK,同时
同时通知自己相应的应用程序:对方要求关闭连接(先发送ACK为了防止在这段时间内,对方重传FIN报文段)。
3)主机B的应用程序告诉TCP:我要彻底的关闭的关闭连接,TCP向主机A送第二个FIN报文段。
4)主机A收到第二个FIN报文段后,向主机B发送一个ACK表示连接彻底关闭。
TCP的可靠性
TCP是面向流的,即数据段被当作字节的序列化进行传输。
在通过三次握手建立连接时,序列号被初始化。在传输过程中,TCP继续使用这个序列号来标记每一个发送的数据段
没发送一个数据段,序列号加1.接收站点一句序列号重新组装缩所收到数据段。为什么要依靠序列号来重组数据段呢?
例如,在一个告诉高速链路与低速链路并存的网络上,可能会出现高速链路比低速链路上的数据段提前到达的情况,
此时就必须依靠序列号来重组数据段,这就是序列号的作用之一。
在传输过程中,确认号ACK的作用是告诉发送端那些数据包已经成功接收,并且确认号会向发送端指出了接收端希望
收到的下一个数据段的序列号,这种机制称为预期确认,即确认号等于下一个预期的位元组。
在TCP/IP网络中,存在超时与重传两种现象。如果在传输过程中丢失了某个序列号的数据段,导致发送端在给定时间
间隔内得不到那个数据段的应答,那么那个丢失数据段就会被要求重发。数据段会被保存在发送端的缓冲区中,直
到发送端接收到应答号,它才会释放这个缓冲区。这种机制被称为肯定确认与重新传输(Positive Acknowledgement and
Retransimission,PAR),他是虚脱通信协议用来确保可信度的一种技术。
序列号的第二个作用就是消除网络中的重复包(同步复制)。例如在网络拥塞时,发送端迟迟没有收到接收端某个数据段
的ACK包,它可能会认为这个序列号的数据段丢失了,于是它会重新发送,这种情况可能会导致接收端在网络恢复正
常后收到两个同样序列号的数据段,此时接收端会自动丢弃第二个一样数据段。
序列号和应答号为TCP提供了一种纠错机制,提高了TCP的可靠性。