计算机网络学习-运输层-2

Scroll Down

3.5 面向连接的运输:TCP

3.5.1 TCP连接

image.png

3.5.2 TCP报文段结构

image.png

  • 源端口号和目的端口号
  • 32比特的序号字段(sequence number field )和32比特的确认号字段(acknowledgment number field)这些字段被TCP发送方和接收方用来实现可靠数据传输服务
  • 16比特的接收窗口字段(receive window field),该字段用于流量控制。我们很快就会看到,该字段用于指示接收方愿意接受的字节数量。
  • 4比特的首部长度字段(header length field),该字段指示了以32比特的字为单位的TCP首部长度。由于TCP选项字段的原因,TCP首部的长度是可变的。(通常,
    选项字段为空,所以TCP首部的典型长度是20字节。)
  • 可选与变长的选项字段(options field),该字段用于发送方与接收方协商最大报文段长度(MSS)时,或在高速网络环境下用作窗口调节因子时使用。首部字段中 还定义了一个时间戳选项
  • 6比特的标志字段(flag field) o ACK比特用于指示确认字段中的值是有效的,即 该报文段包括一个对已被成功接收报文段的确认。RST、SYN和FIN比特用于连 接建立和拆除

1. 序号和确认号

TCP把数据看成一个无结构的、有序的字节流,
image.png
确认号就是主机正在等待的数据的下一个字节序号。

若TCP接收到失序分组,处理办法包括:
①接收方立即丢弃失序报文段(如前所述,这可以简化接收方的设
计);②接收方保留失序的字节,并等待缺少的字节以填补该间隔

image.png

3.5.3 往返时间的估计与超时

1. 估计往返时间

image.png
image.png

2. 设置和管理重传超时间隔

image.png
TCP也是用流水线使得发送方在任意时刻都可以有多个已发出但还未被确认的报
文段存在

3.5.4 可靠数据传输

IP不保证数据报的交付,不保证数据报的按序交付,也不保证数据报中数据的完整性

image.png

image.png

对TCP提岀的一种修改意见是所谓的选择确认(selective acknowledgment) [ RFC2018],它允许TCP接收方有选择地确认失序报文段,而不是累积地确认最后一个正确接收的有序报文段

3.5.5 流量控制

TCP为它的应用程序提供了流量控制服务(flowcontrol service)以消除发送方使接收方缓存溢出的可能性。流量控制因此是一个速度匹配服务,即发送方的发送速率与接收方应用程序的读取速率相匹配。

TCP通过让发送方维护一个称为接收窗口( receive window)的变量来提供流量控制。通俗地说,接收窗口用于给发送方一个指示——该接收方还有多少可用的缓存空间。因为TCP是全双工通信,在连接两端的发送方都各自维护一个接收窗口。

  • LastByteRead:主机B上的应用进程从缓存读出的数据流的最后一个字节的编号。
  • LastByteRcvd:从网络中到达的并且已放入主机B接收缓存中的数据流的最后一个 字节的编号

对接收方主机满足条件: LastByteRcvd - LastByteRead RcvBuffer
image.png

对发送方主机满足条件: image.png

3.5.3 TCP连接管理

TCP三步握手建立连接:

  • 第一步:客户端的TCP首先向服务器端的TCP发送一个特殊的TCP报文段。该报 文段中不包含应用层数据。但是在报文段的首部(参见图3-29)中的一个标志位 (即SYN比特)被置为1。因此,这个特殊报文段被称为SYN报文段。另外,客 户会随机地选择一个初始序号(client_isn),并将此编号放置于该起始的TCP SYN 报文段的序号字段中。该报文段会被封装在一个IP数据报中,并发送给服务器。 为了避免某些安全性攻击,在适当地随机化选择client_isn方面有着不少有趣的研究[CERT 2001-09]。
  • 第二步:一旦包含TCP SYN报文段的IP数据报到达服务器主机(假定它的确到达),服务器会从该数据报中提取出TCP SYN报文段,为该TCP连接分配TCP缓存和变量,并向该客户TCP发送允许连接的报文段。在报文段 的首部却包含3个重要的信息。首先,SYN比特被置为1。其次,该TCP报文段 首部的确认号字段被置为client_isn + 1 o最后,服务器选择自己的初始序号 (serverjsn),允许连接的报文段被称为SYNACK报文段
  • 第三步:在收到SYNACK报文段后,客户也要给该连接分配缓存和变量。客户主
    机则向服务器发送另外一个报文段;这最后一个报文段对服务器的允许连接的报 文段进行了确认(该客户通过将值server_isn + 1放置到TCP报文段首部的确认字段中来完成此项工作)。因为连接已经建立了,所以该SYN比特被置为0。
    image.png

TCP连接结束:
image.png

TCP连接状态:
image.png

SYN洪范攻击: TCP服务器响应一个收到的SYN,分配并初始化连接变量和缓存。然后服务器发送一个SYNACK进行响应,并等待来自客户的ACK报文段。如果某客户不发送ACK来完成该三次握手的第三步,最终(通常在一分多钟之后)服务器将终止该半开连接并回收资源,若攻击者发送大量的TCP SYN报文段,而不完成第三次握手的步骤。随着这种SYN报文段纷至沓来,服务器不断为这些半开连接分配资源,导致服务器的连接资源被消耗殆尽,通过SYN cookie来解决该问题:

  • 当服务器接收到一个SYN报文段此服务器不会为该报文段生成一个半
    开连接。相反,服务器生成一个初始TCP序列号,该序列号是SYN报文段的源
    和目的IP地址与端口号以及仅有该服务器知道的秘密数的一个复杂函数,被称为cookie,服务器发送具有这种特殊初始序列号的SYNACK分组。重要的是,服务器并不记忆该cookie或任何对应于SYN的其他状态信息。
  • 如果客户是合法的,则它将返回一个ACK报文段。当服务器收到该ACK,需要
    验证该ACK是与前面发送的某些SYN相对应的。服务器则将使用在SYNACK报文段中的源和目的地IP地址与端口号(它们与初始的SYN中的相同)以及秘密数运行相同的散列函数。如果该函数的结果加1与在客户的SYNACK中的确认(cookie)值相同的话,服务器认为该ACK对应于较早的SYN报文段,因此它是合法的。服务器则生成一个具有套接字的全开的连接。
  • 如果没有返回回一个ACK报文段,则初始的SYN并没有对服务器产生危害,因为服务器没有为它分配任何资源。

image.png

如果一台主机接收到一个TCP报文段,其端口号或源IP地址与 该主机上进行中的套接字都不匹配的情况,该主机将向源发送一个特殊重置报文段。该TCP报文段将RST标志置为1,如果UDP端口不匹配该主机回发送一个ICMP报文,可以用nmap来扫描tcp对应端口,nmap将对那台主机的目的端口 6789发送一个特殊的TCP SYN报文段:

  • 源主机从目标主机接收到一个TCP SYNACK报文段。因为这意味着在目标主机上 一个应用程序使用TCP端口 6789运行,nmap返回“打开
  • 源主机从目标主机接收到一个TCP RST报文段。这意味着该SYN报文段到达了目 标主机,但目标主机没有运行一个使用TCP端口 6789的应用程序
  • 源什么也没有收到。这很可能表明该SYN报文段被中间的防火墙所阻挡

3.6 拥塞控制原理

3.6.1 拥塞原因和代价

image.png

3.6.2 拥塞控制方法

  1. 端到端拥塞控: IP层不会向端系统提供有关网络拥塞的反馈信息。TCP报文段
    的丢失(通过超时或3次冗余确认而得知)被认为是网络拥塞的一个迹象,TCP
    会相应地减小其窗口长度
  2. 网络辅助的拥塞控制: 路由器向发送方提供关于网络中拥塞状态的显式反馈信息

3.7 TCP拥塞控制

TCP所采用的方法是让每一个发送方根据所感知到的网络拥塞程度来限制其能向 连接发送流量的速率。如果一个TCP发送方感知从它到目的地之间的路径上没什么拥 塞,则TCP发送方增加其发送速率;如果发送方感知沿着该路径有拥塞,则发送方就 会降低其发送速率。

image.png
要么超时或收到3个冗余ACK,发送方就认为在发 送方到接收方的路径上出现了拥塞的指示。

TCP如何控制应该发送的速率原则:

  • 一个丢失的报文段表意味着拥塞,因此当丢失报文段时应当降低TCP发送方的 速率
  • 一个确认报文段指示该网络正在向接收方交付发送方的报文段,因此,当对先前 未确认报文段的确认到达时,能够增加发送方的速率
  • 带宽探测。给定ACK指示源到目的地路径无拥塞,而丢包事件指示路径拥 塞,TCP调节其传输速率的策略是增加其速率以响应到达的ACK,除非岀现丢包事件,此时才减小传输速率

TCP拥塞控制算法

  1. 慢启动: 当一条TCP连接开始时,cwnd的值通常初始置为一个MSS的较小值,在慢启动(slow-start)状态,cwnd的值以1个MSS开始并且每当传输的报文段首次被确认就增加1个MSS,慢启动阶段指数增长
    image.png

  2. 拥塞避免
    TCP无法每过一个RTT再将cwnd的值翻番,而是采用了一种较为 保守的方法,每个RTT只将cwnd的值增加一个MSS来避免拥塞。

一种通用的方法是对于TCP发送方无论何时到达一个新的确认,就将cwnd增加一个 MSS ( MSS/cwnd)字节。当出现超时时,TCP的拥塞避免算法行为相同。与慢启动的情况一样,cwnd的值被设置为1个MSS,当丢包事件出现时,ssthresh的值被更新为cwnd值的一半。TCP将cwnd的值减半(为使测量结果更好,计及已收到的3个冗余的ACK要加上3个MSS),并且当收到3个冗余的ACK,将ssthresh的值记录为cwnd的值的一半。接下来进入快速恢复状态。

  1. 快速恢复
    对于引起TCP进入快速恢复状态的缺失报文段,对收到的每个冗余的ACK, cwnd的值增加一个MSS,当对丢失报文段的一个ACK到达时,TCP在降低cwnd后进入拥塞避免状态。如果出现超时事件,快速恢复在执行如同在慢启动和拥塞避免中相同的动作后,迁移到慢启动状态:当丢包事件出现时,cwnd的值被设置为1个 MSS,并且ssthresh的值设置为cwnd值的一半。

image.png

  1. TCP拥塞控制:回顾
    TCP的拥塞控制是:每个RTT内cwnd线性(加性)增加1MSS,然后岀现3个冗余
    ACK事件时cwnd减半(乘性减)。因此,TCP拥塞控制常常被称为加性增、乘性减拥塞控制方式。image.png

  2. 对TCP吞吐量的宏观描述
    当窗口长度是垃字节,且当 前往返时间是R1T秒时:
    image.png

3.7.1 公平性

3.7.2 明确拥塞通告:网络辅助拥塞控制

对于IP和TCP的扩展方案[RFC 3168]已经提出并已经实现和部署,该方案允许网络明确向TCP发送方和接收方发出拥塞信号。这种形式的网络辅助拥塞控制称为明确拥塞通告,路由器所使用的一种ECN比特设置指示该路由器正在历经拥塞。
image.png
当接收主机中的TCP通过一个接收到的数据报收到了一个ECN拥塞指示时,接收主机中的TCP通过在接收方到发送方的TCP ACK报文段中设置ECE (明确拥塞通告回显)比特(参见图3-29),通知发送主机中的TCP收到拥塞指示。接下来,TCP发送方通过减半拥塞窗口对一个具有ECE拥塞指示的ACK做出反应,就像它对丢失报文段使用快速重传做出反应一样,并且在下一个传输的TCP发送方到接收方的报文段首部中对CWR (拥塞窗口缩减)比特进行设置。