全部博文(413)
分类: LINUX
2012-01-03 16:00:55
可靠地流运输服务(TCP)
1. IP协议定义了:不可靠的无连接分组交付服务,此服务构成了所有互联网通信的基础。本章介绍第二种最重要的网络服务,即可靠地流交付服务,TCP协议对此进行了定义。
IP协议的主要目标是:向IP层以上的部分隔离下层物理网络,将下层各种不同的物理网络进行互联。从而使IP层以上的所有部分与网络硬件隔离开来。总的来说,IP的作用是互联各种物理网络,对上层协议隔离底层物理网络。IP用不可靠的无连接分组交换完成了该目标。
但是IP协议提供的是不可靠的服务,IP分组可能丢失、乱序、重复交付、延时交付,我们高层的应用程序不可能来处理这些问题。所以在IP协议层之上,我们必须提供给上层应用程序一种可靠地服务——TCP协议!
2. TCP服务的特征:
1)面向流。
2)虚电路连接(Virtual Circuit Connection),意思是TCP的目标是提供像专用的硬件线路一样可靠地服务,但是同时它又是“虚拟”的,可靠性只是流交付服务提供的一种幻象。
3)带缓冲的传送(Buffered Transfer)
4)无结构的流
5)全双工连接
3. 提供可靠性
可靠地传送服务是基于一种基本技术——带重传的正面确认(positive acknowledgement with retransmission)。最简单的理解是:接收方收到数据之后向源站发回一个确认(acknowledgement,简称ACK)报文。发送方在发送下一个分组之前等待该ACK确认信息。发送方还在发送分组时启动一个计时器,如果计时器超时而ACK确认没有收到,那么就重传刚才的分组。(这是最简单的正面确认协议)
4. 滑动窗口(sliding window)
滑动窗口协议能够让网络中得分组完全饱和,因此能够获得比简单的正面确认协议高得多的吞吐率。
滑动窗口解决了端到端的流量控制(flow control)问题。注意这里是端到端的流量控制:
(路由器的流量控制机制——拥塞控制,见后面的介绍)
TCP允许窗口大小随时改变,在每个ACK确认中,除了指明收到多少字节之外,还包括了一个窗口通告(window advertisment),指出接收方准备再接受多少字节的数据。
5. TCP是建立在连接抽象(connection abstraction)上的
TCP使用连接而不是协议端口作为它的基本抽象的,连接在建立时是用一对端点来标识的。
也就是说,TCP连接在建立时,是根据ip和port对来建立的。在该连接建立完成之后,并不会占着该端口。也就是说,还可以用该端口来建立新的连接。常见的例子:
一个服务器在某个端口 port1 上提供基于TCP服务的服务端程序,其它客户端与该服务程序建立连接,从而来取得它的某种服务。A客户端与port1建立连接之后,并不会妨碍B客户端与port1建立连接!
6. 被动打开与主动打开
基于C/S的应用,服务端一般是被动打开,而客户端是主动打开。是客户端主动与服务端建立连接。
7. 报文段(segment)、流和序号
TCP把数据流当成字节的序列,而为了便于传输,又把序列划分成若干报文段(segment)。
8. TCP报文段的格式
0 4 10 16 24 31
-------------------------------------------------------------
源端口 | 目的端口
-------------------------------------------------------------
序号
-------------------------------------------------------------
确认号
-------------------------------------------------------------
首部长度 保留未用 码元位 | 窗口
-------------------------------------------------------------
校验和 | 紧急指针
-------------------------------------------------------------
选项(若有) | 填充
-------------------------------------------------------------
数据
-------------------------------------------------------------
1)源端口和目的端口 字段包含了连接两端对应用程序进行标识的TCP端口号;
2)序号 字段指出了这个报文段在发送方的数据字节流中的位置;
3)确认号 字段指出了本机希望接收的下一个字节的序号;
4)首部长度4位 字段是一个以32比特为单位的首部长度值。
6)6位的保留字段
7)6位的码元(code)字段指出报文段的目的和内容:
比特(从左到右) 该比特置1的含义
---------------------------------------------
URG 紧急指针字段有效
ACK 确认字段有效
PSH 本报文段请求推(push)操作
RST 连接复位
SYN 序号同步
FIN 发送方字节流结束
8)窗口 字段指定了缓冲区大小,接收方能通告发送方应该发送多少数据。
9. 带外数据(data out of band)
有时在连接的一端的应用程序希望不必等待另一端处理完毕数据流上得字节就能发送带外数据。
TCP允许发送方把数据指定为紧急的(将URG置1),并在紧急指针字段中指出了紧急数据在报文段中的结束位置。
10. TCP选项
1)最大报文段长度选项(Maximum Segment Size,简称MSS):
TCP可以使用选项字段和另一端的TCP软件进行协商,TCP使用MSS选项,允许接收方指出自己愿意接受的最大报文段长度。MSS的意义在于:允许异构的系统相互通信,比如一个仅有几百字节缓冲空间的嵌入式系统可以与超级计算机来通信。
2)窗口扩大比例选项(window scaling option)
TCP首部中得窗口字段长度为16位,因此最大的窗口大小为64KB。为了适应像卫星信道那样的大延迟、大带宽网络,可以在选项字段中使用“窗口扩大选项”。将窗口字段中的数值W,向左移动S位,来作为新窗口的大小。(此选项包括三个字节:类型、长度、移位值S)
3)时间戳选项
TCP时间戳选项可以帮助TCP计算下层网络上得时延,也用于处理TCP序号超过2^32的情况,后者称为“防止序号绕回(Protect Against Wrapped Sequence numbers,简称PAWS)。除了所需的类型和长度字段,时间戳选项还包括两个值:一个是时间戳值,另一个是回送回答时间戳值。
发送方在发送一个分组时把当前时钟的时间值放入时间戳字段;接收方在返回这个分组的确认前,把时间戳字段值复制到回送回答字段。因此,在确认到达后,发送方可以准确地计算出自报文段发送以来总共经过了多长时间。
11. TCP校验和的计算
与UDP校验和类似,给报文段引入了一个伪首部(pseudo header),添加足够多的0比特,使报文段的长度为16位的整数倍。TCP伪首部格式如下:
0 8 16 31
----------------------------------------------------------
源IP地址
----------------------------------------------------------
目的IP地址
----------------------------------------------------------
零 | 协议 | TCP长度
用来验证报文段是否已经无损伤地到达了正确的目的进程。