剖析TCP和UDP协议


什么是TCP和UDP
TCP和UDP是TCP/IP协议中的两个传输层协议,它们使用IP路由功能把数据包发送到目的地,从而为应用程序及应用层协议(包括:HTTP、SMTP、SNMP、FTP和Telnet)提供网络服务 。TCP提供的是面向连接的、可靠的数据流传输,而UDP提供的是非面向连接的、不可靠的数据流传输 。面向连接的协议在任何数据传输前就建立好了点到点的连接 。ATM和帧中继是面向连接的协议,但它们工作在数据链路层,而不是在传输层 。普通的音频电话也是面向连接的 。
可靠的传输协议可避免数据传输错误 。其实现方式是:在构造数据包时在其中设置校验码,到达目的地后再采用一定的算法重新计算校验码,通过比较二者,就可以找出被破坏了的数据 。因为需要重发被破坏了的和已经丢失的数据,所以在需要重发数据时协议必须能够使目的地给出源头的一个确认信号 。有些数据包不一定按照顺序到达,所以协议必须能够探测出乱序的包,暂存起来,然后把它们按正确的次序送到应用层中去 。另外,协议还必须能够找出并丢弃重复发送的数据 。一组定时器可以限制针对不同确认的等待时间,这样就可以开始重新发送或重新建立连接 。
数据流传输协议不支持位传输 。TCP不能在一个包内以字节或位为单位构造数据,它只负责传输未经构造的8位字符串 。
非面向连接的传输协议在数据传输之前不建立连接,而是在每个中间节点对非面向连接的包和数据包进行路由 。没有点到点的连接,非面向连接的协议,如UDP,是不可靠的连接 。当一个UDP数据包在网络中移动时,发送过程并不知道它是否到达了目的地,除非应用层已经确认了它已到达的事实 。非面向连接的协议也不能探测重复的和乱序的包 。标准的专业术语用“不可靠”来描述UDP 。在现代网络中,UDP并不易于导致传输失败,但是你也不能肯定地说它是可靠的 。
TCP工作流程
现在让我们一起来看看TCP段的各个域,在IP包中它们紧跟在IP头部信息之后 。第一个16位确认了源端口,第二个16位确认了目的端口 。端口的划分使IP主机之间可用单个的IP地址实现不同类型的并发连接 。在绝大多数现代操作系统中,采用32位IP地址和16位端口地址的组合来确认一个接口 。源接口和目的接口的组合就定义了一个连接 。有216或65536个可能的端口 。最低的1024个端口是常用的,它们是系统为特定的应用层协议所保留的默认设置 。如:默认状态下,HTTP使用端口80,而POP3使用端口110 。其它的应用可以使用编号更高的端口 。
在接下来的两个域中,序列号和确认号是TCP实现可靠连接的要害 。当建立一个TCP连接时,发送方主机发出一个随机的初始化序列号给初始化器,初始化器将其加1后送回确认域的起始器,这意味着下一个字节可以发送了 。一旦数据开始流动,序列号和确认号将跟踪已发送了那些数据,那些数据已被确认 。因为每个域都是32位,总共可以有232个值,所以每个域的范围是:0~4294967295,当超过上限时回到0 。
4位的偏移量代表TCP头部一共有多少个32位的信息 。这个信息是必不可少的,因为有可选的头部区域,偏移量标识了头部的结束和数据的开始 。
TCP的设计者保留了接下来的6位,以防万一将来要对其进行扩展 。实际上,自从RFC793(传输控制协议)1981年发布以来,还没人有恰当的理由使用这些位,在这一点上,Jon Postel和他的同事一定是过分谨慎了 。
随后的6位每个都是一个标志 。若UNG标志位的值为1,意味着远在头部紧急指针区域的数据是有效的;若ACK标志位的值为1,则意味着确认号区域中的数据是有效的 。(注重:一个SYN包有一个有意义的序列号,但它的确认号是无意义的,因为它并不确认任何事件)PSH标志位使数据不必等待发送和等待接收 。RST标志位将断开一个连接 。SYN(同步)标志位意味着序列号是有效的,FIN(结束)标志位将指出发送方已经发完了数据 。

推荐阅读