• 主页
  • 相册
  • 随笔
  • 目录
  • 存档
Total 244
Search AboutMe

  • 主页
  • 相册
  • 随笔
  • 目录
  • 存档

tcp-ip协议

2020-08-17

1. 概述

协议族

T C P / I P协议族是一组不同的协 议组合在一起构成的协议族。尽管通常称该协议族为 T C P / I P,但T C P和I P只是其中的两种协议而已

1.1. 端系统和中间系统

端系统( End system)(两边的两台主机)和中间系统(Intermediate system)(中间的路由器)。应用层和运输层使用端到端(En d - t o - e n d)协议。在 图中,只有端系统需要这两层协议。但是,网络层提供的却是逐跳( Ho p - b y - h o p)协议,两 个端系统和每个中间系统都要使用它

一个路由器具有两个或多个网络接口层(因为它连接了两个或多个网络)


一个主机也可以有多个接口, 但一般不称作路由器 , 除非它的功能只是单纯地把分组从一个接口传送到另一个接口。同样, 路由器并不一定指那种在互联网中用来转发分组的特殊硬件盒。大多数的 T C P / I P实现也允许 一个多接口主机来担当路由器的功能,但是主机为此必须进行特殊的配置。在这种情况下, 我们既可以称该系统为主机(当它运行某一应用程序时,如 F T P或Te l n e t),也可以称之为路 由器(当它把分组从一个网络转发到另一个网络时)。在不同的场合下使用不同的术语

互联网的目的之一是在应用程序中隐藏所有的物理细节

  • 路由器
    • 在网络层上对网络进行互连
  • 网桥
    • 在链路层上对网络进行互连
    • 这样对上层来说就 好像是一个局域网

1.2. TCP/IP的分层

  • 尽管I C M P主要被I P使用,但应用程序也有可能访问它。我 们将分析两个流行的诊断工具,P i n g和Tr a c e r o u t e
  • I G M P是I n t e r n e t组管理协议。它用来把一个U D P数据报多播到多个主机
  • A R P(地址解析协议)和R A R P(逆地址解析协议)是某些网络接口(如以太网和令牌环 网)使用的特殊协议,用来转换 I P层和网络接口层使用的地址

1.3. 封装

  • T C P传给I P的数据单元称作 T C P报文段或简称为T C P段(T C P s e g m e n t)。
    • U D P数据与T C P数据基本一致。唯一的不同是 U D P传给I P的信息单元称作 U D P数据报
      (UDP datagram),而且U D P的首部长为8字节
  • I P传给网络接口层的数据单元称作I P数据报(IP datagram)。
  • 通过以太网传输的比特 流称作帧(Fr a m e )
    • 以太网数据帧的物理特性是其长度必须在 4 6~1 5 0 0字节之间

1.4. 分用(Demultiplexing)

当目的主机收到一个以太网数据帧时,数据就开始从协议栈中由底向上升,同时去掉各层协议加上的报文首部。每层协议盒都要去检查报文首部中的协议标识,以确定接收数据的上层协议

1.5. 端口号

任何TCP/IP实现所提供的服务都用知名的1~1023之间的端口号。这些知名端口号由Internet号分配机构(Internet Assigned Numbers Authority, IANA)来管理

1.6. 应用编程接口

  • socket
  • TLI(运输层接口)

2. 链路层

2.1. 作用

  • 为IP模块发送和接收IP数据报;
  • 为ARP模块发送ARP请求和接收ARP应答;
  • 为RARP发送RARP请求和接收RARP应答。TCP/IP支持多种不同的链路层协议,这取决于网络所使用的硬件

2.2. 封装

  • RFC 894: 以太网封装
  • RFC 1042: IEEE 802

最常使用的封装格式是RFC 894定义的格式

2.3. 回环接口

大多数的产品都支持环回接口(Loopback Interface,以允许运行在同一台主机上的客户程序和服务器程序通过TCP/IP进行通信。A类网络号127就是为环回接口预留的。根据惯例,大多数系统把IP地址127.0.0.1分配给这个接口,并命名为localhost。一个传给环回接口的IP数据报不能在任何网络上出现

回环接口处理IP数据的过程

看上去用传输层和IP层的方法来处理环回数据似乎效率不高,但它简化了设计,因为环
回接口可以被看作是网络层下面的另一个链路层。网络层把一份数据报传送给环回接口,就像传给其他链路层一样,只不过环回接口把它返回到IP的输入队列中

2.4. 最大传输单元MTU

  • 以太网:1500
  • 802.3:1492

在同一个网络上的两台主机互相进行通信时,该网络的MTU是非常重要的。但是如果两台主机之间的通信要通过多个网络,那么每个网络的链路层就可能有不同的MTU。重要的不是两台主机所在网络的MTU的值,重要的是两台通信主机路径中的最小MTU。它被称作路径MTU


  • 两台主机之间的路径MTU不一定是个常数
  • 选路不一定对称
    • 从A到B的路由可能与从B到A的路由不同

3. IP:网际协议

3.1. 特性

  • 不可靠(unreliable)
    • IP不能保证IP数据报能成功地到达目的地。IP仅提供最好的传输服务。如果发生某种错误时,如某个路由器暂时用完了缓冲区,IP有一个简单的错误处理算法:丢弃该数据报,然后发送ICMP消息报给信源端。任何要求的可靠性必须由上层来提供(如TCP)
  • 无连接(connectionless)
    • IP并不维护任何关于后续数据报的状态信息。每个数据报的处理是相互独立的。这也说明,IP数据报可以不按发送顺序接收。如果一信源向相同的信宿发送两个连续的数据报(先是A,然后是B),每个数据报都是独立地进行路由选择,可能选择不同的路线,因此B可能在A到达之前先到达

3.2. IP首部

普通的IP首部长为20个字节,除非含有选项字段

  • 个字节的32 bit值以下面的次序传输:首先是0~7 bit,其次8~15 bit,然后1 6~23 bit,最后是24~31 bit。这种传输次序称作big endian字节序
  • 服务类型(TOS)字段包括一个3 bit的优先权子字段(现在已被忽略),4 bit的TOS子字段和1 bit未用位但必须置0。4 bit的TOS分别代表:
    • 最小时延
    • 最大吞吐量
    • 最高可靠性
    • 最小费用
  • 总长度字段是IP首部中必要的内容,因为一些数据链路(如以太网)需要填充一些数据以达到最小长度
  • T T L(t i m e - t o - l i v e)生存时间字段设置了数据报可以经过的最多路由器数。它指定了数据报的生存时间
    • 当该字段的值为0时,数据报就被丢弃,并发送I C M P报文通知源主机

3.2.1. 校验和

为了计算一份数据报的I P检验和,首先把检验和字段置为0。然后,对首部中每个16 bit进行二进制反码求和(整个首部看成是由一串16 bit的字组成),结果存在检验和字段中。当收到一份I P数据报后,同样对首部中每个16 bit进行二进制反码的求和。由于接收方在计算过程中包含了发送方存在首部中的检验和,因此,如果首部在传输过程中没有发生任何差错,那么接收方计算的结果应该为全1。如果结果不是全1(即检验和错误),那么IP就丢弃收到的数据报。但是不生成差错报文,由上层去发现丢失的数据报并进行重传。

3.3. IP路由器

I P层既可以配置成路由器的功能,也可以配置成主机的功能。

本质上的区别在于主机从不把数据报从一个接口转发到另一个接口,而路由器则要转发数据报

3.3.1. 路由表

路由表中的每一项都包含下面这些信息:

  • 目的IP地址
  • 下一站(跳)路由器的IP地址
  • 标志
    • 一个标志指明目的I P地址是网络地址还是主机地址
    • 另一个标志指明下一站路由器是否为真正的下一站路由器,还是一个直接相连的接口
  • 为数据报的传输指定一个网络接口

网络号与主机号

32位IP地址 = 8位网络号 + 24位主机号

工作流程

  • 搜索路由表,寻找能与目的I P地址完全匹配的表目(网络号和主机号都要匹配)
  • 搜索路由表,寻找能与目的网络号相匹配的表目
  • 搜索路由表,寻找标为“默认(d e f a u l t)”的表目。如果找到,则把报文发送给该表目指定的下一站路由器

3.4. 子网寻址

现在所有的主机都要求支持子网编址(RFC 950)。不是把IP地址看成由单纯的一个网络号和一个主机号组成,而是把主机号再分成一个子网号和一个主机号。

  • 这样做的原因是因为A类和B类地址为主机号分配了太多的空间
  • 子网对外部路由器来说隐藏了内部网络组织的细节
  • 子网划分缩减了路由表的规模

3.4.1. x类地址

  • A 类IP地址

    • 一个A类IP地址由1字节的网络地址和3字节主机地址组成,网络地址的最高位必须是“0”,地址范围从 1.0.0.0 到126.0.0.0。可用的 A 类网络有126个,每个网络能容纳1677214个主机。
  • B类IP地址

    • 一个B类 IP 地址由 2 个字节的网络地址和2个字节的主机地址组成,网络地址的最高位必须是“10”,地址范围从128.0.0.0 到191.255.255.255。可用的B类网络有 16382个,每个网络能容纳 6 万多个主机。
  • C类IP地址

    • C类IP地址包含私有C类地址,地址的表示范围为:192.0.0.0~223.255.255.255。C类地址分配给小型网络,如一般的局域网和校园网,它可连接的主机数量是最少的,采用把所属的用户分为若干的网段进行管理。
    • C类网络用前三组数字表示网络的地址,最后一组数字作为网络上的主机地址。C类地址默认子网掩码为255.255.255.0。
  • 【网络例题2】已知IP地址和子网掩码 求网络号、子网号、主机号_碎叶草人_新浪博客

3.5. 子网掩码

给定IP地址和子网掩码以后,主机就可以确定IP数据报的目的是

  • (1)本子网上的主机
  • (2)本网络中其他子网中的主机
  • (3)其他网络上的主机

3.6. 特殊情况的IP地址

将来或许会有更多的主机和网络,但是为了不让主机跨越不同的网络就得使用不同的子网号。我们的解决方法是把子网号从8 bit扩充到11 b i t,把主机号从8 bit减为5 bit。这就叫作变长子网,因为1 4 0 . 2 5 2网络中的大多数子网都采用8 bit子网掩码,而我们的子网却采用11 bit的子网掩码

并不是所有的路由选择协议在交换目的网络时也交换子网掩码。在第1 0章中,我们将看到R I P不支持变长子网,R I P第2版和O S P F则支持变长子网

netstat命令

这个命令打印出每个接口的M T U、输入分组数、输入错误、输出分组数、输出错误、冲突以及当前的输出队列长度

4. ARP地址解析协议

  • ARP为IP地址到对应的硬件地址之间提供动态映射。我们之所以用动态这个词是因为这个过程是自动完成的,一般应用程序用户或系统管理员不必关心
    • 从逻辑I n t e r n e t地址到对应的物理硬件地址需要进行翻译。这就是A R P的功能
  • RARP是被那些没有磁盘驱动器的系统使用

4.1. ARP高速缓存

A R P高效运行的关键是由于每个主机上都有一个A R P高速缓存。这个高速缓存存放了最近I n t e r n e t地址到硬件地址之间的映射记录。

  • 高速缓存中每一项的生存时间一般为20分
  • arp -a,参数-a的意思是显示高速缓存中所有的内容
  • arp -d删除ARP高速缓存中的某一项内容

4.2. ARP的分组格式

  • 目的地址为全1的特殊地址是广播地址
  • ARP请求或回答检验ARP高速缓存是空的连接无效的服务器键入Ctrl和右括号,使Telnet回到提示符并关闭下载的数据帧长都是4 2字节(2 8字节的A R P数据,1 4字节的以太网帧头),因此,每一帧都必须加入填充字符以达到以太网的最小长度要求:60字节(不包括4个字节的以太网帧尾)

对不存在主机的ARP请求

  • ARP请求是在网上广播

4.3. ARP代理

如果A R P请求是从一个网络的主机发往另一个网络上的主机,那么连接这两个网络的路由器就可以回答该请求,这个过程称作委托ARP或ARP代理(Proxy ARP)

  • 路由器netb识别出该IP地址属于它的一个拔号主机,于是把它的以太网接口地址140.252.1作为硬件地址来回答

4.4. 免费ARP

是指主机发送ARP查找自己的I P地址。通常,它发生在系统引导期间进行接口配置的时候

  • 一个主机可以通过它来确定另一个主机是否设置了相同的I P地址。主机并不希望对此请求有一个回答
  • 如果发送免费ARP的主机正好改变了硬件地址(很可能是主机关机了,并换了一块接口卡,然后重新启动),那么这个分组就可以使其他主机高速缓存中旧的硬件地址进行相应的更新

5. ICMP:Internet控制报文协议

I C M P经常被认为是I P层的一个组成部分。它传递差错报文以及其他需要注意的信息。

I C M P报文通常被I P层或更高层协议(T C P或U D P)使用。一些I C M P报文把差错报文返回给用户进程。

5.1. 类型

  • 查询报文
  • 差错报文

ICMP差错报文对广播分组响应所带来的广播风暴

5.2. ICMP时间戳请求

I C M P时间戳请求允许系统向另一个系统查询当前的时间。返回的建议值是自午夜开始计算的毫秒数,协调的统一时间(Coordinated Universal Time, UTC)

5.3. ICMP端口不可达差错

UDP的规则之一是,如果收到一份U D P数据报而目的端口与某个正在使用的进程不相符,那么UDP返回一个ICMP不可达报文

  • 8字节:源端口号、目的端口号

5.4. ICMP不可达差错(需要分片)

当路由器收到一份需要分片的数据报,而在I P首部又设置了不分片(D F)的标志比特。如果某个程序需要判断到达目的端的路途中最小M T U是多少—称作路径MTU发现机制,那么这个差错就可以被该程序使用

6. Ping程序

几年前我们还可以作出这样没有限定的断言,如果不能P i n g到某台主机,那么就不能Te l n e t或F T P到那台主机。随着I n t e r n e t安全意识的增强,出现了提供访问控制清单的路由器和防火墙,那么像这样没有限定的断言就不再成立了。一台主机的可达性可能不只取决于I P层是否可达,还取决于使用何种协议以及端口号。P i n g程序的运行结果可能显示某台主机不可达,但我们可以用Te l n e t远程登录到该台主机的25号端口(邮件服务器)

ICMP回显请求和回显应答报文

Unix系统在实现ping程序时是把ICMP报文中的标识符字段置成发送进程的ID号。这样即使在同一台主机上同时运行了多个ping程序实例,ping程序也可以识别出返回的信息

序列号从0开始,每发送一次新的回显请求就加1。p i n g程序打印出返回的每个分组的序列号,允许我们查看是否有分组丢失、失序或重复


旧版本的p i n g程序每秒发送一个回显请求,并打印出返回的每个回显应答。

新版本的p i n g程序只发送一个回显请求。如果收到回显应答,则输出“host is alive”;否则,在2 0秒内没有收到应答就输出“no answer(没有回答)”

输出

  • 当返回I C M P回显应答时,要打印出序列号和T T L,并计算往返时间(T T L位于I P首部中的生存时间字段)
  • 通常,第1个往返时间值要比其他的大。这是由于目的端的硬件地址不在A R P高速缓存中

6.1. IP记录路由选项

Ping程序为我们提供了查看IP记录路由(RR)选项的机会

它使得ping程序在发送出去的I P数据报中设置I PR R选项(该I P数据报包含I C M P回显请求报文)。这样,每个处理该数据报的路由器都把它的I P地址放入选项字段中。当数据报到达目的端时,I P地址清单应该复制到I C M P回显应答中,这样返回途中所经过的路由器地址也被加入清单中

最大的问题是I P首部中只有有限的空间来存放I P地址。我们从图3 - 1可以看到,I P首部中的首部长度字段只有4 bit,因此整个I P首部最长只能包括1 5个32 bit长的字(即6 0个字节)。由于I P首部固定长度为2 0字节,R R选项用去3个字节,这样只剩下3 7个字节(6 0-2 0-3)来存放I P地址清单,也就是说只能存放9个I P地址

  • ptr称作指针字段。它是一个基于1的指针,指向存放下一个IP地址的位置。它的最小值为4,指向存放第一个IP地址的位置
    • 随着每个I P地址存入清单,p t r的值分别为8,1 2,1 6,最大到3 6。当记录下9个I P地址后,p t r的值为4 0,表示清单已满

7. IP选路

7.1. 路由守护程序

  • 当接收到ICMP重定向,报文时,路由表也要被更新

7.2. 选路原理

netstat对于一个给定的路由器,可以打印出五种不同的标志(flag):

  • U: 该路由可以使用。
  • G: 该路由是到一个网关(路由器)。如果没有设置该标志,说明目的地是直接相连的。
  • H: 该路由是到一个主机,也就是说,目的地址是一个完整的主机地址。如果没有设置该标志,说明该路由是到一个网络,而目的地址是一个网络地址:一个网络号,或者网络号与子网号的组合。
  • D: 该路由是由重定向报文创建的
  • M: 该路由已被重定向报文修改
  • 标志G是非常重要的,因为由它区分了间接路由和直接路由(对于直接路由来说是不设置标志G的)。其区别在于,发往直接路由的分组中不但具有指明目的端的IP地址,还具有其链路层地址。当分组被发往一个间接路由时,IP地址指明的是最终的目的地,但是链路层地址指明的是网关(即下一站路由器)
  • H标志表明,目的地址是一个完整的主机地址。没有设置H标志说明目的地址是一个网络地址(主机号部分为0)
  • 参考记数Refcnt(Reference count)列给出的是正在使用路由的活动进程个数。面向连接的协议如TCP在建立连接时要固定路由。如果在主机svr4和slip之间建立Telnet连接,可以看到参考记数值变为1。建立另一个Telnet连接时,它的值将增加为2,依此类推。

8. UDP:用户数据报协议

  • UDP不提供可靠性:它把应用程序传给I P层的数据发送出去,但是并不保证它们能到达目的地
  • 由于I P层已经把I P数据报分配给T C P或U D P(根据I P首部中协议字段值),因此T C P端口号由T C P来查看,而U D P端口号由U D P来查看。T C P端口号与U D P端口号是相互独立的
    • 尽管相互独立,如果T C P和U D P同时提供某种知名服务,两个协议通常选择相同的端口号。这纯粹是为了使用方便,而不是协议本身的要求

8.1. UDP检验和

I C M P、I G M P、U D P和T C P都采用相同的检验和算法,尽管T C P和U D P除了本身的首部和数据外,在I P首部中还包含不同的字段

  • U D P的检验和是可选的,而T C P的检验和是必需的
  • I P首部的检验和只覆盖I P的首部—并不覆盖I P数据报中的任何数据。
  • U D P数据报的长度可以为奇数字节,但是检验和算法是把若干个16 bit字相加。解决方法是必要时在最后增加填充字节0,这只是为了检验和的计算(也就是说,可能增加的填充字节不被传送)。
  • UDP数据报和T C P段都包含一个1 2字节长的伪首部,它是为了计算检验和而设置的。伪首部包含I P首部一些字段。其目的是让U D P两次检查数据是否已经正确到达目的地

8.1.1. 伪首部

伪首部(pseudo header),通常有TCP伪首部和UDP伪首部。在UDP/TCP伪首部中,包含32位源IP地址,32位目的IP地址,8位填充0,8位协议,16位TCP/UDP长度。通过伪首部的校验

伪首部并非TCP&UDP数据报中实际的有效成分。伪首部是一个虚拟的数据结构,其中的信息是从数据报所在IP分组头的分组头中提取的,既不向下传送也不向上递交,而仅仅是为计算校验和。这样的校验和,既校验了TCP&UDP用户数据的源端口号和目的端口号以及TCP&UDP用户数据报的数据部分,又检验了IP数据报的源IP地址和目的地址。

伪报头保证TCP&UDP数据单元到达正确的目的地址。

8.2. IP分片

物理网络层一般要限制每次发送数据帧的最大长度。任何时候I P层接收到一份要发送的I P数据报时,它要判断向本地哪个接口发送数据(选路),并查询该接口获得其M T U。I P把M T U与数据报长度进行比较,如果需要则进行分片。分片可以发生在原始发送端主机上,也可以发生在中间路由器上

新组装由目的端的IP层来完成,其目的是使分片和重新组装过程对运输层(T C P和U D P)是透明的,除了某些可能的越级操作外


尽管IP分片过程看起来是透明的,但有一点让人不想使用它:即使只丢失一片数据也要重传整个数据报。为什么会发生这种情况呢?因为IP层本身没有超时重传的机制——由更高层来负责超时和重传(TCP有超时和重传机制,但UDP没有。一些UDP应用程序本身也执行超时和重传)

  • 这也意谓着UDP最大数据报长度写死不能分片?

tcpdump

9. UDP和ARP之间的交互作用

在第一个A R P应答返回以前,总共产生了6个A R P请求。我们认为其原因是I P很快地产生了6个数据报片,而每个数据报片都引发了一个A R P请求

第二,在接收到第一个A R P应答时(第7行),只发送最后一个数据报片(第9行)!看来似乎将前5个数据报片全都丢弃了。实际上,这是A R P的正常操作。在大多数的实现中,在等待一个A R P应答时,只将最后一个报文发送给特定目的主机


Host Requirements RFC要求实现中必须防止这种类型的ARP洪泛(ARP flooding即以高速率重复发送到同一个I P地址的A R P请求)。建议最高速率是每秒一次。而这里却在4.3 ms内发出了6个ARP请求。

Host Requirements RFC规定,ARP应该保留至少一个报文,而这个报文必须是最后一个报文。这正是我们在这里所看到的结果

10. 最大UDP数据报长

  • 第一,应用程序可能会受到其程序接口的限制。socket API提供了一个可供应用程序调用的函数,以设置接收和发送缓存的长度。对于UDP socket,这个长度与应用程序可以读写的最大U D P数据报的长度直接相关。现在的大部分系统都默认提供了可读写大于8 1 9 2字节的U D P数据报(使用这个默认值是因为8 1 9 2是NFS读写用户数据数的默认值)。
  • 第二个限制来自于T C P / I P的内核实现。可能存在一些实现特性(或差错),使I P数据报长度小于6 5 5 3 5字节

11. 广播和多播

使用广播的问题在于它增加了对广播数据不感兴趣主机的处理负荷。拿一个使用U D P广播应用作为例子。如果网内有5 0个主机,但仅有2 0个参与该应用,每次这2 0个主机中的一个发送U D P广播数据时,其余3 0个主机不得不处理这些广播数据报。一直到U D P层,收到的U D P广播数据报才会被丢弃。这3 0个主机丢弃U D P广播数据报是因为这些主机没有使用这个目的端口。

多播的出现减少了对应用不感兴趣主机的处理负荷。使用多播,主机可加入一个或多个多播组。这样,网卡将获悉该主机属于哪个多播组,然后仅接收主机所在多播组的那些多播帧


对于以太网,当地址中最高字节的最低位设置为1时表示该地址是一个多播地址,用十六进制可表示为0 1 : 0 0 : 0 0 : 0 0 : 0 0 : 0 0(以太网广播地址ff : ff : ff : ff : ff : ff可看作是以太网多播地址的特例)

11.1. 指向网络的广播

指向网络的广播地址是主机号为全1的地址。A类网络广播地址为n e t i d . 2 5 5 . 2 5 5 . 2 5 5,其中n e t i d为A类网络的网络号

11.2. 指向子网的广播

指向子网的广播地址为主机号为全1且有特定子网号的地址。作为子网直接广播地址的I P地址需要了解子网的掩码。例如,如果路由器收到发往1 2 8 . 1 . 2 . 2 5 5的数据报,当B类网络第12章广播和多播使用1 2 8 . 1的子网掩码为2 5 5 . 2 5 5 . 2 5 5 . 0时,该地址就是指向子网的广播地址;但如果该子网的掩码为2 5 5 . 2 5 5 . 2 5 4 . 0,该地址就不是指向子网的广播地址

应用程序必须支持广播

1
sun % ping 255.255.255.255/usr/etc/ping: unknown host 255.255.255.255

12. DNS:域名系统

域名系统(D N S)是一种用于T C P / I P应用程序的分布式数据库,它提供主机名字和IP地址之间的转换及有关电子邮件的选路信息


DNS的一个基本特性是使用超高速缓存。即当一个名字服务器收到有关映射的信息(主机名字到I P地址)时,它会将该信息存放在高速缓存中。这样若以后遇到相同的映射请求,就能直接使用缓存中的结果而无需通过其他服务器查询。1 4 . 7节显示了一个使用高速缓存的例子

12.1. DNS的报文格式

DNS定义了一个用于查询和响应的报文格式

  • 标识字段由客户程序设置并由服务器返回结果
    • QR 是1 bit字段:0表示查询报文,1表示响应报文
    • TC是1 bit字段,表示“可截断的( t r u n c a t e d )”。使用U D P时,它表示当应答的总长度超过5 1 2字节时,只返回前5 1 2个字节

12.1.1. DNS查询报文中的问题部分

  • 不像我们已经看到的许多其他报文格式,该字段无需以整32 bit边界结束,即无需填充字节
  • 每个标识符以首字节的计数值来说明随后标识符的字节长度,每个名字以最后字节为0结束,长度为0的标识符是根标识符。

12.1.2. DNS响应报文中的资源记录部分

DNS报文中最后的三个字段,回答字段、授权字段和附加信息字段,均采用一种称为资源记录R R(Resource Record)的相同格式

12.2. 指针查询

给定一个I P地址,返回与该地址对应的域名

  • 第1行显示标识符为1,期望递归标志设置为1(加号“+”)
  • 查询类型为P T R(应注意:问号“?”表示它是一个查询而不是响应)
  • 44字节的数据包括1 2字节的D N S报文首部、28字节的域名标识符和4字节的查询类型和查询类

12.3. 资源记录

  • A: 一个A记录定义了一个I P地址,它存储32 bit的二进制数。
  • P T R: 指针记录用于指针查询。I P地址被看作是i n - a d d r . a r p a域下的一个域名(标识符串)。
  • C N A M E:这表示“规范名字(canonical name)”。它用来表示一个域名(标识符串),而有规范名字的域名通常被称为别名( a l i a s )
  • M X: 邮件交换记录
  • N S: 名字服务器记录。它说明一个域的授权名字服务器。它由域名表示(符号串)。

12.4. TCP vs UDP

注意到D N S名字服务器使用的熟知端口号无论对U D P还是T C P都是5 3。这意味着D N S均支持U D P和T C P访问,但我们使用t c p d u m p观察的所有例子都是采用U D P

名字解析器发出一个查询请求,并且返回响应中的T C(删减标志)比特被设置为1时,它就意味着响应的长度超过了5 1 2个字节,而仅返回前512个字节。在遇到这种情况时,名字解析器通常使用TCP重发原来的查询请求,它将允许返回的响应超过512个字节。既然TCP能将用户的数据流分为一些报文段,它就能用多个报文段来传送任意长度的用户数据。

12.5. 一个例子

先启动Rlogin 客户程序,然后连接到一个位于其他域的Rlogin服务器。

1
2
3
3) 客户端的名字解析器将向该服务器的名字服务器重发上述A类型查询,这个查询通常是将期望递归标志设置为1。

6) Rlogin服务器收到来自客户的连接请求后,调用它的名字解析器通过T C P连接请求中的I P地址获得客户主机名。这是一个P T R查询请求,由一个根名字服务器处理。这个根名字服务器可以不同于步骤1中客户使用的根名字服务器。

12.5.1. FQDN

FQDN:(Fully Qualified Domain Name)全限定域名:同时带有主机名和域名的名称。(通过符号“.”)

例如:主机名是bigserver,域名是mycompany.com,那么FQDN就是bigserver.mycompany.com。

全限定域名可以从逻辑上准确地表示出主机在什么地方,也可以说全域名是主机名的一种完全表示形式

13. TCP:传输控制协议

C P提供一种面向连接的、可靠的字节流服务

  • 在一个TCP连接中,仅有两方进行彼此通信。广播和多播不能用于T C P
  • 应用数据被分割成T C P认为最适合发送的数据块。这和U D P完全不同,应用程序产生的数据报长度将保持不变
  • 当T C P发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。
  • 当T C P收到发自T C P连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒,
  • T C P将保持它首部和数据的检验和
  • 既然T C P报文段作为I P数据报来传输,而I P数据报的到达可能会失序,因此T C P报文段的到达也可能会失序。如果必要,T C P将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。
  • 既然I P数据报会发生重复,T C P的接收端必须丢弃重复的数据
  • T C P还能提供流量控制。T C P连接的每一方都有固定大小的缓冲空间。
  • T C P对字节流的内容不作任何解释。T C P不知道传输的数据字节流是二进制数据,还是A S C I I字符、E B C D I C字符或者其他类型数据
    • 这种对字节流的处理方式与U n i x操作系统对文件的处理方式很相似。U n i x的内核对一个应用读或写的内容不作任何解释,而是交给应用程序处理。对Unix的内核来说,它无法区分一个二进制文件与一个文本文件

13.1. TCP的首部

一个I P地址和一个端口号也称为一个插口(s o c k e t)。这个术语出现在最早的T C P规范(R F C 7 9 3)中。插口对(s o c k e tp a i r)(包含客户I P地址、客户端口号、服务器IP地址和服务器端口号的四元组)可唯一确定互联网络中每个T C P连接的双方

源端和目的端的端口号,这两个值加上I P首部中的源端IP地址和目的端IP地址唯一确定一个TCP连接


序号用来标识从TCP发端向TCP收端发送的数据字节流,它表示在这个报文段中的的第一个数据字节


当建立一个新的连接时,SYN标志变1.

序号字段包含由这个主机选择的该连接的初始序号I S N(Initial Sequence Number)。该主机要发送数据的第一个字节序号为这个ISN加1,因为SYN标志消耗了一个序号

  • I S N随时间而变化,因此每个连接都将具有不同的I S N
  • URG

    • 紧急指针(u rgent pointer)有效
  • ACK

    • 确认序号有效。
  • PSH

    • 接收方应该尽快将这个报文段交给应用层。
  • RST

    • 重建连接。
  • SYN

    • 同步序号用来发起一个连接。
  • FIN

    • 发端完成发送任务
  • 窗口大小是一个16 bit字段,因而窗口大小最大为6 5 5 3 5字节。

    • 窗口刻度选项允许这个值按比例变化以提供更大的窗口
  • 最常见的可选字段是最长报文大小,又称为MSS(Maximum Segment Size)。每个连接方通常都在通信的第一个报文段(为建立连接而设置S Y N标志的那个段)中指明这个选项。它指明本端所能接收的最大长度的报文段

14. TCP连接的建立与终止

14.1. 三次握手(three-way handshake)

  • 发送第一个S Y N的一端将执行主动打开(active open)。接收这个S Y N并发回下一个S Y N的另一端执行被动打开(passive open)

14.1.1. 半连接与全连接

当服务端调用listen函数监听端口的时候,内核会为每个监听的socket创建两个队列:

  • 半连接队列(syn queue):客户端发送SYN包,服务端收到后回复SYN+ACK后,服务端进入SYN_RCVD状态,这个时候的socket会放到半连接队列。

  • 全连接队列(accept queue):当服务端收到客户端的ACK后,socket会从半连接队列移出到全连接队列。当调用accpet函数的时候,会从全连接队列的头部返回可用socket给用户进程。

  • TCP的全连接和半连接队列

14.2. 连接终止协议(4次握手)

既然一个T C P连接是全双工(即数据在两个方向上能同时传递),因此每个方向必须单独地进行关闭

  • 这原则就是当一方完成它的数据发送任务后就能发送一个F I N来终止这个方向连接。当一端收到一个F I N,它必须通知应用层另一端已经终止了那个方向的数据传送
  • 收到一个F I N只意味着在这一方向上没有数据流动。一个T C P连接在收到一个F I N后仍能发送数据。而这对利用半关闭的应用来说是可能的,尽管在实际应用中只有很少的T C P应用程序这样做
  • 首先进行关闭的一方(即发送第一个F I N)将执行主动关闭,而另一方(收到这个F I N)执行被动关闭

14.3. 连接建立的超时

15. 最大报文段长度

  • 一般说来,如果没有分段发生,M S S还是越大越好
    • 报文段越大允许每个报文段传送的数据就越多,相对I P和T C P首部有更高的网络利用率
  • 当T C P发送一个S Y N时,或者是因为一个本地应用进程想发起一个连接,或者是因为另一端的主机收到了一个连接请求,它能将M S S值设置为外出接口上的M T U长度减去固定的I P首部和TCP首部长度。
    • 对于一个以太网,M S S值可达1 4 6 0字节。
    • 使用IEEE 802.3的封装,它的M S S可达1452字节

如果目的I P地址为“非本地的( n o n l o c a l )”,M S S通常的默认值为5 3 6。而区分地址是本地还是非本地是简单的

  • 如果目的I P地址的网络号与子网号都和我们的相同,则是本地的;
  • 如果目的IP地址的网络号与我们的完全不同,则是非本地的;
  • 如果目的IP地址的网络号与我们的相同而子网号与我们的不同,则可能是本地的,也可能是非本地的

15.1. TCP的半关闭

TCP提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力。这就是所谓的半关闭。只有很少的应用程序使用它

15.2. TCP的状态变迁图

T I M E _ WAIT状态也称为2 M S L等待状态。每个具体T C P实现必须选择一个报文段最大生存时间MSL(Maximum Segment Lifetime)。它是任何报文段被丢弃前在网络内的最长时间。我们知道这个时间是有限的,因为T C P报文段以I P数据报在网络内传输,而I P数据报则有限制其生存时间的T T L字段。

  • 这种2 M S L等待的另一个结果是这个T C P连接在2 M S L等待期间,定义这个连接的插口(客户的I P地址和端口号,服务器的I P地址和端口号)不能再被使用。这个连接只能在2 M S L结束后才能再被使用

    • 大多数T C P实现(如伯克利版)强加了更为严格的限制
  • tcp的伯克利实现与当今的tcp实现差距有多大? - 知乎

15.3. 复位报文段

T C P首部中的R S T比特是用于“复位”的

  • 无论何时一个报文段发往基准的连接(referenced connection)出现错误,T C P都会发出一个复位报文段
  • 产生复位的一种常见情况是当连接请求到达时,目的端口没有进程正在听
  • 终止一个连接的正常方式是一方发送F I N。有时这也称为有序释放(orderly release),因为在所有排队数据都已发送之后才发送F I N,正常情况下没有任何数据丢失。但也有可能发送一个复位报文段而不是F I N来中途释放一个连接。有时称这为异常释放(abortive release)。

15.4. 同时打开

两个应用程序同时彼此执行主动打开的情况是可能的,尽管发生的可能性极小

  • 例如,主机A中的一个应用程序使用本地端口7 7 7 7,并与主机B的端口8 8 8 8执行主动打开。主机B中的应用程序则使用本地端口8 8 8 8,并与主机A的端口7 7 7 7执行主动打开

同时关闭

15.5. TCP 选项

一部分

15.6. TCP服务器端口号

netstat

  • a: 将显示网络中的所有主机端,而不仅仅是处于E S TA B L I S H E D的主机端
  • n: 将以点分十进制的形式显示I P地址,而不是通过D N S将地址转化为主机名,同时还要求显示端口号(例如为2 3)而不是服务名称(如Te l n e t)
  • f inet: 仅要求显示使用T C P或U D P的主机

16. TCP的交互数据流

特点:发的多,内容小

在一个R l o g i n连接上客户一般每次发送一个字节到服务器,这就产生了一些4 1字节长的分组:2 0字节的I P首部、2 0字节的T C P首部和1个字节的数据。在局域网上,这些小分组(被称为微小分组(t i n y g r a m))通常不会引起麻烦,因为局域网一般不会出现拥塞。但在广域网上,这些小分组则会增加拥塞出现的可能。

  • 一种简单和好的方法就是采用RFC 896 [Nagle 1984]中所建议的Nagle算法
    • 该算法要求一个T C P连接上最多只能有一个未被确认的未完成的小分组,在该分组的确认到达之前不能发送其他的小分组
    • 该算法的优越之处在于它是自适应的:确认到达得越快,数据也就发送得越快。而在希望减少微小分组数目的低速广域网上,则会发送更少的分组

16.1. 窗口大小通告

我们可以观察到s l i p通告窗口大小为4 0 9 6字节,而v a n g o g h通告其窗口大小为8 1 9 2个字节。上图中的大多数报文段都包含这两个值中的一个

交互数据总是以小于最大报文段长度的分组发送。在R l o g i n中通常只有一个字节从客户发送到服务器。Te l n e t允许一次发送一行输入数据,但是目前大多数实现仍然发送一个字节。

对于这些小的报文段,接收方使用经受时延的确认方法来判断确认是否可被推迟发送,以便与回送数据一起发送。这样通常会减少报文段的数目,尤其是对于需要回显用户输入字符的R l o g i n会话

17. TCP的成块数据流

停止等待协议: 数据发送方在发送下一个数据块之前需要等待接收对已发送数据的确认

17.1. 快的发送方和慢的接收方

发送方发送4个背靠背(b a c k - t o - b a c k)的数据报文段去填充接收方的窗口,然后停下来等待一个A C K。接收方发送A C K(报文段8),但通告其窗口大小为0,这说明接收方已收到所有数据,但这些数据都在接收方的T C P缓冲区,因为应用程序还没有机会读取这些数据。另一个A C K(称为窗口更新)在17.4 ms后发送,表明接收方现在可以接收另外的4 0 9 6个字节的数据。虽然这看起来像一个A C K,但由于它并不确认任何新数据,只是用来增加窗口的右边沿,因此被称为窗口更新

17.2. 滑动窗口

(发送方)将字节从1至11进行标号

接收方通告的窗口称为提出的窗口(o ff e r e dw i n d o w),它覆盖了从第4字节到第9字节的区域

发送方计算它的可用窗口,该窗口表明多少数据可以立即被发送


由于是全双工协议,因此A和B应该分别维护着一个独立的发送缓冲区和接收缓冲区

  • 称窗口左边沿向右边沿靠近为窗口合拢。这种现象发生在数据被发送和确认时
  • 当窗口右边沿向右移动时将允许发送更多的数据,我们称之为窗口张开。这种现象发生在另一端的接收进程读取已经确认的数据并释放了TCP的接收缓存时
  • 当右边沿向左移动时,我们称之为窗口收缩。Host Requirements RFC强烈建议不要使用这种方式。但TCP必须能够在某一端产生这种情况时进行处理。
  • 发送方不必发送一个全窗口大小的数据

17.3. 成块数据的吞吐量

  • 在时间0,由于发送方处于慢启动中(其拥塞窗口为1个报文段),因此在继续发送以前它必须等待该数据段的确认
  • 8个时间单元的往返时间RT T(R o u n d - Trip Ti m e)
  • 我们有意把A C K报文段画得比数据报文段小,这是因为它通常只有一个IP首部和一个TCP首部
  • 在时间3 1及其后续时间,发送方和接收方之间的管道( p i p e )被填满。此时不论拥塞窗口和通告窗口是多少,它都不能再容纳更多的数据。每当接收方在某一个时间单位从网络上移去一个报文段,发送方就再发送一个报文段到网络上。但是不管有多少报文段填充了这个管道,返回路径上总是具有相同数目的A C K。这就是连接的理想稳定状态

17.3.1. 带宽时延乘积

$c a p a c i t y(bit) = b a n d w i d t h(b/s) ×ro u n d-trip time( s )$

  • 增加了一倍的RTT会使通路容量也增加一倍(时延)
  • 增加一倍的带宽也可使该管道的容量增加一倍

17.3.2. 拥塞

当数据到达一个大的管道(如一个快速局域网)并向一个较小的管道(如一个较慢的广域网)发送时便会发生拥塞

  • 会引起路由器丢弃分组

17.4. PUSH标志

发送方使用该标志通知接收方将所收到的数据全部提交给接收进程

  • 许多实现程序认为P U S H标志已经过时,一个好的T C P实现能够自行决定何时设置这个标志

17.5. 慢启动

发送方一开始便向网络发送多个报文段,直至达到接收方通告的窗口大小为止。当发送方和接收方处于同一个局域网时,这种方式是可以的。但是如果在发送方和接收方之间存在多个路由器和速率较慢的链路时,就有可能出现一些问题。一些中间路由器必须缓存分组,并有可能耗尽存储器的空间

现在,T C P需要支持一种被称为“慢**启动(slow start)**”的算法。该算法通过观察到新分组进入网络的速率应该与另一端返回确认的速率相同而进行工作


慢启动为发送方的TCP增加了另一个窗口:拥塞窗口(congestion window),记为cwnd

拥塞窗口被初始化为1个报文段(即另一端通告的报文段大小)。每收到一个A C K,拥塞窗口就增加一个报文段(c w n d以字节为单位,但是慢启动以报文段大小为单位进行增加)

发送方取拥塞窗口与通告窗口中的最小值作为发送上限。

  • 拥塞窗口是发送方使用的流量控制,而通告窗口则是接收方使用的流量控制

17.6. 紧急方式

T C P提供了“紧急方式( u rgent mode)”,它使一端可以告诉另一端有些具有某种方式的“紧急数据”已经放置在普通的数据流中。

  • 紧急方式有什么作用呢?两个最常见的例子是Te l n e t和R l o g i n。当交互用户键入中断键时,
  • 另一个例子是F T P,当交互用户放弃一个文件的传输时

18. TCP的超时与重传

数据和确认都有可能会丢失。T C P通过在发送时设置一个定时器来解决这种问题。如果当定时器溢出时还没有收到确认,它就重传该数据

关键之处就在于超时和重传的策略,即怎样决定超时间隔和如何确定重传的频率

TCP管理4个不同的定时器

  • 重传定时器使用于当希望收到另一端的确认
  • 坚持( p e r s i s t )定时器使窗口大小信息保持不断流动,即使另一端关闭了其接收窗口
  • **保活( k e e p a l i v e )**定时器可检测到一个空闲连接的另一端何时崩溃或重启
  • 2MSL定时器测量一个连接处于T I M E _ WA I T状态的时间

指数退避(exponential backoff)

  • 当第一次发送后所设置的超时时间实际上为1.5秒,此后该时间在每次重传时增加1倍并直至64秒

18.1. RTT估计器的计算

RTO(Retransmission TimeOut)即重传超时时间

TCP超时与重传中一个很最重要的部分是对一个给定连接的往返时间(RTT)的测量。由于网络流量的变化,这个时间会相应地发生改变,TCP需要跟踪这些变化并动态调整超时时间RTO。

1
2
3
4
5
6
7
8
9
10
11
变量A和D分别被初始化为0和3秒。初始的重传超时使用下面的公式进行计算

RTO= A+ 2D= 0 + 2×3 = 6 s

(因子2D只在这个初始化计算中使用。正如前面提到的,以后使用4D和A相加来计算RTO)

当超时在5 . 8 0 2秒(6s)后发生时,计算当前的RTO值为

RTO= A+ 4D= 0 + 4×3 = 12

因此,应用于RTO的指数退避取为12。由于这是第1次超时,我们使用倍数2,因此下一个超时时间取值为24秒

18.2. 拥塞避免算法

慢启动算法是在一个连接上发起数据流的方法,但有时我们会达到中间路由器的极限,此时分组将被丢弃。拥塞避免算法是一种处理丢失分组的方法

该算法假定由于分组受到损坏引起的丢失是非常少的(远小于1 %),因此分组丢失就意味着在源主机和目的主机之间的某处网络上发生了拥塞。

  • 有两种分组丢失的指示:发生超时和接收到重复的确认

拥塞避免算法和慢启动算法是两个目的不同、独立的算法。但是当拥塞发生时,我们希望降低分组进入网络的传输速率,于是可以调用慢启动来作到这一点。在实际中这两个算法通常在一起实现。

  • 拥塞避免算法和慢启动算法需要对每个连接维持两个变量:一个拥塞窗口c w n d和一个慢启动门限s s t h re s h
  • 对一个给定的连接,初始化c w n d为1个报文段,s s t h re s h为6 5 5 3 5个字节
  • 当拥塞发生时(超时或收到重复确认),ssthresh被设置为当前窗口大小的一半(c w n d和接收方通告窗口大小的最小值,但最少为2个报文段)
    • 如果是超时引起了拥塞,则cwnd被设置为1个报文段(这就是慢启动)
  • 当新的数据被对方确认时,就增加c w n d。如果c w n d小于或等于s s t h re s h,则正在进行慢启动,否则正在进行拥塞避免。慢启动一直持续到我们回到当拥塞发生时所处位置的半时候才停止,然后转为执行拥塞避免
  • 慢启动算法初始设置c w n d为1个报文段,此后每收到一个确认就加1,窗口按指数方式增长:发送1个报文段,然后是2个,接着是4个
  • 拥塞避免算法要求每次收到一个确认时将c w n d增加1 /c w n d。与慢启动的指数增加比起来,这是一种加性增长(additive increase)。我们希望在一个往返时间内最多为c w n d增加1个报文段(不管在这个RT T中收到了多少个A C K),然而慢启动将根据这个往返时间中所收到的确认的个数增加c w n d

18.3. 快速重传与快速恢复算法

  • 如果发送方设置的超时计时器时限已到但还没有收到确认,那么很可能是网络出现了拥塞,致使报文段在网络中的某处被丢弃。这时,TCP马上把拥塞窗口 cwnd 减小到1,并执行慢开始算法,同时把慢开始门限值ssthresh减半。这是不使用快重传的情况。
    • 快重传算法首先要求接收方每收到一个失序的报文段后就立即发出重复确认(为的是使发送方及早知道有报文段没有到达对方)而不要等到自己发送数据时才进行捎带确认

接收方收到了M1和M2后都分别发出了确认。现在假定接收方没有收到M3但接着收到了M4。显然,接收方不能确认M4,因为M4是收到的失序报文段。根据可靠传输原理,接收方可以什么都不做,也可以在适当时机发送一次对M2的确认。但按照快重传算法的规定,接收方应及时发送对M2的重复确认,这样做可以让发送方及早知道报文段M3没有到达接收方。发送方接着发送了M5和M6。接收方收到这两个报文后,也还要再次发出对M2的重复确认。这样,发送方共收到了接收方的四个对M2的确认,其中后三个都是重复确认。快重传算法还规定,发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段M3,而不必继续等待M3设置的重传计时器到期。

由于发送方尽早重传未被确认的报文段,因此采用快重传后可以使整个网络吞吐量提高约20%

18.4. ICMP的差错

T C P能够遇到的最常见的I C M P差错就是源站抑制、主机不可达和网络不可达

  • ICMP源站抑制差错:
    • 当一个系统(路由器或主机)接收数据报的速度比其处理速度快时,可能产生这个差错
  • 一个接收到的主机不可达或网络不可达实际上都被忽略,因为这两个差错都被认为是短暂现象

18.5. 重新分组

当T C P超时并重传时,它不一定要重传同样的报文段。相反,T C P允许进行重新分组而发送一个较大的报文段,这将有助于提高性能

  • 因为TCP是使用字节序号而不是报文段序号来进行识别它所要发送的数据和进行确认
  • TCP会话的每一端都包含一个32位(bit)的序列号,该序列号被用来跟踪该端发送的数据量。每一个包中都包含序列号,在接收端则通过确认号用来通知发送端数据成功接收
    • 序列号为当前端成功发送的数据位数,确认号为当前端成功接收的数据位数

TCP 协议中的序号,指的是报文段序号

如果一个 TCP 报文段的序号为 301,它携带了 100 字节的数据,就表示这 100 个字节的数据的字节序号范围是 [301, 400],该报文段携带的第一个字节序号是 301,最后一个字节序号是400

  • 也就是首字节序号?

TCP 连接中,为传送的字节流(数据)中的每一个字节按顺序编号。也就是说,在一次 TCP连接建立的开始,到 TCP 连接的断开,你要传输的所有数据的每一个字节都要编号。这个序号称为字节序号。

19. TCP的坚持定时器

如果一个确认丢失了,则双方就有可能因为等待对方而使连接终止:接收方等待接收数据(因为它已经向发送方通告了一个非0的窗口),而发送方在等待允许它继续发送数据的窗口更新。为防止这种死锁情况的发生,发送方使用一个坚持定时器(persist timer)来周期性地向接收方查询,以便发现窗口是否已增大。这些从发送方发出的报文段称为窗口探查( w i n d o w probe)。

  • T C P不对A C K报文段进行确认,T C P只确认那些包含有数据的A C K报文段
  • 这些探查被T C P的500 ms定时器超时例程所触发。当定时器时间到时,就发送窗口探查
  • 计算坚持定时器时使用了普通的T C P指数退避。对一个典型的局域网连接,首次超时时间算出来是1 . 5秒,第2次的超时值增加一倍,为3秒计算坚持定时器时使用了普通的T C P指数退避。对一个典型的局域网连接,首次超时时间算出来是1 . 5秒,第2次的超时值增加一倍,为3秒,再下次乘以4为6秒,之后再乘以8为1 2秒等

在报文段13中,服务器确认了前面4个数据报文段,然后通告窗口为0,从而使客户停止发送任何其他的数据。这就引起客户设置其坚持定时器。如果在该定时器时间到时客户还没有接收到一个窗口更新,它就探查这个空的窗口以决定窗口更新是否丢失

19.1. 糊涂窗口综合症

糊涂窗口综合症(Silly Window Syndrome)

糊涂窗口综合症是指当发送端应用进程产生数据很慢、或接收端应用进程处理接收缓冲区数据很慢,或二者兼而有之;就会使应用进程间传送的报文段很小,特别是有效载荷很小; 极端情况下,有效载荷可能只有1个字节;传输开销有40字节(20字节的IP头+20字节的TCP头) 这种现象

解决的方法是防止发送端的TCP逐个字节地发送数据。必须强迫发送端的TCP收集数据,然后用一个更大的数据块来发送

  • Nagle算法

前4个数据报文段及其A C K(报文段1 ~ 5)表示发送方正在填充接收方的缓存。在那个时刻发送方停止了发送,但仍然有更多的数据需要发送。它将自己的坚持定时器置为最小值5分钟。

当坚持定时器时间到时,就发送出1个字节的数据(报文段6)。接收的应用进程已经从接收缓存中读取了2 5 6字节的数据(在时刻3 . 9 9),因此这个字节被接受并被确认(报文段7段)。但是通告窗口仍为0,由于接收方仍然没有足够的空间来接收一个满长度的报文,或者不能腾出缓存空间的一半。这就是接收方的糊涂窗口避免措施

20. TCP的保活定时器

如果T C P连接的双方都没有向对方发送数据,则在两个T C P模块之间不交换任何信息。例如,没有可以在其他网络协议中发现的轮询。这意味着我们可以启动一个客户与服务器建立一个连接,然后离去数小时、数天、数个星期或者数月,而连接依然保持

保活并不是T C P规范中的一部分

第4行是第一个保活探查,发生在两个小时以后(7 2 0 0秒)。在第6行的TCP报文段能够发送之前,首先观察到的是一个A R P请求和一个A R P应答。第6行的保活探查引出来自另一端的响应(第7行)。

另一端崩溃并重新启动

21. TCP的未来和性能

21.1. 路径MTU发现

为了找到路径MTU,主机首先发送整个数据包,并将IP首部的禁止分片标志设为1.这样路由器在遇到需要分片才能处理的包时不会分片,而是直接丢弃数据并通过ICMP协议将整个不可达的消息发回给主机。

主机将ICMP通知中的MTU设置为当前MTU,根据整个MTU对数据进行分片处理。如此反复下去,直到不再收到ICMP通知,此时的MTU就是路径MTU

21.2. 长肥管道

具有大的带宽时延乘积(bandwith x rrt)的网络被称为长肥网络(Long Fat Network)

  • (管道可以被水平拉长(一个长的RTT),或被垂直拉高(较高的带宽),或向两个方向拉伸)
  • TCP首部中窗口大小为16bit,因此窗口大小最大为65535字节,这就将发送方发送但未被确认的数据的总长度限制到了65536字节。对于LFN管道,这可能会出现所有的数据都还未到达接收方,但是发送方已受限于窗口大小而不能继续发送的情形,这就极大的降低了网络的吞吐量
    • 窗口扩大选项可以解决这个问题
  • 由于长肥管的延时较高, 出现丢包的情况会使得管道枯竭(即网络通信速度急剧下降),
    • 快重传快恢复算法就是用以削弱这一问题的影响.

  作为传输控制协议,在实验室低速网络环境下诞生的TCP/IP协议,在设计初期只是为了保证数据在链路上的可靠传输,其余的问题基本都没有考虑。如今长肥网络广泛存在于实际环境中,TCP协议的滑动窗口,重传和恢复等机制(在此不做详细探讨)使得广域网的传输效率急剧下降;而随着广域网的链路速率日益提高,原本TCP的窗口尺寸、慢启动等机制也无法充分利用网络带宽。“一些企业因为远程访问数据中心速度慢而扩容广域网带宽,但是TCP协议本身的限制,扩容后用户没有感受到与带宽提升相应的速度提高。”Blue Coat中国区产品市场经理申强表示。

  • 最简单得方法是,把大文件分块,然后起多条TCP传输,或者干脆使用UDP。

高带宽时延乘积是设计如传输控制协议(TCP)的TCP调谐时的重要问题案例。因为只有发送方在被要求停止传输,并等待到接收方回传的确认数据成功接收的消息前发送足够多的数据,协议才能达到最佳吞吐量。如果与带宽时延乘积相比发送的数据量不足,那么链路并没有保持在繁忙状态,从而说明该协议是使链路运行在传输峰值以下

21.3. 窗口扩大选项

窗口扩大选项使T C P的窗口定义从16 bit增加为32 bit。这并不是通过修改T C P首部来实现的,T C P首部仍然使用16 bit,而是通过定义一个选项实现对16 bit的扩大操作( s c a l i n go p e r a t i o n )来完成的。于是T C P在内部将实际的窗口大小维持为32 bit的值。

21.4. 时间戳选项

间戳选项使发送方在每个报文段中放置一个时间戳值。接收方在确认中返回这个数值,从而允许发送方为每一个收到的A C K计算RTT

  • 较大的窗口大小需要进行更好的RT T计算
  • Notes
  • Computer Network
  • Notes
[外设]Fokrere 64键盘组装记录
信安小知识-5
  1. 1. 1. 概述
    1. 1.1. 1.1. 端系统和中间系统
    2. 1.2. 1.2. TCP/IP的分层
    3. 1.3. 1.3. 封装
    4. 1.4. 1.4. 分用(Demultiplexing)
    5. 1.5. 1.5. 端口号
    6. 1.6. 1.6. 应用编程接口
  2. 2. 2. 链路层
    1. 2.1. 2.1. 作用
    2. 2.2. 2.2. 封装
    3. 2.3. 2.3. 回环接口
    4. 2.4. 2.4. 最大传输单元MTU
  3. 3. 3. IP:网际协议
    1. 3.1. 3.1. 特性
    2. 3.2. 3.2. IP首部
      1. 3.2.1. 3.2.1. 校验和
    3. 3.3. 3.3. IP路由器
      1. 3.3.1. 3.3.1. 路由表
    4. 3.4. 3.4. 子网寻址
      1. 3.4.1. 3.4.1. x类地址
    5. 3.5. 3.5. 子网掩码
    6. 3.6. 3.6. 特殊情况的IP地址
  4. 4. 4. ARP地址解析协议
    1. 4.1. 4.1. ARP高速缓存
    2. 4.2. 4.2. ARP的分组格式
    3. 4.3. 4.3. ARP代理
    4. 4.4. 4.4. 免费ARP
  5. 5. 5. ICMP:Internet控制报文协议
    1. 5.1. 5.1. 类型
    2. 5.2. 5.2. ICMP时间戳请求
    3. 5.3. 5.3. ICMP端口不可达差错
    4. 5.4. 5.4. ICMP不可达差错(需要分片)
  6. 6. 6. Ping程序
    1. 6.1. 6.1. IP记录路由选项
  7. 7. 7. IP选路
    1. 7.1. 7.1. 路由守护程序
    2. 7.2. 7.2. 选路原理
  8. 8. 8. UDP:用户数据报协议
    1. 8.1. 8.1. UDP检验和
      1. 8.1.1. 8.1.1. 伪首部
    2. 8.2. 8.2. IP分片
  9. 9. 9. UDP和ARP之间的交互作用
  10. 10. 10. 最大UDP数据报长
  11. 11. 11. 广播和多播
    1. 11.1. 11.1. 指向网络的广播
    2. 11.2. 11.2. 指向子网的广播
  12. 12. 12. DNS:域名系统
    1. 12.1. 12.1. DNS的报文格式
      1. 12.1.1. 12.1.1. DNS查询报文中的问题部分
      2. 12.1.2. 12.1.2. DNS响应报文中的资源记录部分
    2. 12.2. 12.2. 指针查询
    3. 12.3. 12.3. 资源记录
    4. 12.4. 12.4. TCP vs UDP
    5. 12.5. 12.5. 一个例子
      1. 12.5.1. 12.5.1. FQDN
  13. 13. 13. TCP:传输控制协议
    1. 13.1. 13.1. TCP的首部
  14. 14. 14. TCP连接的建立与终止
    1. 14.1. 14.1. 三次握手(three-way handshake)
      1. 14.1.1. 14.1.1. 半连接与全连接
    2. 14.2. 14.2. 连接终止协议(4次握手)
    3. 14.3. 14.3. 连接建立的超时
  15. 15. 15. 最大报文段长度
    1. 15.1. 15.1. TCP的半关闭
    2. 15.2. 15.2. TCP的状态变迁图
    3. 15.3. 15.3. 复位报文段
    4. 15.4. 15.4. 同时打开
    5. 15.5. 15.5. TCP 选项
    6. 15.6. 15.6. TCP服务器端口号
  16. 16. 16. TCP的交互数据流
    1. 16.1. 16.1. 窗口大小通告
  17. 17. 17. TCP的成块数据流
    1. 17.1. 17.1. 快的发送方和慢的接收方
    2. 17.2. 17.2. 滑动窗口
    3. 17.3. 17.3. 成块数据的吞吐量
      1. 17.3.1. 17.3.1. 带宽时延乘积
      2. 17.3.2. 17.3.2. 拥塞
    4. 17.4. 17.4. PUSH标志
    5. 17.5. 17.5. 慢启动
    6. 17.6. 17.6. 紧急方式
  18. 18. 18. TCP的超时与重传
    1. 18.1. 18.1. RTT估计器的计算
    2. 18.2. 18.2. 拥塞避免算法
    3. 18.3. 18.3. 快速重传与快速恢复算法
    4. 18.4. 18.4. ICMP的差错
    5. 18.5. 18.5. 重新分组
  19. 19. 19. TCP的坚持定时器
    1. 19.1. 19.1. 糊涂窗口综合症
  20. 20. 20. TCP的保活定时器
  21. 21. 21. TCP的未来和性能
    1. 21.1. 21.1. 路径MTU发现
    2. 21.2. 21.2. 长肥管道
    3. 21.3. 21.3. 窗口扩大选项
    4. 21.4. 21.4. 时间戳选项
© 2024 何决云 载入天数...