11、TCP:传输控制协议

来源:互联网 发布:120首网络音乐产品 编辑:程序博客网 时间:2024/06/01 09:33

TCP服务

TCP和UDP使用相同的网路层(IP),TCP提供一种面向连接的、可靠的字节流服务。
面向连接意味着仅有两方进行彼此通信。广播和多播不能用于TCP。
TCP的可靠性主要表现在以下几个方面:
(1)分割:应用数据被分割成TCP认为最合适发送的数据块。
(2)超时重传:发出一个段后会启动一个定时器,等待目的端确认收到这个报文段。不能及时收到确认就会重传。
(3)接收端的确认不是立刻发送,而是延迟发送。
(4)TCP保持它首部和数据的检验和。如果接收端收到的检验和有差错将丢弃。
(5)TCP报文段到达可能会失序。TCP将对收到的数据重新排序。
(6)IP数据报还可能发生数据重复,所以TCP接收到端必须丢弃重复数据。
(7)TCP还提供流量控制,每一段有固定的缓冲大小。TCP只允许发送缓冲区可以接受的大小。

TCP首部

在IP数据报中的封装格式
这里写图片描述
TCP首部格式
这里写图片描述
源端口号和目的端口号加上IP头中的源IP地址和目的IP地址唯一确定互联网络中的每个TCP连接的双方。
序号标识从TCP发送端向TCP接收端发送的数据字节流,它表示报文段中的第一个数据字节。
TCP中的6个标志比特
这里写图片描述
流量控制就通过16位的窗口大小来提供。所以最大是65535个字节。
只有当URG置1的时候紧急指针才有效。
MSS是最常见的可选字段,它指明本段所能接收的最大长度的报文段。

TCP的连接的建立与终止

TCP状态变迁图
这里写图片描述

TCP正常连接和终止对应的状态
这里写图片描述

2MSL等待状态

TIME_WAIT状态也称为2MSL等待状态。 每个具体TCP实现必须选择一个报文段最大生存时间MSL。它是任何报文段被丢在前在网络内的最长时间。当TCP执行一个主动关闭,并发挥最后一个ACK,该连接必须在TIME_WAIT状态停留2倍MSL。这样可以让TCP再次发送最后一个ACK以防止这个ACK丢失。
在这2MSL等待的结果是这个接口在这2MSL等待时间内不能被使用,任何迟到的报文段都将被丢弃。

FIN_WAIT_2

FIN_WAIT_2状态表面我们已经发出了FIN,并且另一端也对它进行确认。

RST复位报文段

无论何时一个报文段发往基准的连接出现错误,TCP都会发出一个复位报文段。(基准的连接就是指sock两端的接口)

到一个不存在的端口的连接请求

复位报文段中的序号被置为1,确认序号被智威进入ISN加上数据字节数。

异常终止一个连接

优点
(1)丢弃任何待发数据并立即发送复位报文段
(2)RST的接收方会区分另一端执行的是异常关闭还是正常关闭

检测半打开连接

如果一方已经关闭或异常终止连接而另一方确还不知道这就是半打开。

同时打开

这里写图片描述
同时打开需要交换4个报文段比正常的三次握手多一个,而且要注意没有一端称为服务器或者客户。

同时关闭

这里写图片描述

TCP选项

选项格式
这里写图片描述
每个选项开始是1个字节的kind字段说明选项的类型。len字段说明总长度

TCP端口

TCP使用由本地地址和远端地址组成的4元组:目的I P地址、目的端口号、源IP地址和源端口号来处理传入的多个连接请求。TCP仅通过目的端口号无法确定那个进程接收了一个连接请求。另外,在三个使用端口23的进程中,只有处于LISIEN的进程能够接收新的连接请求。处于ESTABLISHED的进程将不能接收SYN报文段,而处于LISTEN的进程将不能接收数据报文段。

呼入连接请求队列

一个并发服务器调用一个新的进程来处理每一个客户请求,因此处于被动连接请求的服务器应该始终准备处理下一个呼入的连接请求。当到达多个连接请求的时候,TCP实现采用以下规则:
(1)正等待连接请求的一段有一个固定长度的队列,该队列的连接已被TCP接收(完成了三次握手),但没有被应用层接收。
(2)应用层指明该对列的最大长度,这个值称为积压值。(0~5)
(3)当一个连接请求达到时,TCP使用一个算法,根据当前连接队列的连接数来确定是否接收这个连接。积压值说明的是TCP监听的端点已被TCP接收而等待应用层接收的最大连接数。
(4)如果对于新的连接请求,该TCP监听的端点的连接队列还空间则连接。
(5)如果对于新的连接但是没有空间,TCP将不受理SYN。客户端的主动打开最终将超时。

TCP的交互数据流

交互式输入

这里写图片描述

经受时延的确认

通常TCP在接收到数据时并不立刻发送ACK;相反它推迟发送,以便将ACK与需要沿该放下发送的数据一起发送(数据捎带ACK)。

Nagle算法

在广域网上,这些小分组会增加拥塞出现的可能。
该算法要求一个TCP连接上最多只能有一个未被确认的未完成的小分组,在该分组的确认到达之前不能发送其他小分组。

TCP成块数据流

滑动窗口协议是一种流量控制的方法。该协议允许发送方停止并等待确认前可以发送多个分组。

滑动窗口

这里写图片描述
窗口边沿运动的描述
(1)窗口左边沿向右边沿靠近为窗口合拢。发生在数据被发送和确认时。
(2)当窗口右边沿向右移动时将允许发送更多的数据,我们称之为窗口张开。发生在另一端的接收进程已经读取已经确认的数据并释放了TCP接收缓存。
(3)右边沿向左移动时,我们称之为窗口收缩。
这里写图片描述

PUSH 标志

当客户发送一个命令给服务器时,它设置PUSH标志并停下来等待服务器响应。通过允许客户应用程序通知其TCP设置PUSH标志,客户进程通知TCP在向服务器发送一个报文段是不要因等待额外数据而使已提交数据在缓存中滞留。当服务器TCP接收到一个设置了PUSH标志的报文段时,它需要立刻将这些数据递交给服务器进程而不能等待判断是否还有额外的数据到达。
发送端 : TCP将数据包置上PUSH标志时,表示这个数据应该被立即发送,而不要等待额外的数据。
接收端 : 接收端接受到带有PUSH标志的数据时,应该接接受缓存中收到的所有数据(包含当前带PUSH标示的数据包)应该立即提交到应用层。
TCP依据当前将要被发送的包是不是发送缓存中最后一个未被发送的包,如果是那么这个包将被标志PUSH,所以我们经常发现在文件的传输开始或末尾一般都会有带PUSH标志的数据包,尤其FIN包

慢启动

TCP支持一种称为“慢启动”的算法。该算法通过观察到新分组进入网络的速率应该与另一端返回确认的速度相同而进行工作。
慢启动为发送方的TCP增加了一个窗口:拥塞窗口,记为cwnd。当与另一个网络的主机建立TCP连接的时候,拥塞窗口被初始化为1个报文段。每收到一个ACK,拥塞窗口就增加一个报文段。发送方取拥塞窗口和通告窗口的最小值作为发送上限。
拥塞是发送发的流量控制,而通告窗口是接收方的流量控制。

吞吐量

通常发送一个分组的时间取决于两个因素:传播时延(由光的有限速率、传输设备的等待时间等引起)和一个取决于媒体速率(即媒体每秒可传输的比特数)的发送时延。对于一个给定的两个接点之间的通路,传播时延一般是固定的,而发送时延则取决于分组的大小。在速率较慢的情况下发送时延起主要作用,而在千兆比特速率下传播时延则占主要地位。
不管有多少报文段填充了这个管道,返回路径上总是具有相同数目的A C K。这就是连接的理想稳定状态。

带宽时延积

通常来描述通道的容量
capacity (bit) = bandwidth (b/s) × round-trip time (s)
带宽与RTT的乘积。

TCP超时与重传

TCP通过在发送时设置一个定时器来解决这个问题,如果当定时器时还没收到确认,它就重传该数据。关键就是关于超时和重传的策略,怎样决定超时间隔和如何确定重传频率。
对于每个连接,TCP管理4个不同的定时器。
(1)重传定时器使用与当希望收到另一端的确认。
(2)坚持定时器使窗口大小信息保持不断流动,及时另一端关闭了其接收窗口。
(3)保活定时器可检测到一个空间连接的另一端如何崩溃或重启。
(4)2MSL定时器测量一个连接处于TIME_WAIT状态的时间。

RTT的测量

最初使用的是低通过滤器来更新一个被平滑的RTT估计器。这里写图片描述这里的α是一个推荐值为0.9的平滑因子。R是前一个估计,M取自新的测量。
现在RFC 793中推荐的时间这里写图片描述β是一个推荐值为2的时延离散因子。

Karn算法

当超时发生时,RTO正在进行退避,分组以一个更长的RTO进行重传,然后收到一个确认。那么这个ACK是针对第一个分组还是第二个分组。出现了重传多义性。
规定,当一个超时和重传发生时,在重传数据的确认最后到达之前,不能更新RTT,因为并不知道ACK对应哪次传输。

拥塞避免算法

该算法假定由于分组收到损坏引起的丢失是非常少的,因此分组丢失就以为着在源主机和目的主机之间的某处网络上发生了拥塞。
在实际中这两个算法通常在一起实现。
拥塞避免算法和慢启动算法需要对每个连接维持两个变量:一个拥塞窗口 cwnd和一个慢启动门限ssthresh。这样得到的算法的工作过程如下:
(1)对于给定的连接,初始化cwnd为1个报文段,ssthresh为65535个字节。
(2)TCP输出例程的输出不能超过cwnd和接收方通告窗口的大小。拥塞避免是发送方使用的流量控制,而通告窗口则是接收方进行的流量控制。
(3)当拥塞发生时,ssthresh被设置为当前窗口的一半(cwnd和接收方通告窗口大小的最小值,最少2个报文段)。如果超时引起了拥塞则cwnd设置为1个报文段。(这就是慢启动)
(4)当新的数据被对方确认时,就增加cwnd,但增加的方法依赖于我们是否正在进行慢启动或拥塞避免。如果cwnd小于或等于ssthresh,则正在进行慢启动,否则正在进行拥塞避免。慢启动一直次序到我们回到当拥塞发送时所处位置的半时候才停止,然后转为执行拥塞避免。
慢启动算法cwnd窗口为按指数方式增长。拥塞避免算法在往返时间内最多为cwnd增加1个报文段。
这里写图片描述

快速重传与快速恢复算法

(1)当收到第三个重复的ACK时将ssthresh设置为当前拥塞窗口cwnd的一半。重传丢失的报文段。设置cwnd为ssthresh加上3倍的报文段大小。
2) 每次收到另一个重复的ACK时, cwnd增加1个报文段大小并发送1个分组(如果新的cwnd允许发送)。
3) 当下一个确认新数据的ACK到达时,设置cwnd为ssthresh(在第1步中设置的值)。这个ACK应该是在进行重传后的一个往返时间内对步骤1中重传的确认。另外,这个ACK也应该是对丢失的分组和收到的第1个重复的ACK之间的所有中间报文段的确认。这一步采用的是拥塞避免,因为当分组丢失时我们将当前的速率减半。

原创粉丝点击