TCP转输控制协议(转)
TCP:传输控制协议(Transmission Control Protocol)
传输控制协议(Transmission Control Protocol, TCP)是一种面向连接(连接导向)的、可靠的、基于字节流的运输层(Transport layer)通信协议,由IETF的RFC 793说明(specified)。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,UDP是同一层内另一个重要的传输协议。
在因特网协议族(Internet protocol suite)中,TCP层是位于IP层之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换。
应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,然后TCP把数据流分割成适当长度的报文段(通常受该计算机连接的网络的数据链路层 的最大传送单元(MTU)的限制)。之后TCP把结果包传给IP层,由它来通过网络将包传送给接收端实体的TCP层。TCP为了保证不发生丢包,就给每个 字节一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的字节发回一个相应的确认(ACK);如果发送端实体在合理 的往返时延(RTT)内未收到确认,那么对应的数据(假设丢失了)将会被重传。TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验 和。
运作方式
通路的建立和终结
TCP连接包括三个状态:连接建立、数据传送和连接终止。TCP用三路握手(three-way handshake)过程建立一个连接,用四路握手(four-way handshake)过程来拆除一个连接。在连接建立过程中,很多参数要被初始化,例如序号被初始化以保证按序传输和连接的强壮性。
一对终端同时初始化一个它们之间的连接是可能的。但通常是由一端打开一个套接字(socket)然后监听来自另一方的连接,这就是通常所指的被动打开(passive open)。服务器端被被动打开以后,用户端就能开始建立主动打开(active open)。
- 客户端通过向服务器端发送一个SYN来建立一个主动打开,作为三路握手的一部分。
- 服务器端应当为一个合法的SYN回送一个SYN/ACK。
- 最后,客户端再发送一个ACK。这样就完成了三路握手,并进入了连接建立状态。
TCP连接的正常建立
数据传输
在TCP的数据传送状态,很多重要的机制保证了TCP的可靠性和强壮性。它们包括:使用序号,对收到的TCP报文段进行排序以及检测重复的数据;使用校验和来检测报文段的错误;使用确认和计时器来检测和纠正丢包或延时。
序列号和确认
在TCP的连接建立状态,两个主机的TCP层间要交换初始序号 (ISN:initial sequence number)。这些序号用于标识字节流中的数据,并且还是对应用层的数据字节进行记数的整数。通常在每个TCP报文段中都有一对序号和确认号。TCP报 文发送者认为自己的字节编号为序号,而认为接收者的字节编号为确认号。TCP报文的接收者为了确保可靠性,在接收到一定数量的连续字节流后才发送确认。这 是对TCP的一种扩展,通常称为选择确认(Selective Acknowledgement)。选择确认使得TCP接收者可以对乱序到达的数据块进行确认。每一个字节传输过后,ISN号都会递增1。
通过使用序号和确认号,TCP层可以把收到的报文段中的字节按正确的顺序交付给应用层。序号是32位的无符号数,在它增大到232-1时,便会回绕到0。对于ISN的选择是TCP中关键的一个操作,它可以确保强壮性和安全性。
数据传输举例
- 放送方然后发送第二个包含序列号为1461和1460字节数据的TCP报文段给接收方。正常情况下,接收方以一个没有数据的TCP报文段来回复,用确认号2921来表示已完全收到并请求下一个报文段。发送接收这样继续下去。
- 然而当这些数据包都是相连的情况下,接收方没有必要每一次都回应。比如,他收到第1到5条TCP报文段,只需回应第五条就行了。在例子中第3条TCP报文段被丢失了,所以尽管他收到了第4和5条,然而他只能回应第2条。
- 放送方在发送了第三条以后,没能收到回应,因此当时钟(timer)过时(expire)时,他重发第三条。(每次发送者发送一条TCP报文段后,都会重启动一次时钟:RTT)。
- 这次第三条被成功接收,接收方可以直接确认第5条,因为4,5两条已收到。
TCP数据传输
校验和
TCP的16位的校验和(checksum)的计算和检验过程如下:发送者将TCP报文段的头部和数据部分的和计算出来,再对其求反码(一 的补数),就得到了校验和,然后将结果装入报文中传输。(这里用反码和的原因是这种方法的循环进位使校验和可以在16位、32位、64位等情况下的计算结 果在叠加后相同)接收者在收到报文后再按相同的算法计算一次校验和。这里使用的反码使得接收者不用再将校验和字段保存起来后清零,而可以直接将报文段连同 校验加总。如果计算结果是全部为一,那么就表示了报文的完整性和正确性。
注意:TCP校验和也包括了96位的伪头部,其中有源地址、目的地址、协议以及TCP的长度。这可以避免报文被错误地路由。
按现在的标准,TCP的校验和是一个比较脆弱的校验。具有高出错率的数据链路层需要额外的连接错误纠正和探测能力。如果TCP是在今天被设计,它很 可能有一个32位的CRC校验来纠错,而不是使用校验和。但是通过在第二层使用通常的CRC或更完全一点的校验可以部分地弥补这种脆弱的校验。第二层是在 TCP层和IP层之下的,比如PPP或以太网,它们使用了这些校验。但是这也并不意味着TCP的16位校验和是冗余的,对于因特网传输的观察,表明在受CRC保护的各跳之间,软件和硬件的错误通常也会在报文中引入错误,而端到端的TCP校验能够捕捉到很多的这种错误。这就是应用中的端到端原则。
流量控制和阻塞管理
数据发送者之间用对接收数据的确认或不予确认来显式的表示TCP发送者和接收者之间的网络状态。再加上计时器,TCP发送者和接收者就可以改变数据的流动情况。这就是通常所指的流量控制(Flow control),拥塞控制/或拥塞避免。TCP使用大量的机制来同时获得强壮性和高可靠性。这些机制包括:滑动窗口、慢启动算法、拥塞避免算法、快速重启和快速恢复算法等等。对于TCP的可靠的丢包处理、错误最小化、拥塞管理以及高速运行环境等机制的优化的研究和标准制定,正在进行之中。若有丢失封包,则从丢失的封包开始重送。UDP因为得确认正确了才能传送下一阶段,因此没有办法作流量管制。
TCP数据传输不同于UDP之处
- 有序数据传输
- 重发丢失的封包
- 舍弃重复的封包
- 无错误数据传输
- 阻塞/流量控制
- 连接导向(确认有建立三方交握,连线已建立才作传输。)
通路的终结
连接终止状态使用了四路握手过程,在这个过程中每个终端的连接都能独立地被终止。因此,一个典型的拆接过程需要每个终端都提供一对FIN和ACK。
TCP连接的正常终止
TCP的端口
TCP使用了端口号的概念来标识发送方和接收方的应用层。对每个TCP连接的一端都有一个相关的16位元的无符号端口号分配给它们。端口被分为三类:众所周知的、注册的和动态/私有的。众所周知的端口号是由因特网赋号管理局(IANA)来分配的,并且通常被用于系统一级或根进程。众所周知的应用程序作为服务器程序来运行,并被动地侦听经常使用这些端口的连接。例如:FTP、TELNET、SMTP、HTTP等。注册的端口号通常被用来作为终端用户连接服务器时短暂地使用的源端口号,但它们也可以用来标识已被第三方注册了的、被命名的服务。动态/私有的端口号在任何特定的TCP连接外不具有任何意义。可能的、被正式承认的端口号有65535个。
TCP的封包结构
+ | Bits 0–3 | 4–7 | 8–15 | 16–31 | ||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 来源连接埠(Source port) | 目的连接埠(Destination port) | ||||||||||||||||||||||||||||||
32 | 序列号码(Sequence number) | |||||||||||||||||||||||||||||||
64 | 确认号码(Acknowledgement number) | |||||||||||||||||||||||||||||||
96 | 标题长度(Offset) | 保留(Reserved) | 标志符(U A P R S F) | 窗口大小(Window) | ||||||||||||||||||||||||||||
128 | 检查码(Checksum) | 紧急指标(Urgent pointer) | ||||||||||||||||||||||||||||||
160 | 选用(Option + Padding) | |||||||||||||||||||||||||||||||
160/192+ | 数据(Data) |
- Source Port – 识别上层源处理器接收 TCP 服务的点。
- Destination Port – 识别上层目标处理器接收 TCP 服务的点。
- Sequence Number – 通常指定分配到当前信息中的数据首字节的序号。在连接建立阶段,该字段用于设别传输中的初始序列号。
- Acknowledgment Number – 包含数据包发送端期望接收的数据下一字节的序列号。一旦连接成功,该值会一直被发送。
- Data Offset – 4 位。TCP 协议头中的32位字序号表示数据开始位置。
- Reserved – 6位。预留以备用,必须设置为0。
- Control Bits (Flags) – 6位。传送各种控制信息。控制位可以是:
U (URG) | 紧急标志:Urgent pointer field significant. |
A (ACK) | 确认标志:Acknowledgment field significant. |
P (PSH) | 推标志:Push function. |
R (RST) | 复位标志:Reset the connection. |
S (SYN) | 同步标志:Synchronize sequence numbers. |
F (FIN) | 结束标志:No more data from sender. |
- Window – 16位。指定发送端接收窗口的大小,也就是说,数据可用的八位缓存区大小。
- Checksum – 16 位。指出协议头在传输中是否遭到破坏。
- Urgent Pointer – 16 位。指向数据包中的第一个重要数据字节。
- Option + Padding – 指定各种 TCP 选项。可选项有两种可能形式:单个八位可选类型和八位可选类型,八位可选长度和实际可选数据八位位组。
- Data – 包含上层信息。
TCP的发展过程
TCP是一个复杂的但同时又是在发展之中的协议。尽管许多重要的改进被提出和实施,发表于1981年的RFC793中说明的TCP (TCP-Tahoe)的许多基本操作还是未作多大改动。RFC1122:《因特网对主机的要求》阐明了许多TCP协议的实现要求。RFC2581: 《TCP的拥塞控制》是一篇近年来关于TCP的很重要的RFC,描述了更新后的避免过度拥塞的算法。写于2001年的RFC3168描述了对明显拥塞的报 告,这是一种拥塞避免的信号量机制。在21世纪早期,在所有因特网的数据包中,通常有大约95%的包使用了TCP协议。常见的使用TCP的应用层有 HTTP/HTTPS(万维网协议),SMTP/POP3/IMAP(电子邮件协议)以及FTP(文件传输协议)。这些协议在今天被广泛地使用,这证明了 它们的原作者的创造是卓越的。
最近,一个新协议已经被加州理工学院的科研人员开发出来,命名为FAST TCP(基于快速活动队列管理的规模可变的传输控制协议)。它使用排队延迟作为拥塞控制信号;但是因为端到端的延迟通常不仅仅包括排队延迟,所以FAST TCP (或更一般地,所有基于排队延迟的算法) 在实际互联网中的能否工作仍然是一个没有解决的问题。
对TCP的选用情况
TCP并不是对所有的应用都适合,一些新的带有一些内在的脆弱性的运输层协议也被设计出来。比如,实时应用并不需要甚至无法忍受TCP的可靠传输机制。在这种类型的应用中,通常允许一些丢包、出错或拥塞,而不是去校正它们。例如通常不使用TCP的应用有:实时流多媒体(如因特网广播)、实时多媒体播放器和游戏、IP电话(VoIP)等等。任何不是很需要可靠性或者是想将功能减到最少的应用可以避免使用TCP。在很多情况下,当只需要多路复用应用服务时,用户数据报协议(UDP)可以代替TCP为应用提供服务。
原文地址:http://www.cnblogs.com/easydata/archive/2009/01/04/1367796.html
相关协议:IP、UDP、ICMP、SNMP、FTP、TELNET、SMTP、RPC、XDR、NFS
组织来源:TCP 由 IETF(http://www.ietf.org/)定义在 RFC 793中。