
你大概说的是3步握手吧,这跟传真机的5部握手很类似。
下面的资料希望对你有用
TCP/IP 是很多的不同的协议组成,实际上是一个协议组,TCP 用户数据报表协议(也
称作TCP 传输控制协议,Transport Control Protocol。可靠的主机到主机层协议。这里要先
强调一下,传输控制协议是OSI 网络的第四层的叫法,TCP 传输控制协议是TCP/IP 传输的
6 个基本协议的一种。两个TCP 意思非相同。)。TCP 是一种可靠的面向连接的传送服务。
它在传送数据时是分段进行的,主机交换数据必须建立一个会话。它用比特流通信,即数据
被作为无结构的字节流。通过每个TCP 传输的字段指定顺序号,以获得可靠性。是在OSI
参考模型中的第四层,TCP 是使用IP 的网间互联功能而提供可靠的数据传输,IP 不停的把
报文放到网络上,而TCP 是负责确信报文到达。在协同IP 的 *** 作中TCP 负责:握手过程、
报文管理、流量控制、错误检测和处理(控制),可以根据一定的编号顺序对非正常顺序的
报文给予从新排列顺序。关于TCP 的RFC 文档有RFC793、RFC791、RFC1700。
在TCP 会话初期,有所谓的“三握手”:对每次发送的数据量是怎样跟踪进行协商使
数据段的发送和接收同步,根据所接收到的数据量而确定的数据确认数及数据发送、接收完
毕后何时撤消联系,并建立虚连接。为了提供可靠的传送,TCP 在发送新的数据之前,以
特定的顺序将数据包的序号,并需要这些包传送给目标机之后的确认消息。TCP 总是用来
发送大批量的数据。当应用程序在收到数据后要做出确认时也要用到TCP。由于TCP 需要
时刻跟踪,这需要额外开销,使得TCP 的格式有些显得复杂。下面就让我们看一个TCP 的
经典案例,这是后来被称为MITNICK 攻击中KEVIN 开创了两种攻击技术:
TCP 会话劫持
SYN FLOOD(同步洪流)
在这里我们讨论的时TCP 会话劫持的问题。
先让我们明白TCP 建立连接的基本简单的过程。为了建设一个小型的模仿环境我们假
设有3 台接入互联网的机器。A 为攻击者 *** 纵的攻击机。B 为中介跳板机器(受信任的服务
器)。C 为受害者使用的机器(多是服务器),这里把C 机器锁定为目标机器。A 机器向B
机器发送SYN 包,请求建立连接,这时已经响应请求的B 机器会向A 机器回应SYN/ACK
表明同意建立连接,当A 机器接受到B 机器发送的SYN/ACK 回应时,发送应答ACK 建立
A 机器与B 机器的网络连接。这样一个两台机器之间的TCP 通话信道就建立成功了。
B 终端受信任的服务器向C 机器发起TCP 连接,A 机器对服务器发起SYN 信息,使
C 机器不能响应B 机器。在同时A 机器也向B 机器发送虚假的C 机器回应的SYN 数据包,
接收到SYN 数据包的B 机器(被C 机器信任)开始发送应答连接建立的SYN/ACK 数据包,
这时C 机器正在忙于响应以前发送的SYN 数据而无暇回应B 机器,而A 机器的攻击者预
测出B 机器包的序列号(现在的TCP 序列号预测难度有所加大)假冒C 机器向B 机器发送
应答ACK 这时攻击者骗取B 机器的信任,假冒C 机器与B 机器建立起TCP 协议的对话连
接。这个时候的C 机器还是在响应攻击者A 机器发送的SYN 数据。
TCP 协议栈的弱点:TCP 连接的资源消耗,其中包括:数据包信息、条件状态、序列
号等。通过故意不完成建立连接所需要的三次握手过程,造成连接一方的资源耗尽。
通过攻击者有意的不完成建立连接所需要的三次握手的全过程,从而造成了C 机器的
资源耗尽。序列号的可预测性,目标主机应答连接请求时返回的SYN/ACK 的序列号时可预
测的。(早期TCP 协议栈,具体的可以参见1981 年出的关于TCP 雏形的RFC793 文档)
TCP 头结构
TCP 协议头最少20 个字节,包括以下的区域(由于翻译不禁相同,文章中给出
相应的英文单词):
TCP 源端口(Source Port):16 位的源端口其中包含初始化通信的端口。源端口和
源IP 地址的作用是标示报问的返回地址。
TCP 目的端口(Destination port):16 位的目的端口域定义传输的目的。这个端口指
明报文接收计算机上的应用程序地址接口。
TCP 序列号(序列码,Sequence Number):32 位的序列号由接收端计算机使用,重
新分段的报文成最初形式。当SYN 出现,序列码实际上是初始序列码(ISN),而第一个数
据字节是ISN+1。这个序列号(序列码)是可以补偿传输中的不一致。
TCP 应答号(Acknowledgment Number):32 位的序列号由接收端计算机使用,重
组分段的报文成最初形式。,如果设置了ACK 控制位,这个值表示一个准备接收的包的序
列码。
数据偏移量(HLEN):4 位包括TCP 头大小,指示何处数据开始。
保留(Reserved):6 位值域,这些位必须是0。为了将来定义新的用途所保留。
标志(Code Bits):6 位标志域。表示为:紧急标志、有意义的应答标志、推、重置
连接标志、同步序列号标志、完成发送数据标志。按照顺序排列是:URG、ACK、PSH、
RST、SYN、FIN。
窗口(Window):16 位,用来表示想收到的每个TCP 数据段的大小。
校验位(Checksum):16 位TCP 头。源机器基于数据内容计算一个数值,收信息机
要与源机器数值结果完全一样,从而证明数据的有效性。
优先指针(紧急,Urgent Pointer):16 位,指向后面是优先数据的字节,在URG
标志设置了时才有效。如果URG 标志没有被设置,紧急域作为填充。加快处理标示为紧急
的数据段。
选项(Option):长度不定,但长度必须以字节。如果没有选项就表示这个一字节
的域等于0。
填充:不定长,填充的内容必须为0,它是为了数学目的而存在。目的是确保空
间的可预测性。保证包头的结合和数据的开始处偏移量能够被32 整除,一般额外的零以保
证TCP 头是32 位的整数倍。
标志控制功能
URG:紧急标志
紧急(The urgent pointer) 标志有效。紧急标志置位,
ACK:确认标志
确认编号(Acknowledgement Number)栏有效。大多数情况下该标志位是置位的。
TCP 报头内的确认编号栏内包含的确认编号(w+1,Figure:1)为下一个预期的序列编号,同
时提示远端系统已经成功接收所有数据。
PSH:推标志
该标志置位时,接收端不将该数据进行队列处理,而是尽可能快将数据转由应用
处理。在处理telnet 或rlogin 等交互模式的连接时,该标志总是置位的。
RST:复位标志
复位标志有效。用于复位相应的TCP 连接。
SYN:同步标志
同步序列编号(Synchronize Sequence Numbers)栏有效。该标志仅在三次握手建立
TCP 连接时有效。它提示TCP 连接的服务端检查序列编号,该序列编号为TCP 连接初始端
(一般是客户端)的初始序列编号。在这里,可以把TCP 序列编号看作是一个范围从0 到4,
294,967,295 的32 位计数器。通过TCP 连接交换的数据中每一个字节都经过序列编号。
在TCP 报头中的序列编号栏包括了TCP 分段中第一个字节的序列编号。
FIN:结束标志
带有该标志置位的数据包用来结束一个TCP 回话,但对应端口仍处于开放状态,
准备接收后续数据。
服务端处于监听状态,客户端用于建立连接请求的数据包(IP packet)按照TCP/IP
协议堆栈组合成为TCP 处理的分段(segment)。
分析报头信息: TCP 层接收到相应的TCP 和IP 报头,将这些信息存储到内存中。
检查TCP 校验和(checksum):标准的校验和位于分段之中(Figure:2)。如果检验
失败,不返回确认,该分段丢弃,并等待客户端进行重传。
查找协议控制块(PCB{}):TCP 查找与该连接相关联的协议控制块。如果没有找
到,TCP 将该分段丢弃并返回RST。(这就是TCP 处理没有端口监听情况下的机制) 如果该
协议控制块存在,但状态为关闭,服务端不调用connect()或listen()。该分段丢弃,但不返
回RST。客户端会尝试重新建立连接请求。
建立新的socket:当处于监听状态的socket 收到该分段时,会建立一个子socket,
同时还有socket{},tcpcb{}和pub{}建立。这时如果有错误发生,会通过标志位来拆除相应
的socket 和释放内存,TCP 连接失败。如果缓存队列处于填满状态,TCP 认为有错误发生,
所有的后续连接请求会被拒绝。这里可以看出SYN Flood 攻击是如何起作用的。
丢弃:如果该分段中的标志为RST 或ACK,或者没有SYN 标志,则该分段丢弃。
并释放相应的内存。
发送序列变量
SNDUNA : 发送未确认
SNDNXT : 发送下一个
SNDWND : 发送窗口
SNDUP : 发送优先指针
SNDWL1 : 用于最后窗口更新的段序列号
SNDWL2 : 用于最后窗口更新的段确认号
ISS : 初始发送序列号
接收序列号
RCVNXT : 接收下一个
RCVWND : 接收下一个
RCVUP : 接收优先指针
IRS : 初始接收序列号
当前段变量
SEGSEQ : 段序列号
SEGACK : 段确认标记
SEGLEN : 段长
SEGWND : 段窗口
SEGUP : 段紧急指针
SEGPRC : 段优先级
CLOSED 表示没有连接,各个状态的意义如下:
LISTEN : 监听来自远方TCP 端口的连接请求。
SYN-SENT : 在发送连接请求后等待匹配的连接请求。
SYN-RECEIVED : 在收到和发送一个连接请求后等待对连接请求的确认。
ESTABLISHED : 代表一个打开的连接,数据可以传送给用户。
FIN-WAIT-1 : 等待远程TCP 的连接中断请求,或先前的连接中断请求的确认。
FIN-WAIT-2 : 从远程TCP 等待连接中断请求。
CLOSE-WAIT : 等待从本地用户发来的连接中断请求。
CLOSING : 等待远程TCP 对连接中断的确认。
LAST-ACK : 等待原来发向远程TCP 的连接中断请求的确认。
TIME-WAIT : 等待足够的时间以确保远程TCP 接收到连接中断请求的确认。
CLOSED : 没有任何连接状态。
TCP 连接过程是状态的转换,促使发生状态转换的是用户调用:OPEN,SEND,
RECEIVE,CLOSE,ABORT 和STATUS。传送过来的数据段,特别那些包括以下标记的数
据段SYN,ACK,RST 和FIN。还有超时,上面所说的都会时TCP 状态发生变化。
序列号
请注意,我们在TCP 连接中发送的字节都有一个序列号。因为编了号,所以可以
确认它们的收到。对序列号的确认是累积性的。TCP 必须进行的序列号比较 *** 作种类包括
以下几种:
①决定一些发送了的但未确认的序列号。
②决定所有的序列号都已经收到了。
③决定下一个段中应该包括的序列号。
对于发送的数据TCP 要接收确认,确认时必须进行的:
SNDUNA = 最老的确认了的序列号。
SNDNXT = 下一个要发送的序列号。
SEGACK = 接收TCP 的确认,接收TCP 期待的下一个序列号。
SEGSEQ = 一个数据段的第一个序列号。
SEGLEN = 数据段中包括的字节数。
SEGSEQ+SEGLEN-1 = 数据段的最后一个序列号。
如果一个数据段的序列号小于等于确认号的值,那么整个数据段就被确认了。而
在接收数据时下面的比较 *** 作是必须的:
RCVNXT = 期待的序列号和接收窗口的最低沿。
RCVNXT+RCVWND:1 = 最后一个序列号和接收窗口的最高沿。
SEGSEQ = 接收到的第一个序列号。
SEGSEQ+SEGLEN:1 = 接收到的最后一个序列号。
从ATM网络的内部结构来看,实际上包含三个层次,即由物理链路组成的网络、由VP组成的网络、由VC组成的网络。对用户来讲,涉及的是VC级网络;对交换机来讲涉及的是VP级网络;对网络维护者来讲涉及的是物理级网络。 采用VC为用户提供服务,而用VP来连网。在用户一用户应用的情况下,把VP细分为各单位的VC,并由用户控制那些VC所属的全部资源,在VP内各VC的建立和释放只包括两个换机,而信息在交换机内的交换和选路则由VP来完成,一条VP可当作两个ATM交换机之间的虚中继线用。 由于ATM是一种面向连接的交换技术,用户进行通信前必须先申请虚路径,提出业务要求,如峰值比特率、平均比特率、突发性、质量要求、优先级等,网络根据用户要求和资源的占用情况来决定是否可以为用户提供虚路径,从而且实现按需动态分配带宽,而且带宽不是固定的或被某用户所独占,通过统计复用技术达到网络资源的充分利用。 由于ATM又是一种面向分组的交换技术,它将任何业务信息都变成长度相同的信元(Cell,53byte长,其中报头占5byte,信息域48byte),通过异步时分复用技术把不同用户和不同业务的信元变成连续的比特流,送入ATM交换机。不同的用户信元在ATM信元流中没有固定的位置,是按需动态占用的,因而不同类型和速率的用户业务都能方便、灵活地进入网络。交换机对用户信元是透明的,不进行任何处理,把差错控制和流量控制等工作交给网络终端设备来完成。交换机通过硬件实现选路和信元转移,从而大大提高了信息转移容量和转移速度。而且,ATM是一种为支持宽带综合业务网而专门开发的新技术,它与现在的电路交换无任何衔接。当发送端想要和接收端通信时、它通过UNI发送一个要求建立连接的控制信号。接收端通过网络收到该控制信号并同意建立连接后,一个虚拟线路就会被建立。与同步传递模式(STM)不同,ATM采用异步时分复用技术(统计复用)。来自不同信息源的信息汇集在一个缓冲器内排队。列中的信元逐个输出到传输线上,形成首尾相连的信息流。ATM具有以下特点:因传输线路质量高,不需要逐段进行差错控制。ATM在通信之前需要先建立一个虚连接来预留网络资源,并在呼叫期间保持这一连接,所以ATM以面向连接的方式工作。信头的主要功能是标识业务本身和它的逻辑去向,功能有限。信无长度小,时延小,实时性较好。 TCP(Transmission Control Protocol)传输控制协议 TCp协议位于第四层。其代表的含义是传输控制协议(Transmission Control protocol)。TCP 在端点间建立连接或虚拟电路进行可靠通信。当一个数据包被封装之后,第三层当然有个Ip协议头,紧接着就是这个TCp协议头。TCp协议头成为了Ip协议头中的“数据”。就像其它协议都有自己的术语一样,TCp协议也有自己的专门术语,如以太网帧、Ip数据报和现在的TCp段等。你可以把它们都当作数据包。但是,当它们之间在进行通讯的时候,一定要使用正确的术语。由于大多数网络应用程序都在同一台机器上运行,计算机上必须能够确保目的地机器上的软件程序能从源地址机器处获得数据包,以及源计算机能收到正确的回复。这是通过使用 TCP 的“端口号”完成的。网络 IP 地址和端口号结合成为唯一的标识 , 我们称之为“套接字”或“端点”。 TCp协议是一种端对端的协议。使用TCp没有任何广播或类似的概念。TCP 通过面向连接的、端到端的可靠数据报发送来保证可靠性。TCP 在字节上加上一个递进的确认序列号来告诉接收者发送者期望收到的下一个字节。如果在规定时间内,没有收到关于这个包的确认响应,重新发送此包。TCP 的可靠机制允许设备处理丢失、延时、重复及读错的包。超时机制允许设备监测丢失包并请求重发。 要用TCp协议与另一台计算机通信,两台机之间必须像打电话一样连接在一起,每一端都都为通话做好准备。“流传输”(Stream delivery)是谈到TCp时的另一个常用词语。这个短语的含义是TCp协议主要用来处理数据流,可以正确处理乱序的数据包。TCp协议甚至还允许存在丢失的或者损坏的数据包,最终它可以再次得到这些数据包。你很可能听一位程序员在谈论“流”的概念。他指的是这样一个事实:数据到底是在什么时候发送的是很难说清楚的,你也可以在TCp流中发送非结构化数据。TCp协议以它自己的方式缓存数据。不过,其缓存过程对程序员和用户是透明的。 关于流数据传输 ,TCP 交付一个由序列号定义的无结构的字节流。 这个服务对应用程序有利,因为在送出到 TCP 之前应用程序不需要将数据划分成块, TCP 可以将字节整合成字段,然后传给 IP 进行发送。 TCp协议每发送一个数据包将会收到一个确认信息。这种发送/应答模式是提供可靠的协议的唯一方法:你必须让对方知道你否收到了数据。当然,这也会造成一些性能损失,而人们需要改善系统效率不高的状况。所以引入了“捎带确认(piggybacking ACKs)”的方法。TCp协议之所以是全双工的就是因为这个“捎带确认”信息,因为它允许双方同时发送数据。这是通过在当前的数据包中携带以前收到的数据的确认信息方式实现的。从提高网络利用率的角度看,这比单纯发送一个通知对方“信息已收到”的数据包要好得多。最后,还有一个批量确认的概念:也即一次确认一个以上的数据包,表示“我收到了包括这个数据包在内的全部数据包”。 在Ip协议中,我们处理的单个数据包是一个更大的数据报的一部分。请记住,一个TCp段就是一个单个的TCp数据包。TCp是一个数据流,因此,除了“连接”之外,没有任何需要真正担心的其它概念。最大报文段长度(MSS)是在连接的时候协商的,但是,它总是在不断地改变。默认的最大报文段长度是536字节,这是576字节(Ip协议保证的最小数据包长度)减去用于Ip头的20个字节和用于TCp头的20个字节以后的长度。TCp协议要设法避免在Ip级别上的分段。因此,TCp协议总是从536字节开始的。 TCp协议最有魅力的功能仍然保留着。这就是滑动窗口协议。这个窗口实际上是已经发出的“没有签收确认的”数据总数。这个窗口可以根据意愿放大和缩小。这是很有趣的。下一讲将介绍这方面的内容。 一个TCp数据包的头是20个字节,就像一个Ip数据包一样。如果使用一些选项,Ip和TCp数据包头都可以放大。TCp头不包含Ip地址,它仅需要知道要连接哪一个端口。不过,你不要被这弄晕了。TCp工作时要一直跟踪状态表中的端对端的连接。这个状态表包含Ip地址和端口。这就是说,只是TCp头不需要Ip信息,因为它来自于Ip头。 把一个数据包设想为一个字节跟着一个字节的数据流是很容易的。很多人都想要一个显示TCp头的表格。但是,这常会把事情搞乱。TCp头从第一位开始依次是下面这些内容: �6�1源端口,16位:用于这次连接的本地TCp端口。 �6�1目的地端口,16位:通讯目标机器的TCp端口。 �6�1序列号,32位:用来跟踪数据包顺序的号码。 �6�1确认编号,32位:我们确认的以前收到的序列号。 �6�1头长度,4位:报头中的32位字(words)的数量。如果不使用选项,这个值设定为5。 �6�1保留,6位:为将来的使用保留的字节。 �6�1标记,一共6位:每一个标记一个字节(开或者关) -URG:紧急字段指针。 -ACK:本数据包是(或者包含)一个确认信息。 -pSH:推送功能(没有使用)。 -RST:重置,或者中断本次连接。 -SYN:同步数据包,也就是开始连接。 -FIN:最后一个数据包,开始挂断序列。 �6�1窗口尺寸,16位:从接收方将收到的确认字段开始。 �6�1校验和,16位:TCp头和数据的校验和。 �6�1应急指针,16位:指向跟在URG数据后面的数据的序列号的偏移值。 �6�1选项:MSS、窗口比例等等。我们在关于TCp协议的下一讲中将重点介绍这个部分。 TCp连接的两端使用两对Ip地址和端口识别这个连接,并且向监听这个端口的应用程序发送数据。 小结 TCp是一种最常用的协议,在协议栈中位于第四层,也就是传输层协议(它是一个协议),它通过序列确认以及包重发机制,提供可靠的数据流发送和到应用程序的虚拟连接服务。与 IP 协议相结合, TCP 组成了因特网协议的核心。 TCp协议提供阻塞控制、可靠性、发送数据的流传输、有效流控制、全双工 *** 作和多路复用技术等。 为了提高效率,TCp协议在得到确认之前努力发送尽可能多的数据。 全双工 *** 作: TCP 进程能够同时发送和接收包。 TCP 提供了有效流控制。当向发送者返回确认响应时,接收 TCP 进程就会说明它能接收并保证缓存不会发生溢出的最高序列号。 TCP 中的多路技术:大量同时发生的上层会话能在单个连接上时进行多路复用。 累死了,就这样吧~~! 这事太深了。。。 LZ之所以觉得不明白可能是看他们都有分包,交换等特点吧。。。。其实他们太不同,,都没法比。。
1采用面向连接的三次握手实现可靠对象传输。
2使用数据窗口机制协商队列大小实现数据队列传输。
3通过序列化应答和必要时重发数据包,TCP 为应用程序提供了可靠的传输流和虚拟连接服务。
下面是找到的长篇大论中比较好的文章:
一、TCP协议
1、TCP 通过以下方式提供可靠性:
◆ 应用程序分割为TCP认为最合适发送的数据块。由TCP传递给IP的信息单位叫做报文段。
◆ 当TCP发出一个报文段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能记时收到一个确认,它 就重发这个报文段。
◆ 当TCP收到发自TCP连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常延迟几分之一秒。
◆ TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化如果收到报文段的检验和有差错,TCP将丢弃这个报文段和不确认收到这个报文段。
◆ 既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能失序,因此TCP报文段的到达也可能失序。如果必要,TCP将对收到的数据进行排序,将收到的数据以正确的顺序交给应用层。
◆ 既然IP数据报会发生重复,TCP连接端必须丢弃重复的数据。
◆ TCP还能提供流量控制,TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机的缓冲区溢出。
另外,TCP对字节流的内容不作任何解释。
2、TCP首部:
TCP数据被封装在一个IP数据报中,格式如下:
IP首部20 TCP首部20 TCP首部
TCP首部格式如下:
16位源端口号 16位目的端口号
32位序号
32位确认序号
4位首部长度 保留6位 U
R
G A
C
K P
S
H R
S
T S
Y
N F
I
N 16位窗口大小
16位检验和 16位紧急指针
选项
数据
说明:
(1)每个TCP段都包括源端和目的端的端口号,用于寻找发送端和接收端的应用进程。这两个值加上IP首部的源端IP地址和目的端IP地址唯一确定一个TCP连接。
(2)序号用来标识从TCP发送端向接收端发送的数据字节流,它表示在这个报文段中的第一个数据字节。如果将字节流看作在两个应用程序间的单向流动,则TCP用序号对每个字节进行计数。
(3)当建立一个新连接时,SYN标志变1。序号字段包含由这个主机选择的该连接的初始序号ISN,该主机要发送数据的第一个字节的序号为这个ISN加1,因为SYN标志使用了一个序号。
(4)既然每个被传输的字节都被计数,确认序号包含发送确认的一端所期望收到的下一个序号。因此,确认序号应当时上次已成功收到数据字节序号加1。只有ACK标志为1时确认序号字段才有效。
(5)发送ACK无需任何代价,因为32位的确认序号字段和ACK标志一样,总是TCP首部的一部分。因此一旦一个连接建立起来,这个字段总是被设置,ACK标志也总是被设置为1。
(6)TCP为应用层提供全双工的服务。因此,连接的每一端必须保持每个方向上的传输数据序号。
(7)TCP可以表述为一个没有选择确认或否认的华东窗口协议。因此TCP首部中的确认序号表示发送方已成功收到字节,但还不包含确认序号所指的字节。当前还无法对数据流中选定的部分进行确认。
(8)首部长度需要设置,因为任选字段的长度是可变的。TCP首部最多60个字节。
(9)6个标志位中的多个可同时设置为1
◆ URG-紧急指针有效
◆ ACK-确认序号有效
◆ PSH-接收方应尽快将这个报文段交给应用层
◆ RST-重建连接
◆ SYN-同步序号用来发起一个连接
◆ FIN-发送端完成发送任务
(10)TCP的流量控制由连接的每一端通过声明的窗口大小来提供。窗口大小为字节数,起始于确认序号字段指明的值,这个值是接收端期望接收的字节数。窗口大小是一个16为的字段,因而窗口大小最大为65535字节。
(11)检验和覆盖整个TCP报文端:TCP首部和TCP数据。这是一个强制性的字段,一定是由发送端计算和存储,并由接收端进行验证。TCP检验和的计算和UDP首部检验和的计算一样,也使用伪首部。
(12)紧急指针是一个正的偏移量,黄蓉序号字段中的值相加表示紧急数据最后一个字节的序号。TCP的紧急方式是发送端向另一端发送紧急数据的一种方式。
(13)最常见的可选字段是最长报文大小MMS,每个连接方通常都在通信的第一个报文段中指明这个选项。它指明本端所能接收的最大长度的报文段。
二、TCP连接的建立和终止
1、建立连接协议
(1) 请求端发送一个SYN段指明客户打算连接的服务器的端口,隐疾初始序号(ISN),这个SYN报文段为报文段1。
(2) 服务器端发回包含服务器的初始序号的SYN报文段(报文段2)作为应答。同时将确认序号设置为客户的ISN加1以对客户的SYN报文段进行确认。一个SYN将占用一个序号。
(3) 客户必须将确认序号设置为服务器的ISN加1以对服务器的SYN报文段进行确认(报文段3)。
这3个报文段完成连接的建立,称为三次握手。发送第一个SYN的一端将执行主动打开,接收这个SYN并发回下一个SYN的另一端执行被动打开。
2、连接终止协议
由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
(1) TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送(报文段4)。
(2) 服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1(报文段5)。和SYN一样,一个FIN将占用一个序号。
(3) 服务器关闭客户端的连接,发送一个FIN给客户端(报文段6)。
(4) 客户段发回确认,并将确认序号设置为收到序号加1(报文段7)。
3、连接建立的超时
如果与服务器无法建立连接,客户端就会三次向服务器发送连接请求。在规定的时间内服务器未应答,则连接失败。
4、最大报文段长度MSS
最大报文段长度表示TCP传往另一端的最大块数据的长度。当一个连接建立时,连接的双方都要通告各自的MSS。
一般,如果没有分段发生,MSS还是越大越好。报文段越大允许每个报文段传送的数据越多,相对IP和TCP首部有更高的网络利用率。当TCP发送一个 SYN时,它能将MSS值设置为外出接口的MTU长度减去IP首部和TCP首部长度。对于以太网,MSS值可达1460。
如果目的地址为非本地的,MSS值通常默认为536,是否本地主要通过网络号区分。MSS让主机限制另一端发送数据报的长度,加上主机也能控制它发送数据报的长度,这将使以较小MTU连接到一个网络上的主机避免分段。
5、 TCP的半关闭
TCP提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力,这就是TCP的半关闭。
客户端发送FIN,另一端发送对这个FIN的ACK报文段。当收到半关闭的一端在完成它的数据传送后,才发送FIN关闭这个方向的连接,客户端再对这个FIN确认,这个连接才彻底关闭。
6、2MSL连接
TIME_WAIT状态也称为2MSL等待状态。每个TCP必须选择一个报文段最大生存时间(MSL)。它是任何报文段被丢弃前在网络的最长时间。
处理原则:当TCP执行一个主动关闭,并发回最后一个ACK,该连接必须在TIME_WAIT状态停留的时间为2MSL。这样可以让TCP再次发送最后的ACK以避免这个ACK丢失(另一端超时并重发最后的FIN)。这种2MSL等待的另一个结果是这个TCP连接在2MSL等待期间,定义这个连接的插口不能被使用。
7、平静时间
TCP在重启的MSL秒内不能建立任何连接,这就是平静时间。
8、FIN_WAIT_2状态
在FIN_WAIT_2状态我们已经发出了FIN,并且另一端也对它进行了确认。只有另一端的进程完成了这个关闭,我们这端才会从 FIN_WAIT_2状态进入TIME_WAIT状态。这意味着我们这端可能永远保持这个状态,另一端也将处于CLOSE_WAIT状态,并一直保持这个状态直到应用层决定进行关闭。
9、复位报文段
TCP首部的RST位是用于复位的。一般,无论合适一个报文端发往相关的连接出现错误,TCP都会发出一个复位报文段。主要情况:
(1)到不存在的端口的连接请求;
(2)异常终止一个连接。
10、同时打开
为了处理同时打开,对于同时打开它仅建立一条连接而不是两条连接。两端几乎在同时发送SYN,并进入SYN_SENT状态。当每一端收到SYN时,状态变为SYN_RCVD,同时他们都再发SYN并对收到的SYN进行确认。当双方都收到SYN及相应的ACK时,状态都变为ESTABLISHED。一个同时打开的连接需要交换4个报文段,比正常的三次握手多了一次。
11、 同时关闭
当应用层发出关闭命令,两端均从ESTABLISHED变为FIN_WAIT_1。这将导致双方各发送一个FIN,两个FIN经过网络传送后分别到达另一端。收到FIN后,状态由FIN_WAIT_1变为CLOSING,并发送最后的ACK。当收到最后的ACK,状态变为TIME_WAIT。同时关闭和正常关闭的段减缓数目相同。
12、TCP选项
每个选项的开始是1字节的kind字段,说明选项的类型。
Kind=1:选项表结束(1字节) Kind=1:无 *** 作(1字节) Kind=2:最大报文段长度(4字节) Kind=3:窗口扩大因子(4字节) Kind=8:时间戳(10字节)
三、TCP的超时和重传
对于每个TCP连接,TCP管理4个不同的定时器。
(1) 重传定时器用于当希望收到另一端的确认。
(2) 坚持定时器使窗口大小信息保持不断流动,即使另一端关闭了其接收窗口。
(3) 保活定时器可检测到一个空闲连接的另一端何时崩溃或重启。
(4) 2MSL定时器测量一个连接处于TIME_WAIT状态的时间。
1、往返时间测量
TCP超时和重传重最重要的就是对一个给定连接的往返时间(RTT)的测量。由于路由器和网络流量均会变化,因此TCP应该跟踪这些变化并相应地改变超时时间。首先TCP必须测量在发送一个带有特别序号地字节和接收到包含该字节地确认之间的RTT。
2、拥塞避免算法
该算法假定由于分组收到损坏引起的丢失是非常少的,因此分组丢失就意味着在源主机和目的主机之间的某处网络上发生了阻塞。有两种分组丢失的指示:发生超时和收到重复的确认。拥塞避免算法需要对每个连接维持两个变量:一个拥塞窗口cwnd和一个慢启动门限ssthresh。
(1) 对一个给定的连接,初始化cwnd为1个报文段,ssthresh为65535个字节。
(2) TCP输出例程的输出不能超过cwnd和接收方通告窗口的大小。拥塞避免是发送方使用的流量控制。前者是发送方感受到的网络拥塞的估计,而后者则与接收方在该连接上的可用缓存大小有关。
(3) 当拥塞发生时,ssthresh被设置为当前窗口大小的一般(cwnd和接收方通告窗口大小的最小值,但最小为2个报文段)。此外,如果是超时引起了拥塞,则cwnd被设置为1个报文段。
(4) 当新的数据被对方确认时,就增加cwnd,但增加的方法依赖与是否正在进行慢启动或拥塞避免。如果cwnd小于或等于ssthresh,则正在进行慢启动,否则正在进行拥塞避免。
3、快速重传和快速恢复算法
如果我们一连串收到3个或以上的重复ACK,就非常可能是一个报文段丢失了。于是我们就重传丢失的数据报文段,而无需等待超时定时器溢出。
(1) 当收到第3个重复的ACK时,将ssthresh设置为当前拥塞窗口cwnd的一半,重传丢失的报文段,设置cwnd为ssthresh加上3倍的报文段大小。
(2) 每次收到另一个重复的ACK时,cwnd增加1个报文段大小并发送一个1个分组,如果允许的话。
(3)当下一个确认新数据的ACK到达时,设置cwnd为ssthresh,这个ACK应该时在进行重传后的一个往返时间内对步骤1重重传的确认。另外,这个 ACK也应该是对丢失的分组和收到的第一个重复的ACK之间的所有中间报文段的确认。
4、 ICMP差错
TCP如何处理一个给定的连接返回的ICMP差错。TCP能够遇到的最常见的ICMP差错就是源站抑制、主机不可达和网络不可达。
(1) 一个接收到的源站抑制引起拥塞窗口cwnd被置为1个报文段大小来发起慢启动,但是慢启动门限ssthresh没有变化,所以窗口将打开直到它开放了所有的通路或者发生了拥塞。
(2) 一个接收到的主机不可达或网络不可达实际都被忽略,因为这两个差错都被认为是短暂现象。TCP试图发送引起该差错的数据,尽管最终有可能会超时。
5、重新分组:
当TCP超时并重传时,它并不一定要重传同样的报文段,相反,TCP允许进行重新分组而发送一个较大的报文段。这是允许的,因为TCP是使用字节序号而不是报文段序号来进行识别它所要发送的数据和进行确认。
四、TCP的坚持定时器
ACK的传输并不可靠,也就是说,TCP不对ACK报文段进行确认,TCP只确认那些包含数据的ACK报文段。为了防止因为ACK报文段丢失而双方进行等待的问题,发送方用一个坚持定时器来周期性地向接收方查询。这些从发送方发出地报文段称为窗口探查。
五、TCP的保活定时器
如果一个给定的连接在2小时内没有任何动作,那么服务器就向客户发送一个探查报文段。客户主机必须处于以下4个状态之一。
(1) 客户主机依然正常运行,并从服务器可达。客户的TCP响应正常,而服务器也知道对方的正常工作的。服务器在2小时内将保活定时器复位。
(2) 客户主机已经崩溃,并且关闭或者正在重新启动。在任何一种情况下,客户的TCP都没有响应。服务器将不能收到对探查的响应,并在75秒后超时。总共发送10个探查,间隔75秒。
(3) 客户主机崩溃并已经重新启动。这是服务器将收到一个对其保活探查的响应,但这个响应是一个复位,使得服务器终止这个连接。
(4) 客户主机正常运行,但是从服务器不可达。
六、TCP的一些性能
1、 路径MTU发现:
TCP的路径MTU发现按如下方式进行:在连接建立时,TCP使用输出接口或对段声明的MSS中的最下MTU作为其实的报文段大小。路径MTU发现不允许TCP超过对端声明的MSS。如果对端没有指定一个MSS,则默认为536。
一旦选定了起始的报文段大小,在该连接上的所有被TCP发送的IP数据报都将被设置DF位。如果中间路由器需要对一个设置了DF标志的数据报进行分片,它就丢弃这个数据报,并产生一个ICMP的“不能分片”差错。
如果收到这个ICMP差错,TCP就减少段大小并进行重传。如果路由器产生的是一个较新的该类ICMP差错,则报文段大小被设置位下一跳的MTU减去 IP和TCP的首部长度。如果是一个较旧的该类ICMP差错,则必须尝试下一个可能的最小MTU。
2、 长肥管道
一个连接的容量=带宽X时延(RTT)。具有大的带宽时延乘积的网络称为长肥网络(LFN)。一个运行在LFN的TCP连接称为长肥管道。管道可以被水平拉长(一个长的RTT),或被垂直拉高(较高的带宽),或两个方向拉伸。
3、窗口扩大选项:
窗口扩大选项使TCP的窗口定义从16位增加到32位,这并不是通过修改TCP首部来实现的,TCP首部仍然使用16位,而是通过定义一个选项实现对16位的扩大 *** 作来完成的。
4、时间戳选项:
时间戳选项使发送方在每个报文段中放置一个时间戳值。接收方在确认中返回这个数值,从而允许发送方为每一个收到的ACK计算RTT。
以上就是关于TCP协议的通讯过程全部的内容,包括:TCP协议的通讯过程、什么是ATD和ATM,它们之间的区别呢、用tcp完成SOAP数据传输应该怎么实现等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)