TCP 协议详解的补充内容

9 篇文章 0 订阅
一、 TCP 协议

    1、 TCP 通过以下方式提供可靠性:

    ◆ (1)应用程序分割为 TCP 认为最合适发送的数据块。由 TCP 传递给 IP 的信息单位叫做报文段

    ◆ (2)当 TCP 发出一个报文段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能记时收到一个确认,它就重发这个报文段。

    ◆ (3)当 TCP 收到发自 TCP 连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常延迟几分之一秒。

    ◆ (4) TCP 将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化如果收到报文段的检验和有差错, TCP 将丢弃这个报文段和不确认收到这个报文段。

    ◆ (5)既然 TCP 报文段作为 IP 数据报来传输,而 IP 数据报的到达可能失序,因此 TCP 报文段的到达也可能失序。如果必要, TCP 将对收到的数据进行排序,将收到的数据以正确的顺序交给应用层。

    ◆ (6)既然 IP 数据报会发生重复, TCP 连接端必须丢弃重复的数据。

    ◆ (7) 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 的一些性能

    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 。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值